<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-7149001848285799067</id><updated>2011-11-27T16:19:36.267-08:00</updated><category term='wcf'/><category term='IDataErrorInfo wcf asp.net'/><category term='LINQ'/><category term='software architecture'/><category term='Tech-Ed 2008'/><category term='MVC'/><category term='MVC Framework'/><category term='ASP AJAX'/><category term='service orientated architecture'/><category term='domain driven design'/><category term='soa'/><category term='ASP'/><category term='WWF'/><category term='business capabilities'/><category term='ADO.NET Data Services'/><category term='economic crisis'/><category term='WPF'/><category term='Entity Framework'/><category term='Silverlight'/><category term='.NET'/><category term='MIX'/><title type='text'>Metal Lemon - making batteries from lifes lemons</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://metallemon.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7149001848285799067/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://metallemon.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Allan Rees</name><uri>http://www.blogger.com/profile/06676045582409198604</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://2.bp.blogspot.com/-LHkaQj0Csn4/TWTPZn7JlBI/AAAAAAAAACY/OUV2sbv2Z7Y/s220/IM040%25282%2529.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>22</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7149001848285799067.post-580955534966855605</id><published>2011-02-23T01:12:00.000-08:00</published><updated>2011-02-23T01:13:20.170-08:00</updated><title type='text'>WITS Architecture Forum</title><content type='html'>For those who are interested, the Architecture Forum meets tomorrow  night at Wits University East Campus from 18:00 to 20:00. This is an  excellent networking opportunity to meet others in your field and to  promote your brand&lt;br /&gt;&lt;br /&gt;If you wish to attend head on over to &lt;a href="http://jcse.org.za/events/architecture-forum-2011"&gt;JCSE&lt;/a&gt; and register, there is no cost.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7149001848285799067-580955534966855605?l=metallemon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://metallemon.blogspot.com/feeds/580955534966855605/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7149001848285799067&amp;postID=580955534966855605' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7149001848285799067/posts/default/580955534966855605'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7149001848285799067/posts/default/580955534966855605'/><link rel='alternate' type='text/html' href='http://metallemon.blogspot.com/2011/02/wits-architecture-forum.html' title='WITS Architecture Forum'/><author><name>Allan Rees</name><uri>http://www.blogger.com/profile/06676045582409198604</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://2.bp.blogspot.com/-LHkaQj0Csn4/TWTPZn7JlBI/AAAAAAAAACY/OUV2sbv2Z7Y/s220/IM040%25282%2529.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7149001848285799067.post-5029525248050040825</id><published>2010-11-10T20:37:00.000-08:00</published><updated>2010-11-10T20:38:25.094-08:00</updated><title type='text'>New Articles</title><content type='html'>&lt;p&gt;Here are some links to new articles I have written in the last couple of months:&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://hubpages.com/_1k9ore6as3b3m/hub/Building-Service-Orientated-Architecture"&gt;Building-Service-Orientated-Architecture &lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://hubpages.com/_1k9ore6as3b3m/hub/Why-your-Service-Orientated-Architecture-SOA-needs-to-be-like-a-VW-Beetle"&gt;Why-your-Service-Orientated-Architecture-SOA-needs-to-be-like-a-VW-Beetle&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://hubpages.com/_1k9ore6as3b3m/hub/soa-with-wcf"&gt;SOA Explained for your Boss&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://hubpages.com/_1k9ore6as3b3m/hub/SOA-Design-Pattern-WCF"&gt;SOA Design Pattern, Managers, Gateways and Engines&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://hubpages.com/_1k9ore6as3b3m/hub/Achieving-Non-Functional-Requirements-for-a-Service-Oriented-Software-Platform-Integrity"&gt;Achieving SOA Non-Functional Requirements, Integrity&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://hubpages.com/_1k9ore6as3b3m/hub/Achieving-Non-Functional-Requirements-for-a-Service-Oriented-Software-Platform-FlexibilityMaintainability"&gt;Achieving-Non-Functional-Requirements, Flexibility/Maintainability&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://hubpages.com/_1k9ore6as3b3m/hub/ASP-NET-MVC-Patterns%20"&gt;ASP-NET-MVC-Patterns &lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Enjoy&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7149001848285799067-5029525248050040825?l=metallemon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://metallemon.blogspot.com/feeds/5029525248050040825/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7149001848285799067&amp;postID=5029525248050040825' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7149001848285799067/posts/default/5029525248050040825'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7149001848285799067/posts/default/5029525248050040825'/><link rel='alternate' type='text/html' href='http://metallemon.blogspot.com/2010/11/new-articles.html' title='New Articles'/><author><name>Allan Rees</name><uri>http://www.blogger.com/profile/06676045582409198604</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://2.bp.blogspot.com/-LHkaQj0Csn4/TWTPZn7JlBI/AAAAAAAAACY/OUV2sbv2Z7Y/s220/IM040%25282%2529.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7149001848285799067.post-2595110661918178777</id><published>2010-07-29T05:48:00.000-07:00</published><updated>2010-07-29T05:51:18.162-07:00</updated><title type='text'>SOA Tenets and Principles</title><content type='html'>Below  are the rules to creating services, follow the rules and you will have a  painless journey, and as you will see all the good things that the  development community have discovered over the last eighty years all all  baked in, any developer worth their salt will recognize this a merely  the next evolution in development, the one that is allowing us to create  &lt;a href="http://hubpages.com/hub/Building-Service-Orientated-Architecture"&gt;applications&lt;/a&gt; that live in a distributed environment.&lt;br /&gt;&lt;a href="http://hubpages.com/hub/SOA-Tenets-and-Principles-with-WCF"&gt;&lt;br /&gt;&lt;/a&gt;&lt;a&gt;SOA Tenets and Principles&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7149001848285799067-2595110661918178777?l=metallemon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://metallemon.blogspot.com/feeds/2595110661918178777/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7149001848285799067&amp;postID=2595110661918178777' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7149001848285799067/posts/default/2595110661918178777'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7149001848285799067/posts/default/2595110661918178777'/><link rel='alternate' type='text/html' href='http://metallemon.blogspot.com/2010/07/soa-tenets-and-principles.html' title='SOA Tenets and Principles'/><author><name>Allan Rees</name><uri>http://www.blogger.com/profile/06676045582409198604</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://2.bp.blogspot.com/-LHkaQj0Csn4/TWTPZn7JlBI/AAAAAAAAACY/OUV2sbv2Z7Y/s220/IM040%25282%2529.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7149001848285799067.post-2366998207039510883</id><published>2010-07-23T10:43:00.000-07:00</published><updated>2010-07-23T10:48:16.383-07:00</updated><title type='text'>Building Service Orientated Architecture</title><content type='html'>Here is an &lt;a href="http://hubpages.com/hub/Building-Service-Orientated-Architecture"&gt;article &lt;/a&gt;I wrote to follow up the soa for executives article. This article moves a little deeper into defining what a SOA is and the differeences between Service Orientated Architecture and Service Orientated Application Design&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7149001848285799067-2366998207039510883?l=metallemon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://metallemon.blogspot.com/feeds/2366998207039510883/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7149001848285799067&amp;postID=2366998207039510883' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7149001848285799067/posts/default/2366998207039510883'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7149001848285799067/posts/default/2366998207039510883'/><link rel='alternate' type='text/html' href='http://metallemon.blogspot.com/2010/07/building-service-orientated.html' title='Building Service Orientated Architecture'/><author><name>Allan Rees</name><uri>http://www.blogger.com/profile/06676045582409198604</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://2.bp.blogspot.com/-LHkaQj0Csn4/TWTPZn7JlBI/AAAAAAAAACY/OUV2sbv2Z7Y/s220/IM040%25282%2529.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7149001848285799067.post-6213948309204982157</id><published>2010-07-19T21:31:00.000-07:00</published><updated>2010-07-19T21:34:11.416-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='business capabilities'/><category scheme='http://www.blogger.com/atom/ns#' term='service orientated architecture'/><category scheme='http://www.blogger.com/atom/ns#' term='soa'/><title type='text'>SOA explained for for business people</title><content type='html'>Here is a &lt;a href="http://hubpages.com/hub/soa-with-wcf"&gt;article&lt;/a&gt; i wrote that covers what SOA is without technical jargon, it is aimed at helping business executive understand what the propeller heads are taking about&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7149001848285799067-6213948309204982157?l=metallemon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://metallemon.blogspot.com/feeds/6213948309204982157/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7149001848285799067&amp;postID=6213948309204982157' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7149001848285799067/posts/default/6213948309204982157'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7149001848285799067/posts/default/6213948309204982157'/><link rel='alternate' type='text/html' href='http://metallemon.blogspot.com/2010/07/soa-explained-for-for-business-people.html' title='SOA explained for for business people'/><author><name>Allan Rees</name><uri>http://www.blogger.com/profile/06676045582409198604</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://2.bp.blogspot.com/-LHkaQj0Csn4/TWTPZn7JlBI/AAAAAAAAACY/OUV2sbv2Z7Y/s220/IM040%25282%2529.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7149001848285799067.post-8122586692489681116</id><published>2010-07-17T13:05:00.000-07:00</published><updated>2010-07-17T13:08:44.731-07:00</updated><title type='text'>Well done South Africa!</title><content type='html'>Well done South Africa in making such a success of the 2010 World Cup in South Africa, the eyes of the world have been opened to the potential of our country as a vacation destination.&lt;br /&gt;&lt;br /&gt;Here is a &lt;a href="http://hubpages.com/hub/Take-advantage-of-the-World-Cup-legacy-Visit-South-Africa-now"&gt;great article&lt;/a&gt; with some cool pictures about why now is the best time to plan a visit.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7149001848285799067-8122586692489681116?l=metallemon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://metallemon.blogspot.com/feeds/8122586692489681116/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7149001848285799067&amp;postID=8122586692489681116' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7149001848285799067/posts/default/8122586692489681116'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7149001848285799067/posts/default/8122586692489681116'/><link rel='alternate' type='text/html' href='http://metallemon.blogspot.com/2010/07/well-done-south-africa.html' title='Well done South Africa!'/><author><name>Allan Rees</name><uri>http://www.blogger.com/profile/06676045582409198604</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://2.bp.blogspot.com/-LHkaQj0Csn4/TWTPZn7JlBI/AAAAAAAAACY/OUV2sbv2Z7Y/s220/IM040%25282%2529.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7149001848285799067.post-5971774048176339818</id><published>2010-06-01T23:50:00.000-07:00</published><updated>2010-06-02T00:13:43.098-07:00</updated><title type='text'>Create WCF Proxies on the Fly</title><content type='html'>Here is one of the more useful classes i have used, it allows you to spin up a WCF proxy, and invoke any method from just the interface and a line of code.&lt;br /&gt;&lt;br /&gt;Usage:&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;ChannelFactoryHelper.InvokeServiceMethod&amp;lt;IRoutingTopics&amp;gt;(&lt;br /&gt;m =&amp;gt; m.Method1(instruction, data), &amp;quot;Portal&amp;quot;);&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Class:&lt;br /&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;    public static class ChannelFactoryHelper&lt;br /&gt;    {&lt;br /&gt;        /// &amp;lt;summary&amp;gt;&lt;br /&gt;        /// Creates the channel.&lt;br /&gt;        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;        /// &amp;lt;typeparam name=&amp;quot;T&amp;quot;&amp;gt;&amp;lt;/typeparam&amp;gt;&lt;br /&gt;        /// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;br /&gt;        private static T CreateChannel&amp;lt;T&amp;gt;(string endpoint) where T : class&lt;br /&gt;        {&lt;br /&gt;            string endpointConfigName = endpoint;&lt;br /&gt;            try&lt;br /&gt;            {&lt;br /&gt;                ChannelFactory&amp;lt;T&amp;gt; factory = new ChannelFactory&amp;lt;T&amp;gt;(endpointConfigName);&lt;br /&gt;                return factory.CreateChannel();&lt;br /&gt;            }&lt;br /&gt;            catch (Exception ex)&lt;br /&gt;            {&lt;br /&gt;                throw new Exception(string.Format(&amp;quot;Could not create proxy for endpoint configuration with name '{0}'&amp;quot;, endpointConfigName), ex);&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        /// &amp;lt;summary&amp;gt;&lt;br /&gt;        /// Invokes the service method.&lt;br /&gt;        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;        /// &amp;lt;typeparam name=&amp;quot;I&amp;quot;&amp;gt;&amp;lt;/typeparam&amp;gt;&lt;br /&gt;        /// &amp;lt;typeparam name=&amp;quot;R&amp;quot;&amp;gt;&amp;lt;/typeparam&amp;gt;&lt;br /&gt;        /// &amp;lt;param name=&amp;quot;source&amp;quot;&amp;gt;The source.&amp;lt;/param&amp;gt;&lt;br /&gt;        /// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;br /&gt;        public static R InvokeServiceMethod&amp;lt;I, R&amp;gt;(Func&amp;lt;I, R&amp;gt; source, string endpointConfigName)&lt;br /&gt;            where I : class&lt;br /&gt;        {&lt;br /&gt;            R returnValue;&lt;br /&gt;            returnValue = InvokeServiceMethod&amp;lt;I, R&amp;gt;(source, CreateChannel&amp;lt;I&amp;gt;(endpointConfigName));&lt;br /&gt;            return returnValue;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        /// &amp;lt;summary&amp;gt;&lt;br /&gt;        /// Invokes the service method.&lt;br /&gt;        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;        /// &amp;lt;typeparam name=&amp;quot;I&amp;quot;&amp;gt;&amp;lt;/typeparam&amp;gt;&lt;br /&gt;        /// &amp;lt;param name=&amp;quot;source&amp;quot;&amp;gt;The source.&amp;lt;/param&amp;gt;&lt;br /&gt;        public static void InvokeServiceMethod&amp;lt;I&amp;gt;(Action&amp;lt;I&amp;gt; source, string endpointConfigName)&lt;br /&gt;            where I : class&lt;br /&gt;        {&lt;br /&gt;            InvokeServiceMethod&amp;lt;I&amp;gt;(source, CreateChannel&amp;lt;I&amp;gt;(endpointConfigName));&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        /// &amp;lt;summary&amp;gt;&lt;br /&gt;        /// Invokes the service method.&lt;br /&gt;        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;        /// &amp;lt;typeparam name=&amp;quot;I&amp;quot;&amp;gt;Service Contract Interface.&amp;lt;/typeparam&amp;gt;&lt;br /&gt;        /// &amp;lt;param name=&amp;quot;source&amp;quot;&amp;gt;The source.&amp;lt;/param&amp;gt;&lt;br /&gt;        /// &amp;lt;param name=&amp;quot;proxy&amp;quot;&amp;gt;The proxy.&amp;lt;/param&amp;gt;&lt;br /&gt;        private static void InvokeServiceMethod&amp;lt;I&amp;gt;(Action&amp;lt;I&amp;gt; source, I proxy) where I : class&lt;br /&gt;        {&lt;br /&gt;            try&lt;br /&gt;            {&lt;br /&gt;                // Call the service method&lt;br /&gt;                source.Invoke(proxy);&lt;br /&gt;                // Make sure to close the proxy&lt;br /&gt;                (proxy as IClientChannel).Close();&lt;br /&gt;            }&lt;br /&gt;            catch&lt;br /&gt;            {&lt;br /&gt;                if (proxy != null)&lt;br /&gt;                {&lt;br /&gt;                    // If the proxy cannot close normally or an exception occurred, abort the proxy call&lt;br /&gt;                    (proxy as IClientChannel).Abort();&lt;br /&gt;                }&lt;br /&gt;                throw;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        /// &amp;lt;summary&amp;gt;&lt;br /&gt;        /// Invokes the service method.&lt;br /&gt;        /// &amp;lt;/summary&amp;gt;&lt;br /&gt;        /// &amp;lt;typeparam name=&amp;quot;I&amp;quot;&amp;gt;Service Contract Interface.&amp;lt;/typeparam&amp;gt;&lt;br /&gt;        /// &amp;lt;typeparam name=&amp;quot;R&amp;quot;&amp;gt;Return Type.&amp;lt;/typeparam&amp;gt;&lt;br /&gt;        /// &amp;lt;param name=&amp;quot;source&amp;quot;&amp;gt;The source.&amp;lt;/param&amp;gt;&lt;br /&gt;        /// &amp;lt;param name=&amp;quot;proxy&amp;quot;&amp;gt;The proxy.&amp;lt;/param&amp;gt;&lt;br /&gt;        /// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;br /&gt;        private static R InvokeServiceMethod&amp;lt;I, R&amp;gt;(Func&amp;lt;I, R&amp;gt; source, I proxy)&lt;br /&gt;            where I : class&lt;br /&gt;        {&lt;br /&gt;            R returnValue;&lt;br /&gt;            try&lt;br /&gt;            {&lt;br /&gt;                // Call the service method&lt;br /&gt;                returnValue = source.Invoke(proxy);&lt;br /&gt;                // Make sure to close the proxy&lt;br /&gt;                (proxy as IClientChannel).Close();&lt;br /&gt;            }&lt;br /&gt;            catch&lt;br /&gt;            {&lt;br /&gt;                if (proxy != null)&lt;br /&gt;                {&lt;br /&gt;                    // If the proxy cannot close normally or an exception occurred, abort the proxy call&lt;br /&gt;                    (proxy as IClientChannel).Abort();&lt;br /&gt;                }&lt;br /&gt;                throw;&lt;br /&gt;            }&lt;br /&gt;            return returnValue;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7149001848285799067-5971774048176339818?l=metallemon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://metallemon.blogspot.com/feeds/5971774048176339818/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7149001848285799067&amp;postID=5971774048176339818' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7149001848285799067/posts/default/5971774048176339818'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7149001848285799067/posts/default/5971774048176339818'/><link rel='alternate' type='text/html' href='http://metallemon.blogspot.com/2010/06/create-wcf-proxies-on-fly.html' title='Create WCF Proxies on the Fly'/><author><name>Allan Rees</name><uri>http://www.blogger.com/profile/06676045582409198604</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://2.bp.blogspot.com/-LHkaQj0Csn4/TWTPZn7JlBI/AAAAAAAAACY/OUV2sbv2Z7Y/s220/IM040%25282%2529.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7149001848285799067.post-7169435609297715239</id><published>2009-08-27T03:18:00.000-07:00</published><updated>2009-08-27T03:46:22.675-07:00</updated><title type='text'>Describing SOA</title><content type='html'>A colleague, Nigel Bakker, and I recently were asked to present a SOA training course, while finding content was easy, we battled to find a coherent definition of SOA that encompasses the enterprise elements of this paradigm as well as the application level element.&lt;br /&gt; &lt;br /&gt;We came up with the following:&lt;br /&gt;&lt;br /&gt;• Service Orientated Architecture (SOA) is an Enterprise Architecture Style&lt;br /&gt;• SOA is not a methodology it is an approach or mindset usually called a paradigm&lt;br /&gt;• SOA needs a firm foundation or the enterprise will fail as every piece of the SOA should contribute.&lt;br /&gt;• Service Orientated Application Design (SOAD) provides this foundation.&lt;br /&gt;• SOA is both a business and IT architecture approach, whilst SOAD is an application design approach aligned with and supporting SOA.&lt;br /&gt;&lt;br /&gt;A Thomas Erl  quote was useful &lt;br /&gt;“Service-orientation is a design paradigm comprised of a specific set of design principles. The application of these principles to the design of solution logic results in service-oriented solution logic. The most fundamental unit of service-oriented solution logic is the service.”&lt;br /&gt;The interesting point he makes is that the focus here is on “solution logic” which is exactly the scope that applies in building an application using “service orientation”, but can equally apply when building cross application services&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7149001848285799067-7169435609297715239?l=metallemon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://metallemon.blogspot.com/feeds/7169435609297715239/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7149001848285799067&amp;postID=7169435609297715239' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7149001848285799067/posts/default/7169435609297715239'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7149001848285799067/posts/default/7169435609297715239'/><link rel='alternate' type='text/html' href='http://metallemon.blogspot.com/2009/08/describing-soa.html' title='Describing SOA'/><author><name>Allan Rees</name><uri>http://www.blogger.com/profile/06676045582409198604</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://2.bp.blogspot.com/-LHkaQj0Csn4/TWTPZn7JlBI/AAAAAAAAACY/OUV2sbv2Z7Y/s220/IM040%25282%2529.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7149001848285799067.post-693825619787940817</id><published>2009-07-13T07:37:00.000-07:00</published><updated>2009-07-13T07:44:02.446-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='domain driven design'/><category scheme='http://www.blogger.com/atom/ns#' term='software architecture'/><category scheme='http://www.blogger.com/atom/ns#' term='wcf'/><category scheme='http://www.blogger.com/atom/ns#' term='soa'/><title type='text'>Building Service Orientated Applications using Windows Communication Foundation</title><content type='html'>&lt;span style="font-family:verdana;"&gt;SOA is a big business buzzword tossed into conversations at board meetings and at executive briefings. At this level, however, SOA really refers to connecting disparate systems across application, department, corporate, and even industry boundaries. This is the “Big” SOA concept, and this is the realm of the enterprise architect.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;&lt;br /&gt;This is the space of multimillion rand Service Bus applications, SAP systems and other wonderful products. But the fact still remains that a chain is a strong as its weakest link, if the systems hooked up to the top of the range Service Bus are not rock solid and can not be trusted to produce the correct results all the time, then the some of the true potential of the investment is lost. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;The path to “Big” SOA begins with a solid base and the ideas presented in this paper will provide you with the tools you need to achieve this. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;As businesses struggle to reap the rewards of their investment in a SOA approach, the importance of “Little” SOA is becoming lost in the marketing hype and scramble by vendors to sell you their version of service orientation. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;This paper offers practical advice for building Service Orientated Applications, using service oriented programming (SO) as an approach, that shows that every component can be a service while still maintaining the technical requirements that modern applications are required to exhibit and in most cases surpassing what many application frameworks offer to date.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;&lt;br /&gt;By building a solid “Little” SOA base, the platform is set at an enterprise level to realise the composition and reuse that is the value proposition of SOA, as without a “Little” SOA that is properly portioned, rock solid and composeable, attempts to realise more will fail. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;I hope to share some of the best practices, techniques and tools that I have learned from the last two years of applying WCF to the construction of service orientated applications and also to provide an insight to application architects on how to achieve the non functional specifications that many projects only play lip service to. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt; The paper can be found at:&lt;br /&gt;&lt;/span&gt;&lt;a href="http://www.box.net/shared/3oce5tvf8f"&gt;http://www.box.net/shared/3oce5tvf8f&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7149001848285799067-693825619787940817?l=metallemon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://metallemon.blogspot.com/feeds/693825619787940817/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7149001848285799067&amp;postID=693825619787940817' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7149001848285799067/posts/default/693825619787940817'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7149001848285799067/posts/default/693825619787940817'/><link rel='alternate' type='text/html' href='http://metallemon.blogspot.com/2009/07/building-service-orientated.html' title='Building Service Orientated Applications using Windows Communication Foundation'/><author><name>Allan Rees</name><uri>http://www.blogger.com/profile/06676045582409198604</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://2.bp.blogspot.com/-LHkaQj0Csn4/TWTPZn7JlBI/AAAAAAAAACY/OUV2sbv2Z7Y/s220/IM040%25282%2529.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7149001848285799067.post-91640601127674581</id><published>2009-03-25T05:53:00.000-07:00</published><updated>2009-03-25T06:19:28.059-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IDataErrorInfo wcf asp.net'/><title type='text'>WCF datacontracts and IDataErrorInfo</title><content type='html'>&lt;span style="font-family:verdana;"&gt;For those of you who are using WCF you not be aware of an interface that when implemented on your DataContracts allows you validate and reject invalid values.&lt;br /&gt;&lt;br /&gt;This can be leveraged in either ASP.NET or WPF by binding the UI controls to the DataContract to give you client side input validation.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;Its use is well documented in WPF , MCV framework, but iI could find nothing around using it on DataContracts. Of course you can only take advantage of this if you are WCF to WCF.&lt;br /&gt;&lt;br /&gt;This post is not about using IDataErrorInfo, but solving a particular prolem related to its use.&lt;br /&gt;&lt;br /&gt;Problem statement :&lt;br /&gt;&lt;br /&gt;When using IDataErrorInfo in an inheretence hierachy we run into problems when the property that needs to be validated is on the base class. The reason for this is that it is the subclass that is casted to IDataErrorInfo and then validates. We need a way to ensure that properties are also validated in the base class.&lt;br /&gt;&lt;br /&gt;As a first solution you’ll probably try something like;&lt;br /&gt;&lt;br /&gt;(base as IDataErrorInfo)[“PropertyToValidate”] ,but this does not work, as the base keyword is invalid in the above statement.&lt;br /&gt;&lt;br /&gt;A second solution would be to have a method on the base class and then have it validate its property, something like;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;string Validate(string columnName)&lt;br /&gt;{&lt;br /&gt;Return (this as &lt;span style="color:#3333ff;"&gt;IDataErrorInfo&lt;/span&gt;)[“PropertyToValidate”]&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;But this also fails as it will cast the subclass instance into IDataErrorInfo and then validate the subclass.&lt;br /&gt;&lt;br /&gt;So we have to come up with a solution that will ensure that the correct class’s properties be validated.&lt;br /&gt;&lt;br /&gt;Solution :&lt;br /&gt;&lt;br /&gt;The solution to this problem is actually a combination of the two proposed solutions above. We have the subclass call a method on the base to do the validation, but we also have the IDataErrorInfo methods call this same method to do the validation.&lt;br /&gt;&lt;br /&gt;This way even if our subclass does not implement IDataErrorInfo, but only want’s the base class to do the validation it will still work. See code example below.&lt;br /&gt;&lt;br /&gt;Base Class Definition:&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;public abstract class BaseClass : IDataErrorInfo&lt;br /&gt;{&lt;br /&gt;protected string m_Error;&lt;br /&gt;public string BaseClassProperty { get; set; }&lt;br /&gt;&lt;br /&gt;string IDataErrorInfo.Error &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;&lt;span style="color:#3333ff;"&gt;{&lt;br /&gt;get&lt;br /&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color:#3333ff;"&gt;return m_Error;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;string IDataErrorInfo.this[string columnName]&lt;br /&gt;{&lt;br /&gt;get&lt;br /&gt;{&lt;br /&gt;return Validate(columnName);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;protected internal string Validate(string columnName)&lt;br /&gt;{&lt;br /&gt;m_Error = String.Empty;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#3333ff;"&gt;if (columnName == "BaseClassProperty")&lt;br /&gt;{&lt;br /&gt;if (String.IsNullOrEmpty(BaseClassProperty))&lt;br /&gt;{&lt;br /&gt;m_Error = "BaseClassProperty not set.";&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;return m_Error;&lt;br /&gt;}&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;research by E. Landsberg&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7149001848285799067-91640601127674581?l=metallemon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://metallemon.blogspot.com/feeds/91640601127674581/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7149001848285799067&amp;postID=91640601127674581' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7149001848285799067/posts/default/91640601127674581'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7149001848285799067/posts/default/91640601127674581'/><link rel='alternate' type='text/html' href='http://metallemon.blogspot.com/2009/03/wcf-datacontracts-and-idataerrorinfo.html' title='WCF datacontracts and IDataErrorInfo'/><author><name>Allan Rees</name><uri>http://www.blogger.com/profile/06676045582409198604</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://2.bp.blogspot.com/-LHkaQj0Csn4/TWTPZn7JlBI/AAAAAAAAACY/OUV2sbv2Z7Y/s220/IM040%25282%2529.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7149001848285799067.post-4127699670476389094</id><published>2009-03-25T05:46:00.000-07:00</published><updated>2009-03-25T05:53:10.876-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='economic crisis'/><title type='text'>Using IT to survive the economic crisis</title><content type='html'>Sun Tzu wrote 2500 years ago in The Art of War: So it is said that if you know your enemies and know yourself, you will fight without danger in battles. &lt;br /&gt;&lt;br /&gt;So if a business knows is processes and has clear goals, and acknowledges that IT complexity and over specification is the enemy. Good things ensue. &lt;br /&gt;&lt;br /&gt;In this tough financial climate businesses that figure this out will find themselves reducing IT costs and squashing process complexity. These organisations will emerge from the financial downturn as the winners and will be positioned to quickly take advantage of new opportunities. i economic&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7149001848285799067-4127699670476389094?l=metallemon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://metallemon.blogspot.com/feeds/4127699670476389094/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7149001848285799067&amp;postID=4127699670476389094' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7149001848285799067/posts/default/4127699670476389094'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7149001848285799067/posts/default/4127699670476389094'/><link rel='alternate' type='text/html' href='http://metallemon.blogspot.com/2009/03/using-it-to-survive-economic-crisis.html' title='Using IT to survive the economic crisis'/><author><name>Allan Rees</name><uri>http://www.blogger.com/profile/06676045582409198604</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://2.bp.blogspot.com/-LHkaQj0Csn4/TWTPZn7JlBI/AAAAAAAAACY/OUV2sbv2Z7Y/s220/IM040%25282%2529.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7149001848285799067.post-4784370696378369508</id><published>2008-11-05T09:56:00.000-08:00</published><updated>2008-11-05T10:17:38.827-08:00</updated><title type='text'>Talking Agile  - Developer Manager's Breakfast Feedback</title><content type='html'>Just a quick update on this event to break up all the technical stuff.&lt;br /&gt;&lt;br /&gt;I attended the Talking Agile - Developer Manager's Breakfast hosted by Microsoft at Buitengeluk this morning. I must commend the organisers for putting a top class event together, the venue, food and facilities where excellent and well run.&lt;br /&gt;&lt;br /&gt;Of the speakers, well this was a mixed bag, Ernest Mnkandla, senior lecturer at the University of Johannesburg was disappointing, one was hoping that he would offer some insights into the agile process and present some new research on the topic, considering his academic pedigree.&lt;br /&gt;&lt;br /&gt;But his presentation turned into a lecture on the history of agile and a run down of the different flavours of agile, anyone having read Fowler and Ambler would have got very little out of his talk.&lt;br /&gt;&lt;br /&gt;Ahmed Salijee gave us a sneak preview of some agile enhancements to Team server coming in Visual Studio 2010, lots of report automation and labour saving wizardry. He continues to be a great speaker.&lt;br /&gt;&lt;br /&gt;The best talk of the day was Clifford De Wit, he gave a to the point, insightful talk on practically implementing agility into development teams,very process focused. He talks allot of sense and should publish his ideas formally as they represent a realistic and tried methodology that would be welcomed by many.&lt;br /&gt;&lt;br /&gt;As always there was some product spiel, but all in all a good session made worthwhile by Clifford and Ahmed, well done guys.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7149001848285799067-4784370696378369508?l=metallemon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://metallemon.blogspot.com/feeds/4784370696378369508/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7149001848285799067&amp;postID=4784370696378369508' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7149001848285799067/posts/default/4784370696378369508'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7149001848285799067/posts/default/4784370696378369508'/><link rel='alternate' type='text/html' href='http://metallemon.blogspot.com/2008/11/talking-agile-developer-managers.html' title='Talking Agile  - Developer Manager&apos;s Breakfast Feedback'/><author><name>Allan Rees</name><uri>http://www.blogger.com/profile/06676045582409198604</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://2.bp.blogspot.com/-LHkaQj0Csn4/TWTPZn7JlBI/AAAAAAAAACY/OUV2sbv2Z7Y/s220/IM040%25282%2529.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7149001848285799067.post-9052793759947031927</id><published>2008-10-14T02:42:00.000-07:00</published><updated>2008-10-14T02:51:34.790-07:00</updated><title type='text'>Part 2 - Designing the manager services</title><content type='html'>This stage is probably the most crucial as it will determine the emergent properties of your system; this is how your system behaves while in operation. Luckily there are a number of things that we can look at introducing so that we are steered down the right path. Some of these are:&lt;br /&gt;&lt;br /&gt;Decentralization: Use fully decentralized techniques to remove scaling bottlenecks and single points of failure.&lt;br /&gt;&lt;br /&gt;Asynchrony: The system makes progress under all circumstances.&lt;br /&gt;&lt;br /&gt;Autonomy: The system is designed such that individual components can make decisions based on local information.&lt;br /&gt;&lt;br /&gt;Local responsibility: Each individual component is responsible for achieving its consistency; this is never the burden of its peers.&lt;br /&gt;&lt;br /&gt;Controlled concurrency: Operations are designed such that no or limited concurrency control is required.&lt;br /&gt;&lt;br /&gt;Failure tolerant: The system considers the failure of components to be a normal mode of operation, and continues operation with no or minimal interruption.&lt;br /&gt;&lt;br /&gt;Controlled parallelism: Abstractions used in the system are of such granularity that parallelism can be used to improve performance and robustness of recovery or the introduction of new nodes.&lt;br /&gt;&lt;br /&gt;Decompose into small well-understood building blocks: Do not try to provide a single service that does everything for everyone, but instead build small components that can be used as building blocks for other services.&lt;br /&gt;&lt;br /&gt;Simplicity: The system should be made as simple as possible (but no simpler).&lt;br /&gt;&lt;br /&gt;Just a note at this stage, this type of architecture is for enterprise type systems, these are systems deployed within a organization that run the critical business process, things like data integrity and security are vital. There are many other styles of architecture and we can go into others in future posts. I have a strong bias towards WCF as I believe it to be the most productive framework for building this type of architecture.&lt;br /&gt;&lt;br /&gt;I recommend a closed architecture, where objects are allowed to call other objects only in their own tier or in the tier immediately under them. This encapsulates changes and eases the task of long-term maintenance.&lt;br /&gt;&lt;br /&gt;At the service boundary services need to support business capabilities, they should have an interface that can be thought of what a business does, and an interface that can the thought of how the business currently does that process. Key here is to keep the what, and the how decoupled from each other.&lt;br /&gt;&lt;br /&gt;Decoupling is the cornerstone of modern development, look at the modern patterns that we as an industry subscribe to, notice something? They all hold as a central tenant this notion of decoupling, the removing direct dependency on concrete objects and the enabler of this, dependency injection.&lt;br /&gt;&lt;br /&gt;Interfaces allow us to achieve the separation between what and how, so we should take things that are good and try using them elsewhere. Don’t get me wrong, coupling is not all bad we need to be coupled to thing in order for our application to be useful, the decision of choosing what to be coupled to becomes critical.&lt;br /&gt;&lt;br /&gt;I have observed that as soon as IT assets and components map well to the real world things work well and systems become really useful. I mentioned earlier that the top level services should map to business capabilities, what are these?&lt;br /&gt;&lt;br /&gt;A business capability is a particular ability or capacity that a business may possess or exchange to achieve a specific purpose or outcome. A capability describes what the business does (outcomes and service levels) that create value for customers; for example, pay employee or ship product. A business capability abstracts and encapsulates the people, process/procedures, technology, and information into the essential building blocks needed to facilitate performance improvement and redesign analysis.&lt;br /&gt;&lt;br /&gt;So to achieve stable, useful boundary services i.e. the ones exposed to the business people, we need to align them with business capabilities, one technique of achieving this is capability mapping and when applied correctly leads to process driven services.&lt;br /&gt;&lt;br /&gt;One of our top non functional is maintainability as the amount of time a system spends in development pales in comparison to the amount of time it will spend in maintenance. With that in mind, the granularity and size of our services should be thought about. Services with hundreds of methods will be un-maintainable while services with one method will be useless; the trick is to find the area of minimum cost between the cost of building a service and the cost of integrating it into the rest of the system (testing etc). Metrics tell us the magic number sits between five and eight methods per interface with twelve as an upper limit.&lt;br /&gt;&lt;br /&gt;As simplicity is number one on our list of non functional requirements I suggest that you make your services stateless, note stateless and state aware are not the same, by stateless I suggest that your services use a per call instantiation pattern unless you have a natural singleton of a really good reason not to.&lt;br /&gt;&lt;br /&gt;State is the sworn enemy of scalability, so by remaining per call your system will be able to scale indefinably.&lt;br /&gt;&lt;br /&gt;I term these services manager services, as I see them as managing a use case. This technique has saved my bacon in the past as I have had customers that withhold final payment claiming that the system delivered is not what they asked for. If your manger services map one to one to the use cases that they signed off on the process of system validation becomes simple and such customers do not have much of an argument.&lt;br /&gt;&lt;br /&gt;Recently I have started using workflow within these manager services to control the flow of logic graphically; I am a firm believer that the development industry is moving towards visual tools for development and future IDE ‘s will not require the developer to write as much code, but rather focus in design more. Workflows come with an overhead as learning this programming model requires a paradigm shift for developers. For simple managers I just code it up the regular way.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_PhiN8SQjHhA/SPRqxfmAOkI/AAAAAAAAABM/VlhvISOKuqs/s1600-h/Flow+of+data.jpg"&gt;&lt;img style="CURSOR: hand" id="BLOGGER_PHOTO_ID_5256944063575243330" border="0" alt="" src="http://4.bp.blogspot.com/_PhiN8SQjHhA/SPRqxfmAOkI/AAAAAAAAABM/VlhvISOKuqs/s320/Flow+of+data.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Managers service as the root for transactions I start my transaction scope here for operations that need transactability, operation design is key here, consider splitting interfaces into operations that require transactions and those that do not.&lt;br /&gt;&lt;br /&gt;What is cool is that the transaction is cross-process, so you programming model is so much simpler as any enlistable resource you touch is automatically add to the transaction, it even works with message queues. This enables you to program without worrying too much about this sort of thing as you can be sure that a rollback will occur across all the services enlisted if an exception is thrown. You can also consider including the client into your transaction if you have access to their machine and a requirement to do so.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_PhiN8SQjHhA/SPRqxcpIhGI/AAAAAAAAABU/yW4bm8AA_W8/s1600-h/TransactionScope.jpg"&gt;&lt;img style="CURSOR: hand" id="BLOGGER_PHOTO_ID_5256944062783063138" border="0" alt="" src="http://4.bp.blogspot.com/_PhiN8SQjHhA/SPRqxcpIhGI/AAAAAAAAABU/yW4bm8AA_W8/s320/TransactionScope.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;While I am mentioning exceptions, lets discuss this a little, services need to be fault tolerant and bear local responsibility, so that need to handle exceptions graceful, and not burden the client with the details, typically the client can do nothing about exceptions in the service anyway. Writing code to compensate for exceptions is a waste of time; people only cater for the easiest exceptions anyway and conveniently ignore the rest.&lt;br /&gt;&lt;br /&gt;There are two types of exceptions you need to know, business exceptions, are the ones you throw to notify users of a violation of business rules, and system exceptions, that the runtime throws, I say catch all system exceptions at the service boundary and log them off to a logging service thus shielding the client from the internal details of the service, throw all business exceptions as FaultException&lt;t&gt; and send back to the user as they can actually do something about it.&lt;br /&gt;&lt;br /&gt;Security has not been mentioned at this point, manager service cannot the burdened with the security requirements of any one application as you would typically like to reuse them in multiple applications, but security is more than just authorization and authentication, things like non-repudiation, confidentiality and integrity also play a part. I typically delegate authorization and authentication to an application specific façade layer and handle the rest at the manger service.&lt;br /&gt;&lt;br /&gt;By using X509 certificates I can ensure that every packet sent is encrypted and signed to prevent tapering. I can also ensure total end to end security unlike HTTPS. Security is the most intensive thing you can apply to your services, but in my opinion it is non-negotiable and should be by design and not an afterthought. Larger more dispersed and heterogeneous system will require a security token service (STS) look at things like Zermatt to assist you in building these.&lt;br /&gt;&lt;br /&gt;In closing we have aligned to tall the things we know make good services in a productive and achievable way, while delegating the heavy lifting to the framework and significantly reducing the amount of plumbing our developers need to write.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7149001848285799067-9052793759947031927?l=metallemon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://metallemon.blogspot.com/feeds/9052793759947031927/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7149001848285799067&amp;postID=9052793759947031927' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7149001848285799067/posts/default/9052793759947031927'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7149001848285799067/posts/default/9052793759947031927'/><link rel='alternate' type='text/html' href='http://metallemon.blogspot.com/2008/10/part-2-designing-manager-services.html' title='Part 2 - Designing the manager services'/><author><name>Allan Rees</name><uri>http://www.blogger.com/profile/06676045582409198604</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://2.bp.blogspot.com/-LHkaQj0Csn4/TWTPZn7JlBI/AAAAAAAAACY/OUV2sbv2Z7Y/s220/IM040%25282%2529.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_PhiN8SQjHhA/SPRqxfmAOkI/AAAAAAAAABM/VlhvISOKuqs/s72-c/Flow+of+data.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7149001848285799067.post-2010025171198605970</id><published>2008-10-10T01:33:00.000-07:00</published><updated>2008-10-10T02:21:11.076-07:00</updated><title type='text'>Formulating an enterprise architecture - Part 1</title><content type='html'>Tackling the task of formulating architecture for the construction of an enterprise scale system is a daunting one, the architect needs to draw upon multi disciplinary skills, one need to understand the technical details of the selection of technologies available to you, the options in process for constructing solutions as architectures do not all fit well into every process, and experience has taught the when process and architecture are aligned good things happen.&lt;br /&gt;&lt;br /&gt;The following post is part one of a series that will present my current thinking around the process of formulating such an architecture. I must confess that most of the ideas are not my own, but I have drawn on the experience and teaching of some of the world best architects to guide me in this. You will find ideas from Juval Lowy, Roger Sessions, Eric Evans, Michele Leroux Bustamante and Bill Poole.&lt;br /&gt;&lt;br /&gt;This first post attempts to present an overview, following posts will drill down into the component pieces and flesh out the detail.&lt;br /&gt;&lt;br /&gt;Application architecture results from the balancing of functional and the non-functional requirements applicable to the system. Non-functional requirements (restrictions and constraints) serve the purpose of limiting the number of potential solutions that will satisfy a set of functional requirements. Functional requirements are the behaviour that the owner of the system would like to emerge from the development process. All architectures exhibit emergent behaviour. If the emergent behaviours are not specified / managed in the form of non-functional requirements, the developers will choose them on behalf of business, leading to misalignment.&lt;br /&gt;&lt;br /&gt;Any new architecture can only result from the balancing of functional and non functional requirements with the forces of time, effort and cost. Every feature, requirement and every non functional requirement carries an associated cost in one of the forces mentioned above.&lt;br /&gt;&lt;br /&gt;Architecture is applied at two levels:&lt;br /&gt;&lt;br /&gt;·The application architecture addresses the software components of the actual application.&lt;br /&gt;·The systems architecture addresses the physical (hardware) and logical distribution of components across the network environment.&lt;br /&gt;&lt;br /&gt;Before any architecture can be formulated the following need to be considered:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Non Functional Requirements&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;• Simplicity&lt;br /&gt;• Maintainability&lt;br /&gt;• Data Integrity&lt;br /&gt;• Security&lt;br /&gt;• Reporting&lt;br /&gt;• Extensibility&lt;br /&gt;• Scalability&lt;br /&gt;• Deployment&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Complexity&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;The most common aspect shared by all failed systems is the failure to manage complexity. [Sessions] An architecture that fails to mange this aspect is also doomed to fail.&lt;br /&gt;In order to manage complexity we must first understand it, the complexity of a system is a function of the number of states in which a system can find it’s self.&lt;br /&gt;&lt;br /&gt;An example is a system (A) that has 3 dice, so the number of potential states is 63 or 216 potential states. Another system (B) with one dice has 61 or 6 potential states, if you where to make repeated guesses for both systems, you would be right, on average 36 times more often with B than you would be with system A. Because system B is less complex and easier to predict&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Partitioning&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;With this basic model of complexity, we can gain some insight into how complexity can be better organised.&lt;br /&gt;&lt;br /&gt;Consider another two systems (C) and (D) both have three six sided dice, but in C all the dice are together as before, but in D the dice are divided into three partitions. Let’s assume we can deal with the three partitions independently, in effect, three subsystems each like B. We know that the complexity of C is 216.&lt;br /&gt;&lt;br /&gt;The overall complexity of system D is the sum of the complexity of each partition (61 + 61 + 61) or 18. If you are not convinced of this imagine inspecting C and D for correctness in C you would need to examine 216 different states, checking each for correctness. In system D you would need to examine only 6 states in each partition.&lt;br /&gt;&lt;br /&gt;The results on how much more complex a non-partitioned system of 9 dice is compared to a partitioned system containing the same number of dice is startling. Ratio of 10,077,696 to 54, a lot!&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Process&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Just as any architecture will not work with any process, any process will not work with any architecture. Process and architecture are really different manifestations of the same thing.[Lowy]&lt;br /&gt;When formulating any architecture the following graph always remains true.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_PhiN8SQjHhA/SO8ZP6yEKSI/AAAAAAAAAAU/Dof6M3ZQTCU/s1600-h/archigraph.JPG"&gt;&lt;img style="MARGIN: 0px 10px 10px 0px; FLOAT: left; CURSOR: hand" id="BLOGGER_PHOTO_ID_5255447051432634658" border="0" alt="" src="http://1.bp.blogspot.com/_PhiN8SQjHhA/SO8ZP6yEKSI/AAAAAAAAAAU/Dof6M3ZQTCU/s320/archigraph.JPG" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The goal of any architecture is to find that area of minimum cost, the interaction of team members is isomorphic to the interaction between components. A good design (loose coupling, minimised interactions, and encapsulation) minimises the communication overhead both within the team and the system and any process adopted needs to support this.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Best Practice Design Principles&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Decentralization&lt;/strong&gt;: Use fully decentralized techniques to remove scaling bottlenecks and single points of failure.&lt;br /&gt;&lt;strong&gt;Asynchrony&lt;/strong&gt;: The system makes progress under all circumstances.&lt;br /&gt;&lt;strong&gt;Autonomy&lt;/strong&gt;: The system is designed such that individual components can make decisions based on local information.&lt;br /&gt;&lt;strong&gt;Local responsibility&lt;/strong&gt;: Each individual component is responsible for achieving its consistency; this is never the burden of its peers.&lt;br /&gt;&lt;strong&gt;Controlled concurrency&lt;/strong&gt;: Operations are designed such that no or limited concurrency control is required.&lt;br /&gt;&lt;strong&gt;Failure tolerant&lt;/strong&gt;: The system considers the failure of components to be a normal mode of operation, and continues operation with no or minimal interruption.&lt;br /&gt;&lt;strong&gt;Controlled parallelism&lt;/strong&gt;: Abstractions used in the system are of such granularity that parallelism can be used to improve performance and robustness of recovery or the introduction of new nodes.&lt;br /&gt;&lt;strong&gt;Decompose into small well-understood building blocks&lt;/strong&gt;: Do not try to provide a single service that does everything for everyone, but instead build small components that can be used as building blocks for other services.&lt;br /&gt;&lt;strong&gt;Simplicity&lt;/strong&gt;: The system should be made as simple as possible (but no simpler).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;strong&gt;Process - Staged Delivery&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;Process suggested for this development is one of staged delivery as defined in the diagram below.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_PhiN8SQjHhA/SO8bVvd5QmI/AAAAAAAAAA0/1PPJrd6d7Zg/s1600-h/sd.JPG"&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://3.bp.blogspot.com/_PhiN8SQjHhA/SO8cAQj0jcI/AAAAAAAAAA8/VAmtxnpCl44/s1600-h/sd.JPG"&gt;&lt;img style="MARGIN: 0px 10px 10px 0px; FLOAT: left; CURSOR: hand" id="BLOGGER_PHOTO_ID_5255450080935448002" border="0" alt="" src="http://3.bp.blogspot.com/_PhiN8SQjHhA/SO8cAQj0jcI/AAAAAAAAAA8/VAmtxnpCl44/s320/sd.JPG" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This is a very defensive approach as you are able to exit the process at anytime and release what you have or move onto the next stage. We are not going to try to deliver all the requirements at day one as requirements will change during the course of the project. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;The axiom is that at any moment in time we have a releasable system; releases may internal type releases or as time progresses and features become apparent, they will be releases to customer. This approach reduces risk as if at the point of release for whatever reason the project is out of time, money etc, what you have may be good enough. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;It also facilitates a clear display of progress throughout the development process and builds confidence between development team and customer. Process advocates constant integration with daily builds and tests (smoke tests).&lt;br /&gt;&lt;br /&gt;Each component of the system follows a life cycle in order to ensure quality at a service/component level. This is followed by the developer of the component/service.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_PhiN8SQjHhA/SO8ZP1rZo7I/AAAAAAAAAAc/_ozAFjDpZ-I/s1600-h/cp.JPG"&gt;&lt;/a&gt;&lt;a href="http://2.bp.blogspot.com/_PhiN8SQjHhA/SO8ZP1rZo7I/AAAAAAAAAAc/_ozAFjDpZ-I/s1600-h/cp.JPG"&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://2.bp.blogspot.com/_PhiN8SQjHhA/SO8bVf5vs6I/AAAAAAAAAAs/8OAQxB1mLQo/s1600-h/cp.JPG"&gt;&lt;img style="MARGIN: 0px 10px 10px 0px; WIDTH: 320px; FLOAT: left; HEIGHT: 227px; CURSOR: hand" id="BLOGGER_PHOTO_ID_5255449346319561634" border="0" alt="" src="http://2.bp.blogspot.com/_PhiN8SQjHhA/SO8bVf5vs6I/AAAAAAAAAAs/8OAQxB1mLQo/s320/cp.JPG" width="595" height="227" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;strong&gt;Service Governance&lt;/strong&gt;&lt;/div&gt;&lt;strong&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/div&gt;It would be unprofessional to deploy a distributed system with no means of managing the operational assets deployed. To this end we propose to use service virtualisation to facilitate this process.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The Managed Services Engine (MSE) is one approach to facilitating Enterprise SOA through service virtualization. Built upon the Windows Communication Foundation (WCF) and the Microsoft Server Platform, the MSE was developed by Microsoft Services as we helped customers address the challenges of SOA in the enterprise.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The MSE fully enables service virtualization through a Service Repository, which helps organizations deploy services faster, coordinate change management, and maximize the reuse of various service elements. In doing so, the MSE provides the ability to support versioning, abstraction, management, routing, and runtime policy enforcement for Services&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;strong&gt;Proposed Architecture&lt;/strong&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/div&gt;&lt;img style="TEXT-ALIGN: center; MARGIN: 0px auto 10px; DISPLAY: block; CURSOR: hand" id="BLOGGER_PHOTO_ID_5255451287997569218" border="0" alt="" src="http://2.bp.blogspot.com/_PhiN8SQjHhA/SO8dGhN22MI/AAAAAAAAABE/CckKcFQoO3A/s320/Achitecture.jpg" /&gt;In the next post i will dive deeper into concepts that relate to the service layers and the concept of fortresses.&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/div&gt;&lt;a href="http://2.bp.blogspot.com/_PhiN8SQjHhA/SO8ZP1rZo7I/AAAAAAAAAAc/_ozAFjDpZ-I/s1600-h/cp.JPG"&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7149001848285799067-2010025171198605970?l=metallemon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://metallemon.blogspot.com/feeds/2010025171198605970/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7149001848285799067&amp;postID=2010025171198605970' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7149001848285799067/posts/default/2010025171198605970'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7149001848285799067/posts/default/2010025171198605970'/><link rel='alternate' type='text/html' href='http://metallemon.blogspot.com/2008/10/tackling-task-of-formulating.html' title='Formulating an enterprise architecture - Part 1'/><author><name>Allan Rees</name><uri>http://www.blogger.com/profile/06676045582409198604</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://2.bp.blogspot.com/-LHkaQj0Csn4/TWTPZn7JlBI/AAAAAAAAACY/OUV2sbv2Z7Y/s220/IM040%25282%2529.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_PhiN8SQjHhA/SO8ZP6yEKSI/AAAAAAAAAAU/Dof6M3ZQTCU/s72-c/archigraph.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7149001848285799067.post-7280087832874708089</id><published>2008-09-11T01:47:00.000-07:00</published><updated>2008-09-11T23:45:17.968-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software architecture'/><category scheme='http://www.blogger.com/atom/ns#' term='wcf'/><title type='text'>Design Principles</title><content type='html'>I am currently involved in the design phase of a project for a client, and have been thinking a lot about design principles, the sort of things that apply to all technologies and projects equally.&lt;br /&gt;&lt;br /&gt;Readers of the blog will know that I have strong ideas on design and architectural form, but I felt a sense of validation when I came across a set of design principles that Amazon uses in the formulation of their elastic cloud technology stack.&lt;br /&gt;&lt;br /&gt;The principles here map almost one to one to those which I hold and apply daily to my projects and architectures, these include:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Decentralization&lt;/strong&gt;: Use fully decentralized techniques to remove scaling bottlenecks and single points of failure.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Asynchrony&lt;/strong&gt;: The system makes progress under all circumstances.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Autonomy&lt;/strong&gt;: The system is designed such that individual components can make decisions based on local information.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Local responsibility&lt;/strong&gt;: Each individual component is responsible for achieving its consistency; this is never the burden of its peers.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Controlled concurrency&lt;/strong&gt;: Operations are designed such that no or limited concurrency control is required.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Failure tolerant&lt;/strong&gt;: The system considers the failure of components to be a normal mode of operation, and continues operation with no or minimal interruption.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Controlled parallelism&lt;/strong&gt;: Abstractions used in the system are of such granularity that parallelism can be used to improve performance and robustness of recovery or the introduction of new nodes.&lt;br /&gt;Decompose into small well-understood building blocks: Do not try to provide a single service that does everything for everyone, but instead build small components that can be used as building blocks for other services.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Symmetry&lt;/strong&gt;: Nodes in the system are identical in terms of functionality, and require no or minimal node-specific configuration to function. &lt;/li&gt;&lt;li&gt;&lt;strong&gt;Simplicity&lt;/strong&gt;: The system should be made as simple as possible (but no simpler). &lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Symmetry I perhaps use a bit differently, I apply it to the design of components, where by one component although different in function follows the same structure and layout of the others, so every bit of the system is symmetric to the others with regards to standards and layout.&lt;br /&gt;Follow these, and good things will follow I promise!&lt;br /&gt;&lt;br /&gt;I believe that process and architecture are different aspects of the same thing, so by aligning these principles with an architecture and process that support them you are putting blocks into place that will lead to success.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7149001848285799067-7280087832874708089?l=metallemon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://metallemon.blogspot.com/feeds/7280087832874708089/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7149001848285799067&amp;postID=7280087832874708089' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7149001848285799067/posts/default/7280087832874708089'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7149001848285799067/posts/default/7280087832874708089'/><link rel='alternate' type='text/html' href='http://metallemon.blogspot.com/2008/09/design-principles.html' title='Design Principles'/><author><name>Allan Rees</name><uri>http://www.blogger.com/profile/06676045582409198604</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://2.bp.blogspot.com/-LHkaQj0Csn4/TWTPZn7JlBI/AAAAAAAAACY/OUV2sbv2Z7Y/s220/IM040%25282%2529.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7149001848285799067.post-8477985074894118927</id><published>2008-08-25T02:13:00.000-07:00</published><updated>2008-08-25T02:16:03.107-07:00</updated><title type='text'>Elastic cloud, S+S, how can I take advantage?</title><content type='html'>Admittedly I was also a bit confused when I first heard the term Software + Services (S+S); I just presumed that it was a mispronunciation of Software as a Service.&lt;br /&gt;&lt;br /&gt;Let me sum up my understanding of this term and what it means to architects, IT managers and developers:&lt;br /&gt;&lt;br /&gt;S+S is an architectural style that seeks to move IT services and infrastructure out of the enterprise and into the cloud.&lt;br /&gt;&lt;br /&gt;We all know that services are a good thing, and if designed correctly i.e. process centric based on autonomous business capabilities with a decentralized data model, they can be a tremendous asset to an organization.&lt;br /&gt;&lt;br /&gt;Which is great if you have servers, networks, VPN, etc, but what if you have a really good idea, but what to keep costs down, or if you are a CIO looking to reduce costs?&lt;br /&gt;&lt;br /&gt;Enter S+S and the concept of federation, the idea io this is closely tied up with the trend we are seeing in businesses pushed by globalization and competitive forces, the classic, linear supply chain has evolved into a complex value network of partners participating in a common business.&lt;br /&gt;&lt;br /&gt;Federation aligns nicely with this trend and clever businesses will be looking at outsourcing their non-core business capabilities. What are these? Think of things like database management, identity management, hosting of their internal and client facing applications, SMS and cellular communication applications, this is endless and growing as more service providers add more services to the domain.&lt;br /&gt;&lt;br /&gt;And for many businesses this really makes sense, rather than a large capital expenditure on hardware, and maintaining a staff of potential substandard and expensive IT resources, you move your expenditure to an operational one and get the support of some of the best professionals in the world as well as access to some of the most advanced data centers currently in existence.&lt;br /&gt;&lt;br /&gt;The ability to only pay for what you use is a great opportunity for business to become more innovative as the cost of failure is much less. It also lowers the entry criteria for small business as they can offer enterprise like applications and infrastructure at fractions of the normal cost.&lt;br /&gt;&lt;br /&gt;Leaders in the S+S space are Google and Amazon, Amazon Web Services offering file storage, database, connectivity and an application hosting engine see &lt;a href="http://www.amazon.com/AWS-home-page-Money/b?ie=UTF8&amp;amp;node=3435361"&gt;http://www.amazon.com/AWS-home-page-Money/b?ie=UTF8&amp;amp;node=3435361&lt;/a&gt; and Google with application hosting see &lt;a href="http://code.google.com/appengine/"&gt;http://code.google.com/appengine/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;As part of their future strategy Microsoft have committed to getting into this space in a big way, projects Red-dog and Zurich promise to bring Microsoft server platform into the cloud, and combined with the current and future offerings of the Live platform will provide some phenomenal opportunities to business in the near future.&lt;br /&gt;&lt;br /&gt;You can go have an early look at SQL Server Data Services which are in a preliminary release format at &lt;a href="http://msdn.microsoft.com/en-us/library/cc512402.aspx"&gt;http://msdn.microsoft.com/en-us/library/cc512402.aspx&lt;/a&gt;.&lt;br /&gt;BizTalk connectivity services currently allows disparate networks to communicate without any additional hardware, Live Id offers to remove security woes and the grand plan of Project Oslo seeks to deliver it all up as a cohesive development and administration platform.&lt;br /&gt;&lt;br /&gt;British Telecom has a fantastic S+S API out in the form of the WEB21C SDK which integrates SMS, cellular and telephony into applications easily, see &lt;a href="http://web21c.bt.com/services"&gt;http://web21c.bt.com/services&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;These are exiting times and I intend to embrace the Zeitgeist, I believe that S+S represents the way forward for small to medium enterprises, as well as a great vehicle for IT entrepreneurs.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7149001848285799067-8477985074894118927?l=metallemon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://metallemon.blogspot.com/feeds/8477985074894118927/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7149001848285799067&amp;postID=8477985074894118927' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7149001848285799067/posts/default/8477985074894118927'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7149001848285799067/posts/default/8477985074894118927'/><link rel='alternate' type='text/html' href='http://metallemon.blogspot.com/2008/08/elastic-cloud-ss-how-can-i-take.html' title='Elastic cloud, S+S, how can I take advantage?'/><author><name>Allan Rees</name><uri>http://www.blogger.com/profile/06676045582409198604</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://2.bp.blogspot.com/-LHkaQj0Csn4/TWTPZn7JlBI/AAAAAAAAACY/OUV2sbv2Z7Y/s220/IM040%25282%2529.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7149001848285799067.post-2356056024249521076</id><published>2008-08-01T06:49:00.000-07:00</published><updated>2008-08-01T07:12:23.098-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software architecture'/><category scheme='http://www.blogger.com/atom/ns#' term='LINQ'/><category scheme='http://www.blogger.com/atom/ns#' term='Tech-Ed 2008'/><category scheme='http://www.blogger.com/atom/ns#' term='soa'/><title type='text'>Tech-Ed Durban 2008</title><content type='html'>I am off to Tech-Ed on Sunday, and this year I am following a mainly SOA track with a bit of dev thrown in.&lt;br /&gt;&lt;br /&gt;Ron Jacobs’s sessions on WCF and WWF promise to be great, I have seen his sessions from Barcelona, and have been an avid Arcast.TV watcher/listener for years, so it will be great to see the man in person.&lt;br /&gt;&lt;br /&gt;Speakers like Steve Riley and Shy Cohen also have some great sessions that I will not be missing.&lt;br /&gt;&lt;br /&gt;It will also be interesting to see how the speakers handle questions around the Entity Framework and LINQ to SQL, as there will be some of South Africa’s largest Development shops present and many of the guys there have been using these products in the wild and will have a ton of questions.&lt;br /&gt;&lt;br /&gt;Good to see some top South African speakers like Hilton Giesenow and Ayal Rosenberg I always enjoy their sessions.&lt;br /&gt;&lt;br /&gt;Please feel free to look me up at the conference and have a chat, looking forward to seeing you all there.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7149001848285799067-2356056024249521076?l=metallemon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://metallemon.blogspot.com/feeds/2356056024249521076/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7149001848285799067&amp;postID=2356056024249521076' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7149001848285799067/posts/default/2356056024249521076'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7149001848285799067/posts/default/2356056024249521076'/><link rel='alternate' type='text/html' href='http://metallemon.blogspot.com/2008/08/tech-ed-durban-2008.html' title='Tech-Ed Durban 2008'/><author><name>Allan Rees</name><uri>http://www.blogger.com/profile/06676045582409198604</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://2.bp.blogspot.com/-LHkaQj0Csn4/TWTPZn7JlBI/AAAAAAAAACY/OUV2sbv2Z7Y/s220/IM040%25282%2529.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7149001848285799067.post-5993753426071175732</id><published>2008-07-28T01:19:00.000-07:00</published><updated>2008-07-28T02:46:44.019-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software architecture'/><category scheme='http://www.blogger.com/atom/ns#' term='wcf'/><category scheme='http://www.blogger.com/atom/ns#' term='soa'/><title type='text'>SOA and Anemic Domains</title><content type='html'>After a conversation with a work college of mine I was amazed to find that many people have not made the mind shift into a &lt;span id="SPELLING_ERROR_0" class="blsp-spelling-error"&gt;SOA&lt;/span&gt; way of thinking.&lt;br /&gt;&lt;br /&gt;Most are in the 80’s with a pure &lt;span id="SPELLING_ERROR_1" class="blsp-spelling-error"&gt;OO&lt;/span&gt; paradigm; it’s a brave new world people, &lt;span id="SPELLING_ERROR_2" class="blsp-spelling-error"&gt;OO&lt;/span&gt; and its promise of reuse failed, no one ever reused pure business objects as is, ever.&lt;br /&gt;&lt;br /&gt;The unit of reuse has moved from sharing code to delegation of functionality, the artifact of reuse has shifted from the object to the service. Don’t talk about sending objects around, rather keep the objects where they belong and send messages asking a service to perform actions on them.&lt;br /&gt;&lt;br /&gt;They shout out, “but you have an Anemic Domain, it’s an anti pattern so you must be wrong”.&lt;br /&gt;&lt;br /&gt;Are they suggesting distributed systems that pass around "real" objects, behaviour and all? You should cry out in terror at the thought of using such a system in production.&lt;br /&gt;&lt;br /&gt;For an &lt;span id="SPELLING_ERROR_3" class="blsp-spelling-error"&gt;OO&lt;/span&gt; purist the domain model is the most important part, but for the enterprise the database is far more important, seen by the fact that many databases far outlive the applications built to access them.&lt;br /&gt;&lt;br /&gt; In &lt;span id="SPELLING_ERROR_4" class="blsp-spelling-error"&gt;SOA&lt;/span&gt; land your &lt;span id="SPELLING_ERROR_5" class="blsp-spelling-error"&gt;OO&lt;/span&gt; business logic is not the only business logic involved here, your services are part of a large interacting web of autonomous services, some wrapping legacy systems, is their business logic any less important.&lt;br /&gt;&lt;br /&gt;I say design your services right, services that are self contained, process/capability driven, have &lt;span id="SPELLING_ERROR_6" class="blsp-spelling-error"&gt;de&lt;/span&gt;-centralised data and which communicate via well defined messages will lead to deliverable architectures, nobody will care how elegant your business layer is if you never get it done on time.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7149001848285799067-5993753426071175732?l=metallemon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://metallemon.blogspot.com/feeds/5993753426071175732/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7149001848285799067&amp;postID=5993753426071175732' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7149001848285799067/posts/default/5993753426071175732'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7149001848285799067/posts/default/5993753426071175732'/><link rel='alternate' type='text/html' href='http://metallemon.blogspot.com/2008/07/soa-and-anemic-domains.html' title='SOA and Anemic Domains'/><author><name>Allan Rees</name><uri>http://www.blogger.com/profile/06676045582409198604</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://2.bp.blogspot.com/-LHkaQj0Csn4/TWTPZn7JlBI/AAAAAAAAACY/OUV2sbv2Z7Y/s220/IM040%25282%2529.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7149001848285799067.post-1367038440912696447</id><published>2008-07-11T07:21:00.000-07:00</published><updated>2008-07-11T07:28:32.420-07:00</updated><title type='text'>What is maintenance?</title><content type='html'>I have been doing some work analysing some legacy systems, some old some brand new, yes it is possible to write a brand new legacy system!&lt;br /&gt;&lt;br /&gt;I thought it would be good to define what maintenance is and what can be done to make it a less painful exercise down the road.&lt;br /&gt;&lt;br /&gt;After a product has been released, the maintenance phase keeps the software up to date with environment changes and changing user requirements.&lt;br /&gt;&lt;br /&gt;The earlier phases should be done correctly so that the product is easily maintainable. The design phase should plan the structure in a way that can be easily altered. Similarly, the implementation phase should create code that can be easily read, understood, and changed.&lt;br /&gt;&lt;br /&gt;Maintenance can only happen efficiently if the earlier phases are done properly. There are three major problems that can slow down the maintenance process: unstructured code, maintenance programmers having insufficient knowledge of the system and documentation being absent, out of date, or at best insufficient.&lt;br /&gt;&lt;br /&gt;The success of the maintenance phase relies on these problems being fixed earlier in the life cycle.&lt;br /&gt;Maintenance consists of four parts.&lt;br /&gt;&lt;br /&gt;Corrective maintenance deals with fixing bugs in the code. Adaptive maintenance deals with adapting the software to new environments&lt;/span&gt;. Perfective maintenance deals with updating the software according to changes in user requirements.&lt;br /&gt;&lt;br /&gt;Finally, preventive maintenance deals with updating documentation and making the software more maintainable.&lt;br /&gt;All changes to the system can be characterized by these four types of maintenance. Corrective maintenance is ‘traditional maintenance’ while the other types are considered as ‘software evolution.’&lt;br /&gt;&lt;br /&gt;As software systems age, it becomes increasingly difficult to keep them ‘up and running’ without maintenance.&lt;br /&gt;There is direct financial cost of not maintaining software systems, and in fact, a substantial proportion of the resources expended within the Information Technology industry go towards the maintenance of software systems.&lt;br /&gt;In order to increase the maintainability of software, we need to know what characteristics of a product affect its maintainability.&lt;br /&gt;&lt;br /&gt;There has been a great deal of speculation about what makes a software system more difficult to maintain. There are some program characteristics that are found to affect a product’s maintainability&lt;br /&gt;&lt;br /&gt;Factors include system size, system age, number of input/output data items, application type, programming language, and the degree of structure.&lt;br /&gt;Larger systems require more maintenance effort than do smaller systems, because there is a greater learning curve associated with larger systems, and larger systems are more complex in terms of the variety of functions they perform.&lt;br /&gt;&lt;br /&gt;Older systems require more maintenance effort than do younger systems, because software systems tend to grow larger with age, become less organized with changes, and become less understandable due to staff turnover.&lt;br /&gt;The factors that decrease maintenance effort can be summarised into the list below:&lt;br /&gt;· Use of structured techniques&lt;br /&gt;· Use of modern software&lt;br /&gt;· Use of automated tools&lt;br /&gt;· Use of data-base techniques&lt;br /&gt;· Good data administration&lt;br /&gt;· Experienced maintainers.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7149001848285799067-1367038440912696447?l=metallemon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://metallemon.blogspot.com/feeds/1367038440912696447/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7149001848285799067&amp;postID=1367038440912696447' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7149001848285799067/posts/default/1367038440912696447'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7149001848285799067/posts/default/1367038440912696447'/><link rel='alternate' type='text/html' href='http://metallemon.blogspot.com/2008/07/what-is-maintenance.html' title='What is maintenance?'/><author><name>Allan Rees</name><uri>http://www.blogger.com/profile/06676045582409198604</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://2.bp.blogspot.com/-LHkaQj0Csn4/TWTPZn7JlBI/AAAAAAAAACY/OUV2sbv2Z7Y/s220/IM040%25282%2529.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7149001848285799067.post-3550648369624386758</id><published>2008-06-27T05:39:00.000-07:00</published><updated>2008-08-25T02:24:59.388-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WPF'/><category scheme='http://www.blogger.com/atom/ns#' term='MVC Framework'/><category scheme='http://www.blogger.com/atom/ns#' term='WWF'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight'/><category scheme='http://www.blogger.com/atom/ns#' term='Entity Framework'/><category scheme='http://www.blogger.com/atom/ns#' term='wcf'/><category scheme='http://www.blogger.com/atom/ns#' term='LINQ'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP AJAX'/><category scheme='http://www.blogger.com/atom/ns#' term='ADO.NET Data Services'/><title type='text'>Non Functional requirements driving technology choice</title><content type='html'>With the slue of new technologies out of Microsoft over the past 2 years,&lt;br /&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;WCF&lt;/span&gt;, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;WWF&lt;/span&gt;, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;WPF&lt;/span&gt;, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;Silverlight&lt;/span&gt;, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;LINQ&lt;/span&gt;, Entity Framework, ADO.NET Data Services, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;MVC&lt;/span&gt; Framework, ASP AJAX etc... It is becoming increasingly confusing for developers to figure out what technologies to use, and how and where to apply them.&lt;br /&gt;&lt;br /&gt;The danger facing many new projects is to fall into the trap of using a technology because it is new, rather than a good fit to the requirements of the problem at hand.&lt;br /&gt;&lt;br /&gt;I always start with the non functional requirements before making any decision about the implementation technology.&lt;br /&gt;&lt;br /&gt;Application architecture results from the balancing of functional and the non-functional requirements applicable to the system. Non-functional requirements (restrictions and constraints) serve the purpose of limiting the number of potential solutions that will satisfy a set of functional requirements.&lt;br /&gt;&lt;br /&gt;Functional requirements are the behaviour that the owner of the system would like to emerge from the development process. All architectures exhibit emergent behaviour. If the emergent behaviours are not specified / managed in the form of non-functional requirements, the developers will choose them on behalf of business, leading to misalignment.&lt;br /&gt;&lt;br /&gt;Architecture is applied at two levels:&lt;br /&gt;·The application architecture addresses the software components of the actual application.&lt;br /&gt;·The systems architecture addresses the physical (hardware) and logical distribution of components across the network environment.&lt;br /&gt;&lt;br /&gt;The non-functional aspects that I usually consider when formulating architecture&lt;br /&gt;&lt;br /&gt;Simplicity - number one non functional&lt;br /&gt;&lt;br /&gt;Security – this requirement in my opinion is not an option, the five pillars of Authentication, Authorisation, Integrity, Confidentiality, and Non-repudiation need to be catered for in any application you design.&lt;br /&gt;&lt;br /&gt;Performance – here I am looking at things like number of online transactions, batch runs and if applicable the throughput from a users perspective. The last one is quite important as to a user of any system with a front end, this is all that matters, this requirement often allows you to factor the system to cater for the different expectations that will be imposed in the system by its users.&lt;br /&gt;&lt;br /&gt;Maintainability - The ease with which code can be understood and changed, the aspect of maintainability should be pervasive throughout any architecture you design, any item must be created with the eye towards maintaining it.&lt;br /&gt;&lt;br /&gt;Integrity - Ability to detect and manage invalid data coming in to system and the imposition of complete transactions or rollbacks.&lt;br /&gt;&lt;br /&gt;Extensibility - Ease with which new features can be added to the code, not the same as maintainability, things like composite applications work really well here.&lt;br /&gt;&lt;br /&gt;Flexibility - Ease with which the software can be deployed in different environments.&lt;br /&gt;&lt;br /&gt;Scalability - Ability of the system to grow with the organisation without code changes, increase in number of users, increase in number of transactions.&lt;br /&gt;&lt;br /&gt;As you would have noticed, many of these requirements are in direct opposition of each other; in conjunction to this there is a price to pay for achieving any of them fully.&lt;br /&gt;&lt;br /&gt;As a software architect the responsibility is on you to attempt to balance these conflicting forces and find the best alignment to fit the system specifications.&lt;br /&gt;It is also your task to align technology risks with the appetite for risk of the organisation.&lt;br /&gt;&lt;br /&gt;By evaluating the system against these non functional requirements first I find that my options of implementation technology usually get reduced into a manageable set.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7149001848285799067-3550648369624386758?l=metallemon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://metallemon.blogspot.com/feeds/3550648369624386758/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7149001848285799067&amp;postID=3550648369624386758' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7149001848285799067/posts/default/3550648369624386758'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7149001848285799067/posts/default/3550648369624386758'/><link rel='alternate' type='text/html' href='http://metallemon.blogspot.com/2008/06/non-functional-requirements-driving.html' title='Non Functional requirements driving technology choice'/><author><name>Allan Rees</name><uri>http://www.blogger.com/profile/06676045582409198604</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://2.bp.blogspot.com/-LHkaQj0Csn4/TWTPZn7JlBI/AAAAAAAAACY/OUV2sbv2Z7Y/s220/IM040%25282%2529.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7149001848285799067.post-5929509893142252180</id><published>2008-06-25T03:09:00.000-07:00</published><updated>2008-06-25T03:46:47.288-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MVC'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='ASP'/><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight'/><category scheme='http://www.blogger.com/atom/ns#' term='MIX'/><title type='text'>Mix Essentials 2008</title><content type='html'>I attended the Mix Essentials at Monte casino yesterday, a big thanks to the organizers for a great venue and for organizing &lt;a href="http://blogs.msdn.com/brada/archive/2003/09/26/50384.aspx"&gt;Brad Abrams&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;South African developers have been a bit deprived in getting to meet the legends of the business, I was fortunate to meet &lt;span id="SPELLING_ERROR_0" class="blsp-spelling-error"&gt;Juval&lt;/span&gt; Lowe last year at &lt;a href="http://www.dariel.co.za/"&gt;&lt;span id="SPELLING_ERROR_1" class="blsp-spelling-error"&gt;Dariel&lt;/span&gt; Solutions &lt;/a&gt;&lt;span id="SPELLING_ERROR_2" class="blsp-spelling-error"&gt;WCF&lt;/span&gt; Master Class, and with Brad coming out this year things are definitely looking up.&lt;br /&gt;&lt;br /&gt;&lt;span id="SPELLING_ERROR_3" class="blsp-spelling-error"&gt;Silverlight&lt;/span&gt; was the focus of the event, and it looks great, and it has good tool support in the form of Blend. Would I use it? Maybe, as a developer the touchy &lt;span id="SPELLING_ERROR_4" class="blsp-spelling-error"&gt;feely&lt;/span&gt; artistic side of &lt;span id="SPELLING_ERROR_5" class="blsp-spelling-error"&gt;UI&lt;/span&gt; development has never really got me excited, but I understand that the &lt;span id="SPELLING_ERROR_6" class="blsp-spelling-error"&gt;UX&lt;/span&gt; is all that a user sees and it can make or break any application.&lt;br /&gt;&lt;br /&gt;I think the success of this platform will depend on its uptake in the designer community who already has a large investment in Flash. I as a developer will not be moving my web apps to &lt;span id="SPELLING_ERROR_7" class="blsp-spelling-error"&gt;Silverlight&lt;/span&gt; soon, but I can see myself incorporating pieces of &lt;span id="SPELLING_ERROR_8" class="blsp-spelling-error"&gt;Silverlight&lt;/span&gt; into ASP AJAX sites where a bit of &lt;span id="SPELLING_ERROR_9" class="blsp-spelling-error"&gt;bling&lt;/span&gt; is needed.&lt;br /&gt;&lt;br /&gt;Good news is that ASP.NET AJAX is here to stay; &lt;span id="SPELLING_ERROR_10" class="blsp-spelling-error"&gt;Silverlight&lt;/span&gt; for now is aimed at &lt;span id="SPELLING_ERROR_11" class="blsp-spelling-error"&gt;RIA&lt;/span&gt;’s (Rich Internet Applications). The contracts to build such applications usually go to advertising agencies and graphic designers, not hard core development houses.&lt;br /&gt;&lt;br /&gt;Dev shops need to know about &lt;span id="SPELLING_ERROR_12" class="blsp-spelling-error"&gt;Silverlight&lt;/span&gt;, and its capabilities and can leverage it to add to the &lt;span id="SPELLING_ERROR_13" class="blsp-spelling-error"&gt;UX&lt;/span&gt; of their offerings, but I do not see it replacing ASP.NET AJAX for line of business applications just yet.&lt;br /&gt;&lt;br /&gt;I followed the developer track, and really nothing earth shattering was on show, Brad demoed ASP AJAX which we have been using for years now, nice that it has been built into VS 2008, but you still need to get the toolkit for all the latest controls.&lt;br /&gt;&lt;br /&gt;This is becoming a mature platform, there are lots of great controls, and optimizations available.&lt;br /&gt;&lt;span id="SPELLING_ERROR_14" class="blsp-spelling-error"&gt;MVC&lt;/span&gt; framework is a great project to watch in the future I feel that it is still a bit immature as it is today, but it is a great idea. The routing engine is clever and having the ability to use URL mapping rules to handle both incoming and outgoing URL scenarios adds a lot of flexibility to application code.&lt;br /&gt;&lt;br /&gt;It means that if we want to later change the URL structure of our application (for example: rename /Products to /Catalog), we could do so by modifying one set of mapping rules at the application level - and not require changing any code within our Controllers or View templates.&lt;br /&gt;&lt;br /&gt;Brad hinted that versions of &lt;span id="SPELLING_ERROR_15" class="blsp-spelling-error"&gt;MVC&lt;/span&gt; for &lt;span id="SPELLING_ERROR_16" class="blsp-spelling-error"&gt;WPF&lt;/span&gt; and Win Forms are in the pipeline. Could he be alluding to the &lt;a href="http://blogs.msdn.com/gblock/archive/2007/10/26/wpf-composite-client-guidance-it-s-coming.aspx"&gt;&lt;span id="SPELLING_ERROR_17" class="blsp-spelling-error"&gt;WPF&lt;/span&gt; Composite client&lt;/a&gt; project, a rebuild of CAB for &lt;span id="SPELLING_ERROR_18" class="blsp-spelling-error"&gt;WPF&lt;/span&gt;?&lt;br /&gt;&lt;br /&gt;Dynamic Data was on show, this seems like the &lt;a href="http://www.asp.net/downloads/sandbox/blinq/"&gt;&lt;span id="SPELLING_ERROR_19" class="blsp-spelling-error"&gt;BLINQ&lt;/span&gt;&lt;/a&gt; project renamed, it currently only works with &lt;span id="SPELLING_ERROR_20" class="blsp-spelling-error"&gt;LINQ&lt;/span&gt; to &lt;span id="SPELLING_ERROR_21" class="blsp-spelling-error"&gt;SQL&lt;/span&gt;, but Entity framework will follow soon. It is fully customizable and could be a great time saver in certain projects.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7149001848285799067-5929509893142252180?l=metallemon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://metallemon.blogspot.com/feeds/5929509893142252180/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7149001848285799067&amp;postID=5929509893142252180' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7149001848285799067/posts/default/5929509893142252180'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7149001848285799067/posts/default/5929509893142252180'/><link rel='alternate' type='text/html' href='http://metallemon.blogspot.com/2008/06/mix-essentials-2008.html' title='Mix Essentials 2008'/><author><name>Allan Rees</name><uri>http://www.blogger.com/profile/06676045582409198604</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://2.bp.blogspot.com/-LHkaQj0Csn4/TWTPZn7JlBI/AAAAAAAAACY/OUV2sbv2Z7Y/s220/IM040%25282%2529.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7149001848285799067.post-3810580262270542521</id><published>2008-06-17T23:21:00.000-07:00</published><updated>2008-06-19T06:33:50.474-07:00</updated><title type='text'>Why Metal Lemon?</title><content type='html'>Metal Lemon is a play on the classic saying when life gives you lemons make &lt;span id="SPELLING_ERROR_0" class="blsp-spelling-corrected"&gt;lemonade&lt;/span&gt;, well &lt;span id="SPELLING_ERROR_1" class="blsp-spelling-corrected"&gt;lemonade&lt;/span&gt; is useful, but power is even more useful , a lemon, a nail and a piece of copper can be used to make a battery, if you have enough you have the potential to power anything, so take lifes lemons and turn them into something potentially great.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7149001848285799067-3810580262270542521?l=metallemon.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://metallemon.blogspot.com/feeds/3810580262270542521/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7149001848285799067&amp;postID=3810580262270542521' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7149001848285799067/posts/default/3810580262270542521'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7149001848285799067/posts/default/3810580262270542521'/><link rel='alternate' type='text/html' href='http://metallemon.blogspot.com/2008/06/why-metal-lemon.html' title='Why Metal Lemon?'/><author><name>Allan Rees</name><uri>http://www.blogger.com/profile/06676045582409198604</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://2.bp.blogspot.com/-LHkaQj0Csn4/TWTPZn7JlBI/AAAAAAAAACY/OUV2sbv2Z7Y/s220/IM040%25282%2529.jpg'/></author><thr:total>0</thr:total></entry></feed>
