<?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-12895914</id><updated>2011-11-27T19:21:57.604-05:00</updated><category term='NUnit'/><category term='C#'/><category term='PostSharp'/><category term='AOP'/><category term='TDD'/><category term='LINQ to NHibernate'/><category term='CSS'/><category term='IoC'/><category term='Coding Standards'/><category term='.Net'/><category term='HTML'/><category term='NHibernate'/><category term='Thoughts'/><category term='Fluent NHibernate'/><category term='Reactive Extensions'/><category term='Best Practices'/><category term='codeproject'/><category term='Refactoring'/><category term='DI'/><title type='text'>Jaime Febres - .Net Programming</title><subtitle type='html'>Fellow amateur .Net developer.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://emiajnet.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12895914/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://emiajnet.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>jaime</name><uri>http://www.blogger.com/profile/05400435935764737984</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>14</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-12895914.post-5878278451479345114</id><published>2010-09-17T21:53:00.000-05:00</published><updated>2010-09-17T21:53:25.231-05:00</updated><title type='text'>Heartysoft.com | Anonymous Types are Internal, C# 4.0 Dynamic Beware!</title><content type='html'>&lt;div&gt;Just found this interesting article:&lt;/div&gt;&lt;a href="http://www.heartysoft.com/post/2010/05/26/anonymous-types-c-sharp-4-dynamic.aspx?sms_ss=blogger"&gt;Heartysoft.com | Anonymous Types are Internal, C# 4.0 Dynamic Beware!&lt;/a&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.heartysoft.com/post/2010/05/26/anonymous-types-c-sharp-4-dynamic.aspx?sms_ss=blogger"&gt;&lt;/a&gt;That explained why my spark templates where failing at runtime because the default dynamic object only works for public and non-internal members.&lt;br /&gt;&lt;div&gt;I implemented the following class in order to use dynamic and non-dynamic models in our spark templates that are used in standalone mode for emailing templating:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;    public class DynamicViewData : DynamicObject&lt;/div&gt;&lt;div&gt;    {&lt;/div&gt;&lt;div&gt;        private readonly object _model;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;        public DynamicViewData(object model)&lt;/div&gt;&lt;div&gt;        {&lt;/div&gt;&lt;div&gt;            _model = model;&lt;/div&gt;&lt;div&gt;        }&lt;/div&gt;&lt;div&gt;        public override bool TryGetMember(GetMemberBinder binder, out object result)&lt;/div&gt;&lt;div&gt;        {&lt;/div&gt;&lt;div&gt;            var member = _model.GetType().GetMember(binder.Name,&lt;/div&gt;&lt;div&gt;                                                    BindingFlags.Instance |&lt;/div&gt;&lt;div&gt;                                                    BindingFlags.Public |&lt;/div&gt;&lt;div&gt;                                                    BindingFlags.NonPublic).FirstOrDefault();&lt;/div&gt;&lt;div&gt;            if (member != null)&lt;/div&gt;&lt;div&gt;            {&lt;/div&gt;&lt;div&gt;                switch (member.MemberType)&lt;/div&gt;&lt;div&gt;                {&lt;/div&gt;&lt;div&gt;                    case MemberTypes.Field:&lt;/div&gt;&lt;div&gt;                        result = ((FieldInfo)member).GetValue(_model);&lt;/div&gt;&lt;div&gt;                        return true;&lt;/div&gt;&lt;div&gt;                    case MemberTypes.Property:&lt;/div&gt;&lt;div&gt;                        result = ((PropertyInfo)member).GetValue(_model, null);&lt;/div&gt;&lt;div&gt;                        return true;&lt;/div&gt;&lt;div&gt;                }&lt;/div&gt;&lt;div&gt;            }&lt;/div&gt;&lt;div&gt;            return base.TryGetMember(binder, out result);&lt;/div&gt;&lt;div&gt;        }&lt;/div&gt;&lt;div&gt;    }&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;And a custom AbstractSparkView which has a dynamic property where I'm passing an instance of this class together with the anonymous model.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now I don't have to define in my spark templates the model type, and also I don't have to define in my code every single viewmodel.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12895914-5878278451479345114?l=emiajnet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.heartysoft.com/post/2010/05/26/anonymous-types-c-sharp-4-dynamic.aspx?sms_ss=blogger' title='Heartysoft.com | Anonymous Types are Internal, C# 4.0 Dynamic Beware!'/><link rel='replies' type='application/atom+xml' href='http://emiajnet.blogspot.com/feeds/5878278451479345114/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12895914&amp;postID=5878278451479345114' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12895914/posts/default/5878278451479345114'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12895914/posts/default/5878278451479345114'/><link rel='alternate' type='text/html' href='http://emiajnet.blogspot.com/2010/09/heartysoftcom-anonymous-types-are.html' title='Heartysoft.com | Anonymous Types are Internal, C# 4.0 Dynamic Beware!'/><author><name>jaime</name><uri>http://www.blogger.com/profile/05400435935764737984</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12895914.post-6348897664024874796</id><published>2010-09-15T02:44:00.002-05:00</published><updated>2010-09-15T22:29:02.009-05:00</updated><title type='text'>Logging and Metrics using Gibraltar – A Windows Form Sample App</title><content type='html'>&lt;h3&gt;Introduction&lt;/h3&gt;  &lt;p&gt;Hello dear reader, have been such a long time. As usual the amount of work at the office I’ve to do on a daily basis, side projects, the occasional colleague asking for help, and last but not least, family life, made almost impossible to write any post on this blog lately, luckily today I’ve found a bit of spare time to do so and I hope you like this blog post.&lt;/p&gt;  &lt;p&gt;So, what’s &lt;a href="http://www.gibraltarsoftware.com/Default.aspx" target="_blank"&gt;Gibraltar&lt;/a&gt;? To my understanding, Gibraltar is an step forward to create components that are categorized as those that work as &lt;a href="http://en.wikipedia.org/wiki/Cross-cutting_concern" target="_blank"&gt;cross cutting concerns&lt;/a&gt; in an application, in plain English that would mean that those components are part of the application but do not belong to the business domain of it.   &lt;br /&gt;A simple example could be Logging, or User Auditing in a CRM application, because the reason of existence of a CRM application is not to perform any of those tasks, but to handle your contacts, calendars, events and so on.   &lt;br /&gt;This is one of the keys concepts when doing &lt;a href="http://en.wikipedia.org/wiki/Aspect-oriented_programming" target="_blank"&gt;AOP&lt;/a&gt; programming.&lt;/p&gt;  &lt;h2&gt;what are the MAIN components of gibraltar&lt;/h2&gt;  &lt;p&gt;Basically Gibraltar is based on two components:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Gibraltar Agent    &lt;br /&gt;This is a .Net library that provides the API to perform most of the job needed. It’s the principal component, without this you wouldn’t be able to collect the precious information from your application. &lt;/li&gt;    &lt;li&gt;Gibraltar Analyst    &lt;br /&gt;This is a user friendly standalone application used to analyze the data sent by your application. Provides several built-in tools to display/filter/sort/group the data generated by the Gibraltar Agent. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;There’s a third optional component, the Gibraltar Hub, which is a service to host in a centralized place all the data generated by your applications.&lt;/p&gt;  &lt;p&gt;For an in-deep look of what those three components are all about, I recommend you to check the following resources:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.gibraltarsoftware.com/Try/Getting-Started.aspx"&gt;Getting Started Guide&lt;/a&gt;   &lt;br /&gt;&lt;a href="http://www.gibraltarsoftware.com/Support/Documentation.aspx?Page=GettingStarted_Components.html"&gt;Gibraltar Architecture&lt;/a&gt;   &lt;br /&gt;&lt;a href="http://www.gibraltarsoftware.com/Support/Documentation.aspx?Page=Hub_FAQ.html"&gt;Gibraltar Hub FAQ&lt;/a&gt;  &lt;br /&gt;&lt;a href="https://www.gibraltarsoftware.com/Try/FAQ.aspx"&gt;Gibraltar Try It FAQ&lt;/a&gt;&lt;/p&gt;  &lt;h3&gt;The sample app&lt;/h3&gt;  &lt;p&gt;This is a fictitious application that allows you to manage your contacts from several sources like GMail, Facebook and so on.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_-4wV51cifeA/TJB4ZenzoYI/AAAAAAAAAKA/RIgoayeBqUo/s1600-h/image4.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/_-4wV51cifeA/TJB4a934JQI/AAAAAAAAAKE/LR2O-_qZcJ4/image_thumb2.png?imgmax=800" width="568" height="309" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;As you can see, we’ve a simple IFeature interface that is used by concrete classes to be recognized in the system as a feature of it. This interface has a Execute method which is used by the UI to make the feature to run.  &lt;br /&gt;I’ve created a base class (FeatureBase) to simplify the implementation of some of the interface members.   &lt;br /&gt;Below I’ll show you the code of this class and of the DisplayContactsFromGMail class, the other two classes are pretty identical and do not make much sense to repeat myself over and over.&lt;/p&gt;  &lt;pre class="code"&gt;    &lt;span style="color: #cc7832"&gt;public abstract class &lt;/span&gt;&lt;span style="color: #ffc66d"&gt;FeatureBase &lt;/span&gt;&lt;span style="color: white"&gt;: &lt;/span&gt;&lt;span style="color: #6897bb"&gt;IFeature&lt;br /&gt;  &lt;/span&gt;&lt;span style="color: white"&gt;{&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: #cc7832"&gt;public abstract &lt;/span&gt;&lt;span style="color: #6897bb"&gt;Guid &lt;/span&gt;&lt;span style="color: white"&gt;Id { &lt;/span&gt;&lt;span style="color: #cc7832"&gt;get&lt;/span&gt;&lt;span style="color: white"&gt;; }&lt;br /&gt;&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: #cc7832"&gt;public string &lt;/span&gt;&lt;span style="color: white"&gt;Name&lt;br /&gt;      {&lt;br /&gt;          &lt;/span&gt;&lt;span style="color: #cc7832"&gt;get &lt;/span&gt;&lt;span style="color: white"&gt;{ &lt;/span&gt;&lt;span style="color: #cc7832"&gt;return &lt;/span&gt;&lt;span style="color: white"&gt;GetType().Name; }&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: #cc7832"&gt;public abstract string &lt;/span&gt;&lt;span style="color: white"&gt;Description { &lt;/span&gt;&lt;span style="color: #cc7832"&gt;get&lt;/span&gt;&lt;span style="color: white"&gt;; }&lt;br /&gt;&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: #cc7832"&gt;public virtual void &lt;/span&gt;&lt;span style="color: white"&gt;Execute()&lt;br /&gt;      {&lt;br /&gt;          &lt;/span&gt;&lt;span style="color: #ffc66d"&gt;MessageBox&lt;/span&gt;&lt;span style="color: white"&gt;.Show(&lt;/span&gt;&lt;span style="color: #a41515"&gt;@"Executing Feature " &lt;/span&gt;&lt;span style="color: white"&gt;+ Name);&lt;br /&gt;      }&lt;br /&gt;  }&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="code"&gt;    &lt;span style="color: #cc7832"&gt;public class &lt;/span&gt;&lt;span style="color: #ffc66d"&gt;DisplayContactsFromGMail &lt;/span&gt;&lt;span style="color: white"&gt;: &lt;/span&gt;&lt;span style="color: #ffc66d"&gt;FeatureBase&lt;br /&gt;  &lt;/span&gt;&lt;span style="color: white"&gt;{&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: #cc7832"&gt;public override &lt;/span&gt;&lt;span style="color: #6897bb"&gt;Guid &lt;/span&gt;&lt;span style="color: white"&gt;Id&lt;br /&gt;      {&lt;br /&gt;          &lt;/span&gt;&lt;span style="color: #cc7832"&gt;get &lt;/span&gt;&lt;span style="color: white"&gt;{ &lt;/span&gt;&lt;span style="color: #cc7832"&gt;return &lt;/span&gt;&lt;span style="color: #6897bb"&gt;Guid&lt;/span&gt;&lt;span style="color: white"&gt;.Parse(&lt;/span&gt;&lt;span style="color: #cf5252"&gt;"614DFAA4-70F7-4F5F-82D4-9598C0F39F60"&lt;/span&gt;&lt;span style="color: white"&gt;); }&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: #cc7832"&gt;public override string &lt;/span&gt;&lt;span style="color: white"&gt;Description&lt;br /&gt;      {&lt;br /&gt;          &lt;/span&gt;&lt;span style="color: #cc7832"&gt;get &lt;/span&gt;&lt;span style="color: white"&gt;{ &lt;/span&gt;&lt;span style="color: #cc7832"&gt;return &lt;/span&gt;&lt;span style="color: #cf5252"&gt;"Display Contacts from your GMail Account"&lt;/span&gt;&lt;span style="color: white"&gt;; }&lt;br /&gt;      }&lt;br /&gt;  }&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="code"&gt;&lt;span style="color: white"&gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;As you can see, very simple classes according with the scope of this post.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;The second part of the application is the component in charge of discovering and providing the features. It could be implement in many ways, for instance by using a DI tool like StructureMap or Autofac. I choose a simple reflection approach, that is, look at the IFeature assembly for types implementing this interface.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://lh5.ggpht.com/_-4wV51cifeA/TJB4bheqDVI/AAAAAAAAAKI/HHKjnKLG0mQ/s1600-h/image10.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_-4wV51cifeA/TJB4dISEWwI/AAAAAAAAAKM/hZ8GQ95Jc4E/image_thumb6.png?imgmax=800" width="536" height="274" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;The FeatureCatalog is implemented as follows:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="code"&gt;    &lt;span style="color: #cc7832"&gt;public class &lt;/span&gt;&lt;span style="color: #ffc66d"&gt;FeatureCatalog &lt;/span&gt;&lt;span style="color: white"&gt;: &lt;/span&gt;&lt;span style="color: #6897bb"&gt;IFeatureCatalog&lt;br /&gt;  &lt;/span&gt;&lt;span style="color: white"&gt;{&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: #cc7832"&gt;private readonly &lt;/span&gt;&lt;span style="color: #6897bb"&gt;IEnumerable&lt;/span&gt;&lt;span style="color: white"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #6897bb"&gt;IFeature&lt;/span&gt;&lt;span style="color: white"&gt;&amp;gt; _features;&lt;br /&gt;&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: #cc7832"&gt;public &lt;/span&gt;&lt;span style="color: white"&gt;FeatureCatalog()&lt;br /&gt;      {&lt;br /&gt;          _features = &lt;/span&gt;&lt;span style="color: #cc7832"&gt;typeof&lt;/span&gt;&lt;span style="color: white"&gt;(&lt;/span&gt;&lt;span style="color: #ffc66d"&gt;FeatureCatalog&lt;/span&gt;&lt;span style="color: white"&gt;)&lt;br /&gt;              .Assembly&lt;br /&gt;              .GetTypes()&lt;br /&gt;              .Where(x =&amp;gt; x.IsPublic)&lt;br /&gt;              .Where(x =&amp;gt; x.IsClass)&lt;br /&gt;              .Where(x =&amp;gt; !x.IsAbstract)&lt;br /&gt;              .Where(x =&amp;gt; &lt;/span&gt;&lt;span style="color: #cc7832"&gt;typeof&lt;/span&gt;&lt;span style="color: white"&gt;(&lt;/span&gt;&lt;span style="color: #6897bb"&gt;IFeature&lt;/span&gt;&lt;span style="color: white"&gt;).IsAssignableFrom(x))&lt;br /&gt;              .Select(&lt;/span&gt;&lt;span style="color: #ffc66d"&gt;Activator&lt;/span&gt;&lt;span style="color: white"&gt;.CreateInstance)&lt;br /&gt;              .Cast&amp;lt;&lt;/span&gt;&lt;span style="color: #6897bb"&gt;IFeature&lt;/span&gt;&lt;span style="color: white"&gt;&amp;gt;()&lt;br /&gt;              .ToList();&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: #cc7832"&gt;public &lt;/span&gt;&lt;span style="color: #6897bb"&gt;IEnumerable&lt;/span&gt;&lt;span style="color: white"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #6897bb"&gt;IFeature&lt;/span&gt;&lt;span style="color: white"&gt;&amp;gt; Features&lt;br /&gt;      {&lt;br /&gt;          &lt;/span&gt;&lt;span style="color: #cc7832"&gt;get &lt;/span&gt;&lt;span style="color: white"&gt;{ &lt;/span&gt;&lt;span style="color: #cc7832"&gt;return &lt;/span&gt;&lt;span style="color: white"&gt;_features; }&lt;br /&gt;      }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;&lt;span&gt;Did I said I really love LINQ? :)&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="code"&gt;&lt;span style="color: white"&gt;&lt;span&gt;Ok, now we’ve everything in place let’s create a simple UI to use the implemented features; if you think this the worst UI you’ve seen in you whole life, please bear with me, UI design is not one of my strong skills :)&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="code"&gt;&lt;a href="http://lh4.ggpht.com/_-4wV51cifeA/TJB4d4mc7NI/AAAAAAAAAKQ/qhF__pxzgvU/s1600-h/image14.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/_-4wV51cifeA/TJB4fC6nulI/AAAAAAAAAKU/Ft5BicCg4-Y/image_thumb8.png?imgmax=800" width="544" height="308" /&gt;&lt;/a&gt; &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;We’ll load the list of features in the listbox control, and the button at the right side will just execute the selected feature.&lt;br /&gt;&lt;br /&gt;Let’s take a look at the code used to load the features into the listbox and the code of the button click event.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="code"&gt;        &lt;span style="color: #cc7832"&gt;private void &lt;/span&gt;&lt;span style="color: white"&gt;Form1_Load(&lt;/span&gt;&lt;span style="color: #cc7832"&gt;object &lt;/span&gt;&lt;span style="color: white"&gt;sender, &lt;/span&gt;&lt;span style="color: #ffc66d"&gt;EventArgs &lt;/span&gt;&lt;span style="color: white"&gt;e)&lt;br /&gt;      {&lt;br /&gt;          FeaturesList.DataSource = &lt;/span&gt;&lt;span style="color: #cc7832"&gt;new &lt;/span&gt;&lt;span style="color: #ffc66d"&gt;FeatureCatalog&lt;/span&gt;&lt;span style="color: white"&gt;().Features;&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: #cc7832"&gt;private void &lt;/span&gt;&lt;span style="color: white"&gt;ExecuteFeatureButton_Click(&lt;/span&gt;&lt;span style="color: #cc7832"&gt;object &lt;/span&gt;&lt;span style="color: white"&gt;sender, &lt;/span&gt;&lt;span style="color: #ffc66d"&gt;EventArgs &lt;/span&gt;&lt;span style="color: white"&gt;e)&lt;br /&gt;      {&lt;br /&gt;          ((&lt;/span&gt;&lt;span style="color: #6897bb"&gt;IFeature&lt;/span&gt;&lt;span style="color: white"&gt;) FeaturesList.SelectedItem).Execute();&lt;br /&gt;      }&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;Pretty simple uh? Lets see how the app behaves when executing the DisplayContactsFromGMail feature.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://lh6.ggpht.com/_-4wV51cifeA/TJB4gG71wuI/AAAAAAAAAKY/gCkz4o_aeik/s1600-h/image17.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_-4wV51cifeA/TJB4hcvzWYI/AAAAAAAAAKc/_kHN_JQhZSY/image_thumb9.png?imgmax=800" width="555" height="274" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Selecting other features and clicking the button at the right side produces the same effect (display a messagebox with a generic description).&lt;/p&gt;&lt;h3&gt;Introducing Gibraltar&lt;/h3&gt;&lt;p&gt;Now you may be wondering, “WTF? I’ve not seen any Gibraltar usage anywhere!!”.&lt;br /&gt;&lt;br /&gt;I know, I know…please be patience. &lt;/p&gt;&lt;p&gt;Well, let’s say your boss tells you that the users are complaining about the large list of items being displayed on the listbox (menu, tabs or any other method you real app would use to show the available features). Your boss ask you to determine which are the most used features from the application and display the top X in your original control (the listbox) and the rest somewhere else.&lt;br /&gt;&lt;br /&gt;So, the first thing you’ve to do is to update the app to track the features usage and determine which are the most used in a given period of time and deploy this new version of the app to your clients, after a few days of monitoring you’ll know what to do and what features put apart.&lt;/p&gt;&lt;p&gt;We could use several different options here, like Dynamic Proxy, Postsharp for IL Weaving, and a few more. But what we can’t do is obviously start manually changing one class at a time to do this, that would be a daunting,tedious and error prone task.&lt;/p&gt;&lt;p&gt;The question is…where should we inject this? In the button click handler…for the scope of this article would probably do the trick, but I suppose in a real project a feature X could call to another feature from the catalog.&lt;/p&gt;&lt;p&gt;So if the catalog is the entry point to retrieve features, then the catalog is the place where this new code should be implemented.&lt;/p&gt;&lt;p&gt;What I’m going to do is to create an IFeature implementation that will act as a wrapper of the real implementations. Each IFeature member implemented in this wrapper will simply forward the call to the real feature undercover, excepting the Execute method where I’m going to record the the feature usage and after that the wrapper will continue with the execution flow.&lt;/p&gt;&lt;p&gt;The usage recording will be performed in a helper class where the Gibraltar related code will be dropped.&lt;br /&gt;&lt;br /&gt;Gibraltar besides the normal logging of messages it has something called Metrics, that as its name implies, is specially designed to this kind of scenarios where we need to measure certain aspect of our applications, for this scenario, we will sum the number of times a feature is used, another could be determine what’s the average number of emails our users sent per day and so on.&lt;/p&gt;&lt;p&gt;Is time to modify our application to include the required Gibraltar configuration settings and references…but don’t worry, this step is the easiest one (and the most fun of all of them).&lt;br /&gt;&lt;br /&gt;First of all, you’ll need to download and install the Gibraltar bits from &lt;a href="http://www.gibraltarsoftware.com/Try/Default.aspx"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Once you have everything in place, go and execute the Gibraltar Analyst program. Bellow are the steps required to enable Gibraltar in your app:&lt;/p&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;Tools / Add Gibraltar to an Application.&lt;a href="http://lh4.ggpht.com/_-4wV51cifeA/TJB4jB8HfLI/AAAAAAAAAKg/lMp4fd-nr-k/s1600-h/image%5B8%5D.png"&gt;&lt;br /&gt;  &lt;br /&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/_-4wV51cifeA/TJB4krnRg8I/AAAAAAAAAKk/rODiZH-SrkY/image_thumb%5B3%5D.png?imgmax=800" width="606" height="358" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;Click on the “…” button and navigate and select your project file and click the “Open” button in the window dialog.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://lh5.ggpht.com/_-4wV51cifeA/TJB4mYh_nZI/AAAAAAAAAKo/wU2m3SHf81w/s1600-h/image%5B12%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/_-4wV51cifeA/TJB4oIAm90I/AAAAAAAAAKs/U7tF544ENBk/image_thumb%5B5%5D.png?imgmax=800" width="613" height="289" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;A set of options will get enabled on this screen, choose “Add the Gibraltar Agent to this Application”.&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;The next step will ask you how do you want that the Agent categorize your Application, just pick up the option “Automatically Determine Options”.&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;In the step “How should session data be reported to you?” we will choose to use the Gibraltar Hub just for fun, you can leave the other options unchecked.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://lh3.ggpht.com/_-4wV51cifeA/TJB4pBweTJI/AAAAAAAAAKw/AssYz9ZEKik/s1600-h/image%5B16%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_-4wV51cifeA/TJB4qo07QdI/AAAAAAAAAK0/TMi-1vHdg9E/image_thumb%5B7%5D.png?imgmax=800" width="475" height="384" /&gt;&lt;/a&gt; &lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;Now in this step it will ask you for an account name or the settings of your private hub service. We will choose to provide an account name for our hub service. You can get a 30 days renewable trial of the hub service from the Gibraltar web page &lt;a href="https://www.gibraltarsoftware.com/Register_Now.aspx"&gt;here&lt;/a&gt;. Just check the options you see below, follow the instructions and in a matter of minutes you’ll have a hub and the client side tooling required to get your app up and running.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://lh3.ggpht.com/_-4wV51cifeA/TJB4rutI-iI/AAAAAAAAAK4/s54Cpbkr83w/s1600-h/image%5B19%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_-4wV51cifeA/TJB4sq_HWyI/AAAAAAAAAK8/ryHA0HG2NO8/image_thumb%5B8%5D.png?imgmax=800" width="385" height="280" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Once you’ve registered your hub service trial, introduce the name of your service in the input box and you’re almost ready to go.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://lh3.ggpht.com/_-4wV51cifeA/TJB4tTh9Z3I/AAAAAAAAALA/U2yndajKhQI/s1600-h/image%5B23%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_-4wV51cifeA/TJB4u3gNl1I/AAAAAAAAALE/gstIdlda92A/image_thumb%5B10%5D.png?imgmax=800" width="449" height="363" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;This step is about configuring how do you like to sent your sessions data, I just leave the suggested options checked.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://lh6.ggpht.com/_-4wV51cifeA/TJB4vu97fyI/AAAAAAAAALI/-oooXtB7OPI/s1600-h/image%5B28%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_-4wV51cifeA/TJB4xfnroFI/AAAAAAAAALM/qEUaS3NBAV8/image_thumb%5B13%5D.png?imgmax=800" width="458" height="372" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;And that’s all.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://lh4.ggpht.com/_-4wV51cifeA/TJB4yA0HlAI/AAAAAAAAALQ/TmntCxaVegc/s1600-h/image%5B32%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_-4wV51cifeA/TJB40CvRZiI/AAAAAAAAALU/GgdeX2HRuT4/image_thumb%5B15%5D.png?imgmax=800" width="466" height="377" /&gt;&lt;/a&gt; &lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Once you perform the steps I outlined above, your project will reload itself with the references and all you need to start integrating your application with Gibraltar.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://lh4.ggpht.com/_-4wV51cifeA/TJB42pBlgyI/AAAAAAAAALY/tf59QKjF19U/s1600-h/image%5B37%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_-4wV51cifeA/TJB45MaQsXI/AAAAAAAAALc/nV0bcaRB1Jc/image_thumb%5B18%5D.png?imgmax=800" width="527" height="401" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;br /&gt;Now that you’ve configured your project to work together with the Gibraltar Agent. It’s time to configure your Gibraltar Analyst to fetch the generated data from the Gibraltar Hub.&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;Tools/Connect to Hub… &lt;a href="http://lh3.ggpht.com/_-4wV51cifeA/TJB46vo85-I/AAAAAAAAALg/G5VMDpQxVFU/s1600-h/image%5B46%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/_-4wV51cifeA/TJB48G0eAWI/AAAAAAAAALk/Q-Jt_3IC46E/image_thumb%5B23%5D.png?imgmax=800" width="477" height="299" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://lh3.ggpht.com/_-4wV51cifeA/TJB480vj_VI/AAAAAAAAALo/iuvWnHanKZI/s1600-h/image%5B53%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://lh4.ggpht.com/_-4wV51cifeA/TJB4_78McyI/AAAAAAAAALs/CgtgWo7R6eA/image_thumb%5B26%5D.png?imgmax=800" width="476" height="385" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;br /&gt;&lt;a href="http://lh3.ggpht.com/_-4wV51cifeA/TJB5ArXsWGI/AAAAAAAAALw/mMRc8Yvcy1M/s1600-h/image%5B57%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/_-4wV51cifeA/TJB5CfD5keI/AAAAAAAAAL0/x9y1b94hG_0/image_thumb%5B28%5D.png?imgmax=800" width="490" height="396" /&gt;&lt;/a&gt; &lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;br /&gt;&lt;a href="http://lh4.ggpht.com/_-4wV51cifeA/TJB5DWVCinI/AAAAAAAAAL4/wJsRXuzMq_w/s1600-h/image%5B61%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_-4wV51cifeA/TJB5FFT1FZI/AAAAAAAAAL8/gNW1Oy2a8xs/image_thumb%5B30%5D.png?imgmax=800" width="504" height="408" /&gt;&lt;/a&gt; &lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;p&gt;And that’s all folks, you can start fetching data from your hub and view it locally in the Analyst client.&lt;/p&gt;&lt;br /&gt;Let’s continue with the implementation of our wrapper.&lt;br /&gt;&lt;br /&gt;&lt;pre class="code"&gt;&lt;span style="color: #cc7832"&gt;using &lt;/span&gt;&lt;span style="color: white"&gt;System;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #cc7832"&gt;using &lt;/span&gt;&lt;span style="color: white"&gt;ContactsManager.Metrics;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #cc7832"&gt;using &lt;/span&gt;&lt;span style="color: white"&gt;Gibraltar.Agent;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #cc7832"&gt;namespace &lt;/span&gt;&lt;span style="color: white"&gt;ContactsManager.Features&lt;br /&gt;{&lt;br /&gt;  &lt;/span&gt;&lt;span style="color: #cc7832"&gt;public class &lt;/span&gt;&lt;span style="color: #ffc66d"&gt;FeatureWrapper &lt;/span&gt;&lt;span style="color: white"&gt;: &lt;/span&gt;&lt;span style="color: #6897bb"&gt;IFeature&lt;br /&gt;  &lt;/span&gt;&lt;span style="color: white"&gt;{&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: #cc7832"&gt;private readonly &lt;/span&gt;&lt;span style="color: #6897bb"&gt;IFeature &lt;/span&gt;&lt;span style="color: white"&gt;_feature;&lt;br /&gt;&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: #cc7832"&gt;public &lt;/span&gt;&lt;span style="color: white"&gt;FeatureWrapper(&lt;/span&gt;&lt;span style="color: #6897bb"&gt;IFeature &lt;/span&gt;&lt;span style="color: white"&gt;feature)&lt;br /&gt;      {&lt;br /&gt;          _feature = feature;&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: #cc7832"&gt;public string &lt;/span&gt;&lt;span style="color: white"&gt;Name&lt;br /&gt;      {&lt;br /&gt;          &lt;/span&gt;&lt;span style="color: #cc7832"&gt;get &lt;/span&gt;&lt;span style="color: white"&gt;{ &lt;/span&gt;&lt;span style="color: #cc7832"&gt;return &lt;/span&gt;&lt;span style="color: white"&gt;_feature.Name; }&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: #cc7832"&gt;public &lt;/span&gt;&lt;span style="color: #6897bb"&gt;Guid &lt;/span&gt;&lt;span style="color: white"&gt;Id&lt;br /&gt;      {&lt;br /&gt;          &lt;/span&gt;&lt;span style="color: #cc7832"&gt;get &lt;/span&gt;&lt;span style="color: white"&gt;{ &lt;/span&gt;&lt;span style="color: #cc7832"&gt;return &lt;/span&gt;&lt;span style="color: white"&gt;_feature.Id; }&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: #cc7832"&gt;public string &lt;/span&gt;&lt;span style="color: white"&gt;Description&lt;br /&gt;      {&lt;br /&gt;          &lt;/span&gt;&lt;span style="color: #cc7832"&gt;get &lt;/span&gt;&lt;span style="color: white"&gt;{ &lt;/span&gt;&lt;span style="color: #cc7832"&gt;return &lt;/span&gt;&lt;span style="color: white"&gt;_feature.Description; }&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: #cc7832"&gt;public void &lt;/span&gt;&lt;span style="color: white"&gt;Execute()&lt;br /&gt;      {&lt;br /&gt;          &lt;/span&gt;&lt;span style="color: #ffc66d"&gt;FeatureUsageRecorder&lt;/span&gt;&lt;span style="color: white"&gt;.Record(_feature, &lt;/span&gt;&lt;span style="color: #6897bb"&gt;1&lt;/span&gt;&lt;span style="color: white"&gt;);&lt;br /&gt;          &lt;/span&gt;&lt;span style="color: #ffc66d"&gt;Log&lt;/span&gt;&lt;span style="color: white"&gt;.Information(&lt;/span&gt;&lt;span style="color: #cf5252"&gt;"Contacts Manager"&lt;/span&gt;&lt;span style="color: white"&gt;, &lt;/span&gt;&lt;span style="color: #cf5252"&gt;"Feature Usage"&lt;/span&gt;&lt;span style="color: white"&gt;, &lt;/span&gt;&lt;span style="color: #cf5252"&gt;"Feature {0} executed"&lt;/span&gt;&lt;span style="color: white"&gt;, _feature.Name);&lt;br /&gt;          &lt;/span&gt;&lt;span style="color: #cc7832"&gt;try&lt;br /&gt;          &lt;/span&gt;&lt;span style="color: white"&gt;{&lt;br /&gt;              _feature.Execute();&lt;br /&gt;          }&lt;br /&gt;          &lt;/span&gt;&lt;span style="color: #cc7832"&gt;catch &lt;/span&gt;&lt;span style="color: white"&gt;(&lt;/span&gt;&lt;span style="color: #ffc66d"&gt;Exception &lt;/span&gt;&lt;span style="color: white"&gt;ex)&lt;br /&gt;          {&lt;br /&gt;              &lt;/span&gt;&lt;span style="color: #ffc66d"&gt;Log&lt;/span&gt;&lt;span style="color: white"&gt;.Error(ex, &lt;/span&gt;&lt;span style="color: #cf5252"&gt;"Contacts Manager"&lt;/span&gt;&lt;span style="color: white"&gt;, &lt;/span&gt;&lt;span style="color: #cf5252"&gt;"{0} Error {1}"&lt;/span&gt;&lt;span style="color: white"&gt;, _feature.Name,ex.ToString());&lt;br /&gt;              &lt;/span&gt;&lt;span style="color: #cc7832"&gt;throw&lt;/span&gt;&lt;span style="color: white"&gt;;&lt;br /&gt;          }&lt;br /&gt;      }&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;p&gt;As you can see, it forwards the calls to the real feature (_feature member), and when it gets the time to call to Execute, it uses the FeatureUsageRecorder static class and records this action, logs entrance to the method,  it continues by calling the Execute method of the underlying feature, and it case of failure logs the exception. &lt;/p&gt;&lt;p&gt;Now we need to modify the catalog to wrap the features using this new class.&lt;/p&gt;&lt;br /&gt;&lt;pre class="code"&gt;    &lt;span style="color: #cc7832"&gt;public class &lt;/span&gt;&lt;span style="color: #ffc66d"&gt;FeatureCatalog &lt;/span&gt;&lt;span style="color: white"&gt;: &lt;/span&gt;&lt;span style="color: #6897bb"&gt;IFeatureCatalog&lt;br /&gt;  &lt;/span&gt;&lt;span style="color: white"&gt;{&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: #cc7832"&gt;private readonly &lt;/span&gt;&lt;span style="color: #6897bb"&gt;IEnumerable&lt;/span&gt;&lt;span style="color: white"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #6897bb"&gt;IFeature&lt;/span&gt;&lt;span style="color: white"&gt;&amp;gt; _features;&lt;br /&gt;&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: #cc7832"&gt;public &lt;/span&gt;&lt;span style="color: white"&gt;FeatureCatalog()&lt;br /&gt;      {&lt;br /&gt;          _features = &lt;/span&gt;&lt;span style="color: #cc7832"&gt;typeof&lt;/span&gt;&lt;span style="color: white"&gt;(&lt;/span&gt;&lt;span style="color: #ffc66d"&gt;FeatureCatalog&lt;/span&gt;&lt;span style="color: white"&gt;)&lt;br /&gt;              .Assembly&lt;br /&gt;              .GetTypes()&lt;br /&gt;              .Where(x =&amp;gt; x.IsPublic)&lt;br /&gt;              .Where(x =&amp;gt; x.IsClass)&lt;br /&gt;              .Where(x =&amp;gt; !x.IsAbstract)&lt;br /&gt;              .Where(x =&amp;gt; &lt;/span&gt;&lt;span style="color: #cc7832"&gt;typeof&lt;/span&gt;&lt;span style="color: white"&gt;(&lt;/span&gt;&lt;span style="color: #6897bb"&gt;IFeature&lt;/span&gt;&lt;span style="color: white"&gt;).IsAssignableFrom(x))&lt;br /&gt;              &lt;em&gt;.Where(x =&amp;gt; !&lt;/em&gt;&lt;/span&gt;&lt;em&gt;&lt;span style="color: #cc7832"&gt;typeof&lt;/span&gt;&lt;span style="color: white"&gt;(&lt;/span&gt;&lt;span style="color: #ffc66d"&gt;FeatureWrapper&lt;/span&gt;&lt;/em&gt;&lt;span style="color: white"&gt;&lt;em&gt;).IsAssignableFrom(x))&lt;/em&gt;&lt;br /&gt;              .Select(&lt;/span&gt;&lt;span style="color: #ffc66d"&gt;Activator&lt;/span&gt;&lt;span style="color: white"&gt;.CreateInstance)&lt;br /&gt;              .Cast&amp;lt;&lt;/span&gt;&lt;span style="color: #6897bb"&gt;IFeature&lt;/span&gt;&lt;span style="color: white"&gt;&amp;gt;()&lt;br /&gt;              &lt;em&gt;.Select(x =&amp;gt; &lt;/em&gt;&lt;/span&gt;&lt;em&gt;&lt;span style="color: #cc7832"&gt;new &lt;/span&gt;&lt;span style="color: #ffc66d"&gt;FeatureWrapper&lt;/span&gt;&lt;/em&gt;&lt;span style="color: white"&gt;&lt;em&gt;(x))&lt;/em&gt;&lt;br /&gt;              .ToList();&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: #cc7832"&gt;public &lt;/span&gt;&lt;span style="color: #6897bb"&gt;IEnumerable&lt;/span&gt;&lt;span style="color: white"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #6897bb"&gt;IFeature&lt;/span&gt;&lt;span style="color: white"&gt;&amp;gt; Features&lt;br /&gt;      {&lt;br /&gt;          &lt;/span&gt;&lt;span style="color: #cc7832"&gt;get &lt;/span&gt;&lt;span style="color: white"&gt;{ &lt;/span&gt;&lt;span style="color: #cc7832"&gt;return &lt;/span&gt;&lt;span style="color: white"&gt;_features; }&lt;br /&gt;      }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;As you can see there, I’m excluding from the assembly scanning to the FeatureWrapper class, and once the IFeature implementations had been instantiated, I’m wrapping them all into the FeatureWrapper class just before calling to ToList in the IEnumerable. This ensure us that the application will still work as usual and that the features are not aware of the fact that we are generating metrics when our clients make use of them.&lt;/p&gt;&lt;p&gt;And what everyone was waiting, the code for the FeatureUsageRecorder class (including imported namespaces):&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;pre class="code"&gt;&lt;span style="color: #cc7832"&gt;using &lt;/span&gt;&lt;span style="color: white"&gt;ContactsManager.Features;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #cc7832"&gt;using &lt;/span&gt;&lt;span style="color: white"&gt;Gibraltar.Agent.Metrics;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #cc7832"&gt;namespace &lt;/span&gt;&lt;span style="color: white"&gt;ContactsManager.Metrics&lt;br /&gt;{&lt;br /&gt;  &lt;/span&gt;&lt;span style="color: #cc7832"&gt;public static class &lt;/span&gt;&lt;span style="color: #ffc66d"&gt;FeatureUsageRecorder&lt;br /&gt;  &lt;/span&gt;&lt;span style="color: white"&gt;{&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: #cc7832"&gt;private const string &lt;/span&gt;&lt;span style="color: white"&gt;MetricKey = &lt;/span&gt;&lt;span style="color: #cf5252"&gt;"Feature name"&lt;/span&gt;&lt;span style="color: white"&gt;;&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: #cc7832"&gt;private const string &lt;/span&gt;&lt;span style="color: white"&gt;MetricDataObjectType = &lt;/span&gt;&lt;span style="color: #cf5252"&gt;"ContactsManager"&lt;/span&gt;&lt;span style="color: white"&gt;;&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: #cc7832"&gt;private const string &lt;/span&gt;&lt;span style="color: white"&gt;CategoryName = &lt;/span&gt;&lt;span style="color: #cf5252"&gt;"Features"&lt;/span&gt;&lt;span style="color: white"&gt;;&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: #cc7832"&gt;private const string &lt;/span&gt;&lt;span style="color: white"&gt;MetricDescription = &lt;/span&gt;&lt;span style="color: #cf5252"&gt;"Number of times this feature has been used."&lt;/span&gt;&lt;span style="color: white"&gt;;&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: #cc7832"&gt;private const string &lt;/span&gt;&lt;span style="color: white"&gt;UnitCaption = &lt;/span&gt;&lt;span style="color: #cf5252"&gt;"Number of Calls"&lt;/span&gt;&lt;span style="color: white"&gt;;&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: #cc7832"&gt;private const string &lt;/span&gt;&lt;span style="color: white"&gt;Caption = &lt;/span&gt;&lt;span style="color: #cf5252"&gt;"Usage"&lt;/span&gt;&lt;span style="color: white"&gt;;&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: #cc7832"&gt;private const string &lt;/span&gt;&lt;span style="color: white"&gt;CounterName = &lt;/span&gt;&lt;span style="color: #cf5252"&gt;"Contacts Manager Feature Usage"&lt;/span&gt;&lt;span style="color: white"&gt;;&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: #cc7832"&gt;private static readonly &lt;/span&gt;&lt;span style="color: #ffc66d"&gt;EventMetricDefinition &lt;/span&gt;&lt;span style="color: white"&gt;_featureUsageMetric;&lt;br /&gt;&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: #cc7832"&gt;static &lt;/span&gt;&lt;span style="color: white"&gt;FeatureUsageRecorder ()&lt;br /&gt;      {&lt;br /&gt;          &lt;/span&gt;&lt;span style="color: #cc7832"&gt;if &lt;/span&gt;&lt;span style="color: white"&gt;(!&lt;/span&gt;&lt;span style="color: #ffc66d"&gt;EventMetricDefinition&lt;/span&gt;&lt;span style="color: white"&gt;.TryGetValue(MetricDataObjectType, CategoryName, CounterName, &lt;/span&gt;&lt;span style="color: #cc7832"&gt;out &lt;/span&gt;&lt;span style="color: white"&gt;_featureUsageMetric))&lt;br /&gt;          {&lt;br /&gt;              _featureUsageMetric = &lt;/span&gt;&lt;span style="color: #cc7832"&gt;new &lt;/span&gt;&lt;span style="color: #ffc66d"&gt;EventMetricDefinition&lt;/span&gt;&lt;span style="color: white"&gt;(MetricDataObjectType, CategoryName, CounterName);&lt;br /&gt;              _featureUsageMetric.AddValue(MetricKey, &lt;/span&gt;&lt;span style="color: #cc7832"&gt;typeof&lt;/span&gt;&lt;span style="color: white"&gt;(&lt;/span&gt;&lt;span style="color: #cc7832"&gt;int&lt;/span&gt;&lt;span style="color: white"&gt;), &lt;/span&gt;&lt;span style="color: #6897bb"&gt;SummaryFunction&lt;/span&gt;&lt;span style="color: white"&gt;.Sum, UnitCaption, Caption,&lt;br /&gt;                                   MetricDescription);&lt;br /&gt;              &lt;/span&gt;&lt;span style="color: #ffc66d"&gt;EventMetricDefinition&lt;/span&gt;&lt;span style="color: white"&gt;.Register(&lt;/span&gt;&lt;span style="color: #cc7832"&gt;ref &lt;/span&gt;&lt;span style="color: white"&gt;_featureUsageMetric);&lt;br /&gt;          }&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;      &lt;/span&gt;&lt;span style="color: #cc7832"&gt;public static void &lt;/span&gt;&lt;span style="color: white"&gt;Record(&lt;/span&gt;&lt;span style="color: #6897bb"&gt;IFeature &lt;/span&gt;&lt;span style="color: white"&gt;feature, &lt;/span&gt;&lt;span style="color: #cc7832"&gt;int &lt;/span&gt;&lt;span style="color: white"&gt;count)&lt;br /&gt;      {&lt;br /&gt;          &lt;/span&gt;&lt;span style="color: #cc7832"&gt;var &lt;/span&gt;&lt;span style="color: white"&gt;metricEntry = &lt;/span&gt;&lt;span style="color: #ffc66d"&gt;EventMetric&lt;/span&gt;&lt;span style="color: white"&gt;.Register(_featureUsageMetric, feature.Name);&lt;br /&gt;          &lt;/span&gt;&lt;span style="color: #cc7832"&gt;var &lt;/span&gt;&lt;span style="color: white"&gt;metricSample = metricEntry.CreateSample();&lt;br /&gt;          metricSample.SetValue(MetricKey, count);&lt;br /&gt;          metricSample.Write();&lt;br /&gt;      }&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;As you can see from the code above, Gibraltar lets you write custom Metrics and defining the fields that this metric will contain.&lt;br /&gt;&lt;br /&gt;We are defining a “Contacts Manager Feature Usage” metric under certain category (“Features”), this metric belongs to the “ContactsManager” metric data object type. All of this are arbitrary names, you could choose whatever fits your needs.&lt;br /&gt;&lt;br /&gt;Now this metric would be pointless if does not measure anything, so we register a unit that will be keyed with the value of the const MetricKey (“Feature name”), will have a int type, the summary function is defined as a sum of their column, and so on.&lt;/p&gt;&lt;p&gt;In the Record method, we take in a IFeature instance and just store the number of times this feature is used, currently hardcoded to 1, I thought it could be a good idea to call this method each X times a certain feature is used instead of calling it as soon as the feature is used as it is right now.&lt;/p&gt;&lt;p&gt;Now lets execute the application and start clicking the button many times for each feature.&lt;br /&gt;Now close the application and check the Gibraltar Analyst application.&lt;br /&gt;What you will see is something like this:&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh3.ggpht.com/_-4wV51cifeA/TJB5GfJNUuI/AAAAAAAAAMA/Av_2sPNR3T4/s1600-h/image%5B65%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_-4wV51cifeA/TJB5H5baoGI/AAAAAAAAAME/CT0hAPB8cfs/image_thumb%5B32%5D.png?imgmax=800" width="630" height="243" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;Clicking on the first row will open the following screen:&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://lh5.ggpht.com/_-4wV51cifeA/TJB5JknmYaI/AAAAAAAAAMI/ljEanYVJb44/s1600-h/image%5B69%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/_-4wV51cifeA/TJB5MJi-a2I/AAAAAAAAAMM/-xFN3MdTopE/image_thumb%5B34%5D.png?imgmax=800" width="641" height="354" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;That’s an extensible and user friendly view of the log entries generated by our application (remember those Log.Information calls from the FeatureWrapper class??). Also this screen provides with filters in order to remove all the collected data that you don’t want to see. &lt;/p&gt;&lt;p&gt;What about our metrics, after all, that was the whole purpose of using Gibraltar. In this screen click onto the “New View” option at the top. You’ll see a pop-up like this one:&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://lh6.ggpht.com/_-4wV51cifeA/TJB5NOsZ7ZI/AAAAAAAAAMQ/N5cCll3fyAA/s1600-h/image%5B73%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://lh5.ggpht.com/_-4wV51cifeA/TJB5OmZOTCI/AAAAAAAAAMU/F-YNFe1axF0/image_thumb%5B36%5D.png?imgmax=800" width="451" height="227" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;br /&gt;Please choose the “New Chart” option, later you can play with the other options.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;That will open the metric reporting designer. From the threeview in the left side, expand the content under Metrics/Feature, drag and drop the item named “Contact Manager Feature Usage”:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://lh3.ggpht.com/_-4wV51cifeA/TJB5Qc5NZJI/AAAAAAAAAMY/NSxPh6Q5b2U/s1600-h/image%5B76%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://lh3.ggpht.com/_-4wV51cifeA/TJB5RYftSJI/AAAAAAAAAMc/e1T46jsvcew/image_thumb%5B37%5D.png?imgmax=800" width="514" height="280" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;br /&gt;&lt;p&gt;After performing that command, you’ll get a dialog to define your report, choose the options I show you in the next screenshot:&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh6.ggpht.com/_-4wV51cifeA/TJB5TIeR70I/AAAAAAAAAMg/LEQFQGN8Hqw/s1600-h/image%5B89%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://lh6.ggpht.com/_-4wV51cifeA/TJB5UwCCJzI/AAAAAAAAAMk/1PzCO_lpla8/image_thumb%5B44%5D.png?imgmax=800" width="509" height="331" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Click “Ok” and you’ll get the following report:&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh4.ggpht.com/_-4wV51cifeA/TJB5V-CwGoI/AAAAAAAAAMo/dFKPr0e5fyc/s1600-h/Feature%20Usage%20Report%5B3%5D.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="Feature Usage Report" border="0" alt="Feature Usage Report" src="http://lh3.ggpht.com/_-4wV51cifeA/TJB5Wz2HxNI/AAAAAAAAAMs/Yt9EUFsYktU/Feature%20Usage%20Report_thumb%5B1%5D.jpg?imgmax=800" width="519" height="392" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;span class="Apple-style-span" style="font-size: 19px; font-weight: bold; "&gt;Final thoughts&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;As you can see, it was very easy to introduce Gibraltar into our App and get the benefits from a robust product that has almost all what you may need to trace and get rich information from your application without much effort.&lt;br /&gt;&lt;p&gt;For the record, Gibraltar comes with a set of built-in aspects (Postsharp attributes) that somehow, make even easier to work with it (GTrace, GTraceField, and so on).  You can read about them &lt;a href="http://www.gibraltarsoftware.com/See/PostSharp.aspx"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I didn’t use it those aspects because they require Postsharp in place for the IL weaving and that would complicated even more the infrastructure code required to run the sample app, and also my experience tells me that Postsharp will work only if you are in control of the application (that means, the source code)…the approach I used here would work in a environment where the features are loaded using a plugin architecture.&lt;/p&gt;&lt;p&gt;You can download the sample app from &lt;a href="http://emiajnetsamples.googlecode.com/files/ContactsManager.zip"&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;See you soon.&lt;/p&gt;  &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12895914-6348897664024874796?l=emiajnet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://emiajnet.blogspot.com/feeds/6348897664024874796/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12895914&amp;postID=6348897664024874796' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12895914/posts/default/6348897664024874796'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12895914/posts/default/6348897664024874796'/><link rel='alternate' type='text/html' href='http://emiajnet.blogspot.com/2010/09/logging-and-metrics-using-gibraltar.html' title='Logging and Metrics using Gibraltar – A Windows Form Sample App'/><author><name>jaime</name><uri>http://www.blogger.com/profile/05400435935764737984</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_-4wV51cifeA/TJB4a934JQI/AAAAAAAAAKE/LR2O-_qZcJ4/s72-c/image_thumb2.png?imgmax=800' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12895914.post-3417180579990292588</id><published>2010-07-08T18:24:00.001-05:00</published><updated>2010-07-09T12:54:58.309-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Refactoring'/><category scheme='http://www.blogger.com/atom/ns#' term='IoC'/><category scheme='http://www.blogger.com/atom/ns#' term='DI'/><category scheme='http://www.blogger.com/atom/ns#' term='codeproject'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='NUnit'/><category scheme='http://www.blogger.com/atom/ns#' term='.Net'/><category scheme='http://www.blogger.com/atom/ns#' term='TDD'/><title type='text'>Dealing with legacy code when using TDD</title><content type='html'>&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h2&gt;Introduction&lt;/h2&gt;  &lt;p&gt;You may have heard about TDD lately and how great it is and so on, but most the time we work on projects that have a large code base and we are not allowed to make drastic changes.&lt;/p&gt;  &lt;h2&gt;Tools&lt;/h2&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://www.nunit.org/" target="_blank"&gt;NUnit&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;h2&gt;Scenarios&lt;/h2&gt;  &lt;p&gt;In my experience some of the scenarios we face when refactoring legacy code are:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;We are free to apply the changes we want, the world is perfect. :) &lt;/li&gt;    &lt;li&gt;We can apply the changes we want but only with unit testing purposes, production code should work as usual. &lt;/li&gt;    &lt;li&gt;We are not allowed to change any part of the code except infrastructure but remembering that things must work as always did, no breaking changes allowed. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Let’s elaborated on each one of those scenarios and how do we perform our changes to make legacy code more testable.&lt;/p&gt;  &lt;h2&gt;Concrete Example&lt;/h2&gt;  &lt;pre class="code"&gt;    &lt;span style="color: #ff8000"&gt;public static class &lt;/span&gt;&lt;span style="color: yellow"&gt;DataBaseHelper&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: white"&gt;{&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #ff8000"&gt;public static void &lt;/span&gt;&lt;span style="color: white"&gt;Persist(&lt;/span&gt;&lt;span style="color: #ff8000"&gt;object &lt;/span&gt;&lt;span style="color: white"&gt;instance)&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: yellow"&gt;Console&lt;/span&gt;&lt;span style="color: white"&gt;.WriteLine(&lt;/span&gt;&lt;span style="color: lime"&gt;&amp;quot;Persisting object &amp;quot; &lt;/span&gt;&lt;span style="color: white"&gt;+ instance);&lt;br /&gt;        }&lt;br /&gt;    }&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="code"&gt;    &lt;span style="color: #ff8000"&gt;public class &lt;/span&gt;&lt;span style="color: yellow"&gt;ProductService&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: white"&gt;{&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #ff8000"&gt;public void &lt;/span&gt;&lt;span style="color: white"&gt;DisableProduct(&lt;/span&gt;&lt;span style="color: yellow"&gt;Product &lt;/span&gt;&lt;span style="color: white"&gt;product)&lt;br /&gt;        {&lt;br /&gt;            product.Enabled = &lt;/span&gt;&lt;span style="color: #ff8000"&gt;false&lt;/span&gt;&lt;span style="color: white"&gt;;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: yellow"&gt;DataBaseHelper&lt;/span&gt;&lt;span style="color: white"&gt;.Persist(product);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;As you can see, the Persist method from the DataBaseHelper does nothing, but we will assume we’ve some hard dependency with a database, perhaps an sqlconnection here an sqlcommand there and so on.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Now, what’s so bad with this piece of code? Most of us have seen,done and maintained&amp;#160; stuffs like that for years and if you’re fine with this, go ahead, I’m not here to tell you what’s wrong and what’s perfect, there’re no perfect solutions. However I would like to show you another way, a better way in my opinion.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;I asked what was bad with that piece of code and I’ve not answered that yet…Let’s see:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;  &lt;li&gt;Can you be really sure that in the following days/weeks/months/years that code will work as expected? &lt;/li&gt;&lt;br /&gt;&lt;br /&gt;  &lt;li&gt;If in the future you found a bug in the system, how would you discard the problem cause is not related to this method? And when checking this fact, do you need to have your debugger/visual studio instance up and running? &lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;I suppose that the answers didn’t were so pleasant at all, but don’t worry, the idea of this article is to help you to find a sane path when developing software by using TDD.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;What should our tests cover&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Well, there are a couple of things we should ensure in our tests:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;  &lt;li&gt;The product passed to the service method enters with its &lt;em&gt;Enabled&lt;/em&gt; property with a &lt;em&gt;True&lt;/em&gt; value, and must exits with a value of &lt;em&gt;False&lt;/em&gt;. &lt;/li&gt;&lt;br /&gt;&lt;br /&gt;  &lt;li&gt;The service should persist the updated product instance. &lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Now lets back to the Scenarios section and supply a workaround for every one of those points.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;We are free to apply the changes we want, the world is perfect. :) &lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;This allows us to use a fantastic set of patterns, I’m talking about &lt;a href="http://en.wikipedia.org/wiki/Inversion_of_control" target="_blank"&gt;Inversion Of Control&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Dependency_injection" target="_blank"&gt;Dependency Injection&lt;/a&gt;.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;By using that, we can make the following changes:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="code"&gt;    &lt;span style="color: #ff8000"&gt;public class &lt;/span&gt;&lt;span style="color: yellow"&gt;ProductService&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: white"&gt;{&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #ff8000"&gt;private readonly &lt;/span&gt;&lt;span style="color: #2b91af"&gt;IProductRepository &lt;/span&gt;&lt;span style="color: white"&gt;_productRepository;&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #ff8000"&gt;public &lt;/span&gt;&lt;span style="color: white"&gt;ProductService(&lt;/span&gt;&lt;span style="color: #2b91af"&gt;IProductRepository &lt;/span&gt;&lt;span style="color: white"&gt;productRepository)&lt;br /&gt;        {&lt;br /&gt;            _productRepository = productRepository;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #ff8000"&gt;public void &lt;/span&gt;&lt;span style="color: white"&gt;DisableProduct(&lt;/span&gt;&lt;span style="color: yellow"&gt;Product &lt;/span&gt;&lt;span style="color: white"&gt;product)&lt;br /&gt;        {&lt;br /&gt;            product.Enabled = &lt;/span&gt;&lt;span style="color: #ff8000"&gt;false&lt;/span&gt;&lt;span style="color: white"&gt;;&lt;br /&gt;            _productRepository.Persist(product);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="code"&gt;    &lt;span style="color: #ff8000"&gt;public interface &lt;/span&gt;&lt;span style="color: #2b91af"&gt;IProductRepository&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: white"&gt;{&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #ff8000"&gt;void &lt;/span&gt;&lt;span style="color: white"&gt;Persist(&lt;/span&gt;&lt;span style="color: yellow"&gt;Product &lt;/span&gt;&lt;span style="color: white"&gt;product);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="code"&gt;    &lt;span style="color: #ff8000"&gt;public class &lt;/span&gt;&lt;span style="color: yellow"&gt;ProductRepository &lt;/span&gt;&lt;span style="color: white"&gt;: &lt;/span&gt;&lt;span style="color: #2b91af"&gt;IProductRepository&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: white"&gt;{&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #ff8000"&gt;public void &lt;/span&gt;&lt;span style="color: white"&gt;Persist(&lt;/span&gt;&lt;span style="color: yellow"&gt;Product &lt;/span&gt;&lt;span style="color: white"&gt;product)&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: yellow"&gt;DataBaseHelper&lt;/span&gt;&lt;span style="color: white"&gt;.Persist(product);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="code"&gt;    &lt;span style="color: #ff8000"&gt;public static class &lt;/span&gt;&lt;span style="color: yellow"&gt;DataBaseHelper&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: white"&gt;{&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #ff8000"&gt;public static void &lt;/span&gt;&lt;span style="color: white"&gt;Persist(&lt;/span&gt;&lt;span style="color: #ff8000"&gt;object &lt;/span&gt;&lt;span style="color: white"&gt;instance)&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: yellow"&gt;Console&lt;/span&gt;&lt;span style="color: white"&gt;.WriteLine(&lt;/span&gt;&lt;span style="color: lime"&gt;&amp;quot;Persisting object &amp;quot; &lt;/span&gt;&lt;span style="color: white"&gt;+ instance);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="code"&gt;And introduce the following tests:&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="code"&gt;    &lt;span style="color: #ff8000"&gt;public class &lt;/span&gt;&lt;span style="color: yellow"&gt;Scenario1Tests&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: white"&gt;{&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #ff8000"&gt;#region &lt;/span&gt;&lt;span style="color: white"&gt;Mocks&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #ff8000"&gt;private class &lt;/span&gt;&lt;span style="color: yellow"&gt;NoOpProductRepository &lt;/span&gt;&lt;span style="color: white"&gt;: &lt;/span&gt;&lt;span style="color: #2b91af"&gt;IProductRepository&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: white"&gt;{&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #ff8000"&gt;public void &lt;/span&gt;&lt;span style="color: white"&gt;Persist(&lt;/span&gt;&lt;span style="color: yellow"&gt;Product &lt;/span&gt;&lt;span style="color: white"&gt;product)&lt;br /&gt;            {&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: green"&gt;// no-op&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: white"&gt;}&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #ff8000"&gt;private class &lt;/span&gt;&lt;span style="color: yellow"&gt;VerifiableProductRepository &lt;/span&gt;&lt;span style="color: white"&gt;: &lt;/span&gt;&lt;span style="color: #2b91af"&gt;IProductRepository&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: white"&gt;{&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #ff8000"&gt;public event &lt;/span&gt;&lt;span style="color: yellow"&gt;Action&lt;/span&gt;&lt;span style="color: white"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: yellow"&gt;Product&lt;/span&gt;&lt;span style="color: white"&gt;&amp;gt; ProductPersisted;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #ff8000"&gt;public void &lt;/span&gt;&lt;span style="color: white"&gt;Persist(&lt;/span&gt;&lt;span style="color: yellow"&gt;Product &lt;/span&gt;&lt;span style="color: white"&gt;product)&lt;br /&gt;            {&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #ff8000"&gt;var &lt;/span&gt;&lt;span style="color: white"&gt;productPersistedEvent = ProductPersisted;&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #ff8000"&gt;if &lt;/span&gt;&lt;span style="color: white"&gt;(productPersistedEvent != &lt;/span&gt;&lt;span style="color: #ff8000"&gt;null&lt;/span&gt;&lt;span style="color: white"&gt;)&lt;br /&gt;                    productPersistedEvent(product);&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #ff8000"&gt;#endregion&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: white"&gt;[&lt;/span&gt;&lt;span style="color: yellow"&gt;Test&lt;/span&gt;&lt;span style="color: white"&gt;]&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #ff8000"&gt;public void &lt;/span&gt;&lt;span style="color: white"&gt;when_disabling_a_product_its_enabled_property_is_set_to_false()&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: green"&gt;// Arrange&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #ff8000"&gt;var &lt;/span&gt;&lt;span style="color: white"&gt;product = &lt;/span&gt;&lt;span style="color: #ff8000"&gt;new &lt;/span&gt;&lt;span style="color: yellow"&gt;Product&lt;br /&gt;                              &lt;/span&gt;&lt;span style="color: white"&gt;{&lt;br /&gt;                                  ProductId = 1,&lt;br /&gt;                                  ProductName = &lt;/span&gt;&lt;span style="color: lime"&gt;&amp;quot;Car&amp;quot;&lt;/span&gt;&lt;span style="color: white"&gt;,&lt;br /&gt;                                  Enabled = &lt;/span&gt;&lt;span style="color: #ff8000"&gt;true&lt;br /&gt;                              &lt;/span&gt;&lt;span style="color: white"&gt;};&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: green"&gt;// here we should use a mocking framework like Moq or Rhino.Mocks.&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #2b91af"&gt;IProductRepository &lt;/span&gt;&lt;span style="color: white"&gt;mockedRepository = &lt;/span&gt;&lt;span style="color: #ff8000"&gt;new &lt;/span&gt;&lt;span style="color: yellow"&gt;NoOpProductRepository&lt;/span&gt;&lt;span style="color: white"&gt;();&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #ff8000"&gt;var &lt;/span&gt;&lt;span style="color: white"&gt;service = &lt;/span&gt;&lt;span style="color: #ff8000"&gt;new &lt;/span&gt;&lt;span style="color: yellow"&gt;ProductService&lt;/span&gt;&lt;span style="color: white"&gt;(mockedRepository);&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: green"&gt;// Act&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: white"&gt;service.DisableProduct(product);&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: green"&gt;// Assert&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: yellow"&gt;Assert&lt;/span&gt;&lt;span style="color: white"&gt;.AreEqual(&lt;/span&gt;&lt;span style="color: #ff8000"&gt;false&lt;/span&gt;&lt;span style="color: white"&gt;, product.Enabled);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        [&lt;/span&gt;&lt;span style="color: yellow"&gt;Test&lt;/span&gt;&lt;span style="color: white"&gt;]&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #ff8000"&gt;public void &lt;/span&gt;&lt;span style="color: white"&gt;when_disabling_a_product_it_persist_the_changes_using_the_product_repository()&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: green"&gt;// Arrange&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #ff8000"&gt;var &lt;/span&gt;&lt;span style="color: white"&gt;product = &lt;/span&gt;&lt;span style="color: #ff8000"&gt;new &lt;/span&gt;&lt;span style="color: yellow"&gt;Product&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: white"&gt;{&lt;br /&gt;                ProductId = 1,&lt;br /&gt;                ProductName = &lt;/span&gt;&lt;span style="color: lime"&gt;&amp;quot;Car&amp;quot;&lt;/span&gt;&lt;span style="color: white"&gt;,&lt;br /&gt;                Enabled = &lt;/span&gt;&lt;span style="color: #ff8000"&gt;true&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: white"&gt;};&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: yellow"&gt;Product &lt;/span&gt;&lt;span style="color: white"&gt;productPassedToPersistMethod = &lt;/span&gt;&lt;span style="color: #ff8000"&gt;null&lt;/span&gt;&lt;span style="color: white"&gt;;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #ff8000"&gt;var &lt;/span&gt;&lt;span style="color: white"&gt;valueOfProductEnabledPropertyPassedToPersistMethod = &lt;/span&gt;&lt;span style="color: #ff8000"&gt;false&lt;/span&gt;&lt;span style="color: white"&gt;;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: green"&gt;// here we should use a mocking framework like Moq or Rhino.Mocks.&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #ff8000"&gt;var &lt;/span&gt;&lt;span style="color: white"&gt;mockedRepository = &lt;/span&gt;&lt;span style="color: #ff8000"&gt;new &lt;/span&gt;&lt;span style="color: yellow"&gt;VerifiableProductRepository&lt;/span&gt;&lt;span style="color: white"&gt;();&lt;br /&gt;            mockedRepository.ProductPersisted +=&lt;br /&gt;                instance =&amp;gt;&lt;br /&gt;                    {&lt;br /&gt;                        productPassedToPersistMethod = instance;&lt;br /&gt;                        valueOfProductEnabledPropertyPassedToPersistMethod = instance.Enabled;&lt;br /&gt;                    };&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #ff8000"&gt;var &lt;/span&gt;&lt;span style="color: white"&gt;service = &lt;/span&gt;&lt;span style="color: #ff8000"&gt;new &lt;/span&gt;&lt;span style="color: yellow"&gt;ProductService&lt;/span&gt;&lt;span style="color: white"&gt;(mockedRepository);&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: green"&gt;// Act&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: white"&gt;service.DisableProduct(product);&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: green"&gt;// Assert&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: yellow"&gt;Assert&lt;/span&gt;&lt;span style="color: white"&gt;.IsNotNull(productPassedToPersistMethod);&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: yellow"&gt;Assert&lt;/span&gt;&lt;span style="color: white"&gt;.AreSame(product, productPassedToPersistMethod);&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: yellow"&gt;Assert&lt;/span&gt;&lt;span style="color: white"&gt;.AreEqual(&lt;/span&gt;&lt;span style="color: #ff8000"&gt;false&lt;/span&gt;&lt;span style="color: white"&gt;, valueOfProductEnabledPropertyPassedToPersistMethod);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;As you can see, those are quite drastic changes, in order to use again our &lt;em&gt;ProductService&lt;/em&gt; now we have to supply an &lt;em&gt;IProductRepository&lt;/em&gt; implementation because its constructor demands one. The usage of the static helper class to access to the database it has been moved our concrete implementation of the &lt;em&gt;ProductRepository&lt;/em&gt; which is likely to be used at runtime. This is where the usage of a IoC/DI tool like &lt;em&gt;StructureMap&lt;/em&gt; really shines because it will help us to configure such concerns (i.e. connect &lt;em&gt;IProductRepository&lt;/em&gt; with &lt;em&gt;ProductRepository&lt;/em&gt;) and make it transparent its usage.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Now what do we gain by doing this? Well, now we can test the &lt;em&gt;ProductService.&lt;/em&gt;&lt;em&gt;DisableProduct&lt;/em&gt; method at our pleasure by mocking its dependencies and ensuring everything works as expected. If someone in the future try to mess with the implementation of such method or if we’ve to introduce changes into our system, we’ll have those two unit tests to cover our backs and they’ll let us sleep tight at night. I think you can figure out what the tests does by just looking at the code, it is fairly simple and it does not take more than 10 minutes to create them.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;We can apply the changes we want but only with unit testing purposes, production code should work as usual. &lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Here we can use something called Poor Man’s Dependency Injection, you can read about it &lt;a href="http://www.lostechies.com/blogs/jimmy_bogard/archive/2009/07/03/how-not-to-do-dependency-injection-in-nerddinner.aspx" target="_blank"&gt;here&lt;/a&gt;, and let me tell you something, I agree with the thoughts Jimmy Bogard give us in that article. And I really think dear developer we should strive all the time for option number one, push harder to let management change the infrastructure to use proper architecture and a DI/IoC tool. However, the world is not perfect and management or our work environment isn’t always too kind to accept changes.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;So what we do?, we take the code from the first approach and modify the &lt;em&gt;ProductService&lt;/em&gt; class and introduce a &lt;em&gt;parameterless&lt;/em&gt; constructor which calls to the constructor that takes in an IProductRepository instance and pass to it an instance of the ProductRepository class, thus, removing the need of a DI/IoC tool to build the instances in our regards.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Here is the code to illustrate what I was mumbling in the previous paragraph:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="code"&gt;    &lt;span style="color: #ff8000"&gt;public class &lt;/span&gt;&lt;span style="color: yellow"&gt;ProductService&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: white"&gt;{&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #ff8000"&gt;private readonly &lt;/span&gt;&lt;span style="color: #2b91af"&gt;IProductRepository &lt;/span&gt;&lt;span style="color: white"&gt;_productRepository;&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #ff8000"&gt;public &lt;/span&gt;&lt;span style="color: white"&gt;ProductService()&lt;br /&gt;            : &lt;/span&gt;&lt;span style="color: #ff8000"&gt;this&lt;/span&gt;&lt;span style="color: white"&gt;(&lt;/span&gt;&lt;span style="color: #ff8000"&gt;new &lt;/span&gt;&lt;span style="color: yellow"&gt;ProductRepository&lt;/span&gt;&lt;span style="color: white"&gt;())&lt;br /&gt;        {&lt;br /&gt;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #ff8000"&gt;public &lt;/span&gt;&lt;span style="color: white"&gt;ProductService(&lt;/span&gt;&lt;span style="color: #2b91af"&gt;IProductRepository &lt;/span&gt;&lt;span style="color: white"&gt;productRepository)&lt;br /&gt;        {&lt;br /&gt;            _productRepository = productRepository;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #ff8000"&gt;public void &lt;/span&gt;&lt;span style="color: white"&gt;DisableProduct(&lt;/span&gt;&lt;span style="color: yellow"&gt;Product &lt;/span&gt;&lt;span style="color: white"&gt;product)&lt;br /&gt;        {&lt;br /&gt;            product.Enabled = &lt;/span&gt;&lt;span style="color: #ff8000"&gt;false&lt;/span&gt;&lt;span style="color: white"&gt;;&lt;br /&gt;            _productRepository.Persist(product);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;The tests and all the other stuff we added remain the same, we still have a testable &lt;em&gt;ProductService&lt;/em&gt; class.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;We are not allowed to change any part of the code except infrastructure but remembering that things must work as always did, no breaking changes allowed. &lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;This means, no interfaces, no repositories, nothing, thus, no new concepts are allowed to be introduced into the principal code base, you should keep your changes as low as possible.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Well, I must reckon that does not let us with much choices to pick from…but even in such inflexible environment we can do better with simple approaches.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;What we will do is to take our helper and make it flexible enough to allow us check the &lt;em&gt;ProductService&lt;/em&gt; will work as expected in the future. Certainly this technique isn’t mine, at the moment I can find the resource where I first time read about it, so, if someone have a link, be my guest.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="code"&gt;    &lt;span style="color: #ff8000"&gt;public static class &lt;/span&gt;&lt;span style="color: yellow"&gt;DataBaseHelper&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: white"&gt;{&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #ff8000"&gt;private static &lt;/span&gt;&lt;span style="color: yellow"&gt;Action&lt;/span&gt;&lt;span style="color: white"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #ff8000"&gt;object&lt;/span&gt;&lt;span style="color: white"&gt;&amp;gt; _persistenceDelegate;&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #ff8000"&gt;static &lt;/span&gt;&lt;span style="color: white"&gt;DataBaseHelper()&lt;br /&gt;        {&lt;br /&gt;            _persistenceDelegate = instance =&amp;gt; &lt;/span&gt;&lt;span style="color: yellow"&gt;Console&lt;/span&gt;&lt;span style="color: white"&gt;.WriteLine(&lt;/span&gt;&lt;span style="color: lime"&gt;&amp;quot;Persisting object &amp;quot; &lt;/span&gt;&lt;span style="color: white"&gt;+ instance);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #ff8000"&gt;public static void &lt;/span&gt;&lt;span style="color: white"&gt;SetPersistenceDelegate(&lt;/span&gt;&lt;span style="color: yellow"&gt;Action&lt;/span&gt;&lt;span style="color: white"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #ff8000"&gt;object&lt;/span&gt;&lt;span style="color: white"&gt;&amp;gt; persistenceDelegate)&lt;br /&gt;        {&lt;br /&gt;            _persistenceDelegate = persistenceDelegate;&lt;br /&gt;        }&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #ff8000"&gt;public static &lt;/span&gt;&lt;span style="color: yellow"&gt;Action&lt;/span&gt;&lt;span style="color: white"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #ff8000"&gt;object&lt;/span&gt;&lt;span style="color: white"&gt;&amp;gt; GetPersistenceDelegate()&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #ff8000"&gt;return &lt;/span&gt;&lt;span style="color: white"&gt;_persistenceDelegate;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #ff8000"&gt;public static void &lt;/span&gt;&lt;span style="color: white"&gt;Persist(&lt;/span&gt;&lt;span style="color: #ff8000"&gt;object &lt;/span&gt;&lt;span style="color: white"&gt;instance)&lt;br /&gt;        {&lt;br /&gt;            _persistenceDelegate(instance);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;As you can see, our static helper now can swap the logic used in the &lt;em&gt;Persist&lt;/em&gt; method by way of the &lt;em&gt;SetPersistenceDelegate&lt;/em&gt; method, the GetPersistenceDelegate is there only to satisfy the unit test needs, we would like to reset the value of the delegate on each test (don’t worry I’ll show this later). Another thing to note is that those two methods are public, well, I suppose we could make them internal and allow only the unit test assembly to use them, is up to the reader to do that too, for the sake of this demo I think it is ok (hint:&lt;a href="http://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.internalsvisibletoattribute.aspx" target="_blank"&gt;InternalsVisibleToAttribute&lt;/a&gt;).&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Now, let’s see how our unit tests look like:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="code"&gt;    &lt;span style="color: #ff8000"&gt;public class &lt;/span&gt;&lt;span style="color: yellow"&gt;Scenario3Tests&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: white"&gt;{&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #ff8000"&gt;#region &lt;/span&gt;&lt;span style="color: white"&gt;Init, Before and After each test&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #ff8000"&gt;private &lt;/span&gt;&lt;span style="color: yellow"&gt;Action&lt;/span&gt;&lt;span style="color: white"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #ff8000"&gt;object&lt;/span&gt;&lt;span style="color: white"&gt;&amp;gt; _originalDelegate;&lt;br /&gt;&lt;br /&gt;        [&lt;/span&gt;&lt;span style="color: yellow"&gt;TestFixtureSetUp&lt;/span&gt;&lt;span style="color: white"&gt;]&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #ff8000"&gt;protected  void &lt;/span&gt;&lt;span style="color: white"&gt;Init()&lt;br /&gt;        {&lt;br /&gt;            _originalDelegate = &lt;/span&gt;&lt;span style="color: yellow"&gt;DataBaseHelper&lt;/span&gt;&lt;span style="color: white"&gt;.GetPersistenceDelegate();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        [&lt;/span&gt;&lt;span style="color: yellow"&gt;SetUp&lt;/span&gt;&lt;span style="color: white"&gt;]&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #ff8000"&gt;protected void &lt;/span&gt;&lt;span style="color: white"&gt;BeforeEachTest()&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: yellow"&gt;DataBaseHelper&lt;/span&gt;&lt;span style="color: white"&gt;.SetPersistenceDelegate(_originalDelegate);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        [&lt;/span&gt;&lt;span style="color: yellow"&gt;TearDown&lt;/span&gt;&lt;span style="color: white"&gt;]&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #ff8000"&gt;protected void &lt;/span&gt;&lt;span style="color: white"&gt;AfterEachTest()&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: yellow"&gt;DataBaseHelper&lt;/span&gt;&lt;span style="color: white"&gt;.SetPersistenceDelegate(_originalDelegate);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #ff8000"&gt;#endregion&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: white"&gt;[&lt;/span&gt;&lt;span style="color: yellow"&gt;Test&lt;/span&gt;&lt;span style="color: white"&gt;]&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #ff8000"&gt;public void &lt;/span&gt;&lt;span style="color: white"&gt;when_disabling_a_product_its_enabled_property_is_set_to_false()&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: green"&gt;// Arrange&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #ff8000"&gt;var &lt;/span&gt;&lt;span style="color: white"&gt;product = &lt;/span&gt;&lt;span style="color: #ff8000"&gt;new &lt;/span&gt;&lt;span style="color: yellow"&gt;Product&lt;br /&gt;                              &lt;/span&gt;&lt;span style="color: white"&gt;{&lt;br /&gt;                                  ProductId = 1,&lt;br /&gt;                                  ProductName = &lt;/span&gt;&lt;span style="color: lime"&gt;&amp;quot;Car&amp;quot;&lt;/span&gt;&lt;span style="color: white"&gt;,&lt;br /&gt;                                  Enabled = &lt;/span&gt;&lt;span style="color: #ff8000"&gt;true&lt;br /&gt;                              &lt;/span&gt;&lt;span style="color: white"&gt;};&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #ff8000"&gt;var &lt;/span&gt;&lt;span style="color: white"&gt;service = &lt;/span&gt;&lt;span style="color: #ff8000"&gt;new &lt;/span&gt;&lt;span style="color: yellow"&gt;ProductService&lt;/span&gt;&lt;span style="color: white"&gt;();&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: green"&gt;// Act&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: white"&gt;service.DisableProduct(product);&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="code"&gt;            &lt;span style="color: yellow"&gt;DataBaseHelper&lt;/span&gt;&lt;span style="color: white"&gt;.SetPersistenceDelegate(instance =&amp;gt;&lt;br /&gt;                                                      {&lt;br /&gt;                                                          &lt;/span&gt;&lt;span style="color: green"&gt;// no-op! &lt;br /&gt;                                                      &lt;/span&gt;&lt;span style="color: white"&gt;});&lt;/span&gt;&lt;span style="color: white"&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: green"&gt;// Assert&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: yellow"&gt;Assert&lt;/span&gt;&lt;span style="color: white"&gt;.AreEqual(&lt;/span&gt;&lt;span style="color: #ff8000"&gt;false&lt;/span&gt;&lt;span style="color: white"&gt;, product.Enabled);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        [&lt;/span&gt;&lt;span style="color: yellow"&gt;Test&lt;/span&gt;&lt;span style="color: white"&gt;]&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #ff8000"&gt;public void &lt;/span&gt;&lt;span style="color: white"&gt;when_disabling_a_product_it_persist_the_changes_using_the_product_repository()&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: green"&gt;// Arrange&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #ff8000"&gt;var &lt;/span&gt;&lt;span style="color: white"&gt;product = &lt;/span&gt;&lt;span style="color: #ff8000"&gt;new &lt;/span&gt;&lt;span style="color: yellow"&gt;Product&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: white"&gt;{&lt;br /&gt;                ProductId = 1,&lt;br /&gt;                ProductName = &lt;/span&gt;&lt;span style="color: lime"&gt;&amp;quot;Car&amp;quot;&lt;/span&gt;&lt;span style="color: white"&gt;,&lt;br /&gt;                Enabled = &lt;/span&gt;&lt;span style="color: #ff8000"&gt;true&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: white"&gt;};&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: yellow"&gt;Product &lt;/span&gt;&lt;span style="color: white"&gt;productPassedToPersistMethod = &lt;/span&gt;&lt;span style="color: #ff8000"&gt;null&lt;/span&gt;&lt;span style="color: white"&gt;;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #ff8000"&gt;var &lt;/span&gt;&lt;span style="color: white"&gt;valueOfProductEnabledPropertyPassedToPersistMethod = &lt;/span&gt;&lt;span style="color: #ff8000"&gt;false&lt;/span&gt;&lt;span style="color: white"&gt;;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: yellow"&gt;DataBaseHelper&lt;/span&gt;&lt;span style="color: white"&gt;.SetPersistenceDelegate(&lt;br /&gt;                instance =&amp;gt;&lt;br /&gt;                    {&lt;br /&gt;                        productPassedToPersistMethod = (&lt;/span&gt;&lt;span style="color: yellow"&gt;Product&lt;/span&gt;&lt;span style="color: white"&gt;) instance;&lt;br /&gt;                        valueOfProductEnabledPropertyPassedToPersistMethod = productPassedToPersistMethod.Enabled;&lt;br /&gt;                    });&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #ff8000"&gt;var &lt;/span&gt;&lt;span style="color: white"&gt;service = &lt;/span&gt;&lt;span style="color: #ff8000"&gt;new &lt;/span&gt;&lt;span style="color: yellow"&gt;ProductService&lt;/span&gt;&lt;span style="color: white"&gt;();&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: green"&gt;// Act&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: white"&gt;service.DisableProduct(product);&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: green"&gt;// Assert&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: yellow"&gt;Assert&lt;/span&gt;&lt;span style="color: white"&gt;.IsNotNull(productPassedToPersistMethod);&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: yellow"&gt;Assert&lt;/span&gt;&lt;span style="color: white"&gt;.AreSame(product, productPassedToPersistMethod);&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: yellow"&gt;Assert&lt;/span&gt;&lt;span style="color: white"&gt;.AreEqual(&lt;/span&gt;&lt;span style="color: #ff8000"&gt;false&lt;/span&gt;&lt;span style="color: white"&gt;, valueOfProductEnabledPropertyPassedToPersistMethod);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;As you can see, the underlying idea of the tests remain the same, instead of using mocked repositories, we are using custom delegates and updating the helper delegate per test run to fit the test needs.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Finale&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Well, I hope this article have gave you dear reader an idea of how to unit test legacy code. Please bear with me if I’ve made some silly statement, if so, please let me know so I can learn a few tricks too ;)&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Also, I’ve not quite explained very well how a DI/IoC tool should be used to help us to resolve the dependencies at runtime, I’ll try to make another article to explain this, if you can’t wait there’s plenty of articles out there in the net from where you can learn of this subject.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;You can download the sample code from &lt;a href="http://emiajnetsamples.googlecode.com/files/Testing%20Legacy%20Code.zip" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12895914-3417180579990292588?l=emiajnet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://emiajnet.blogspot.com/feeds/3417180579990292588/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12895914&amp;postID=3417180579990292588' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12895914/posts/default/3417180579990292588'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12895914/posts/default/3417180579990292588'/><link rel='alternate' type='text/html' href='http://emiajnet.blogspot.com/2010/07/dealing-with-legacy-code-when-using-tdd.html' title='Dealing with legacy code when using TDD'/><author><name>jaime</name><uri>http://www.blogger.com/profile/05400435935764737984</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12895914.post-1503789022197216591</id><published>2009-12-14T14:21:00.001-05:00</published><updated>2009-12-14T14:21:09.057-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='codeproject'/><category scheme='http://www.blogger.com/atom/ns#' term='Reactive Extensions'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='.Net'/><title type='text'>A quick look at the Reactive Extensions (Rx) for .Net</title><content type='html'>&lt;h2&gt;Introduction and some words about what I’ve been doing lately&lt;/h2&gt;  &lt;p&gt;Hello everyone, first of all, let me tell you that I’ve been very busy at &lt;a href="http://www.sansir.net/" target="_blank"&gt;work&lt;/a&gt;, we finally released a site for one of our customers and is a pleasure to see our hard work materialized in such a nice website.     &lt;br /&gt;We worked pretty hard particularly in the eCommerce module, which lead us to learn a lot of new paradigms and&amp;#160; even more tools and&amp;#160; frameworks around that module. Also I think the designers made a great work on the look and feel side of things, what can I say? I’m part of a great team. You can visit the site &lt;a href="http://www.rusdrekkasolalandsins.fo/" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Furthermore, there are a couple of personal projects for the next year which had get me very excited. So stay tuned for further info about this, I know you, dear reader, will really like it :)&lt;/p&gt;  &lt;p&gt;Back to the subject, so, ¿what’s Rx?, again, I’m not so good at giving definitions or concepts, and in order to avoid any misunderstanding, here’s an excerpt from the &lt;a href="http://msdn.microsoft.com/en-us/devlabs/ee794896.aspx" target="_blank"&gt;project home page&lt;/a&gt;:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Rx is a library for composing asynchronous and event-based programs using observable collections.&lt;/p&gt;    &lt;p&gt;…&lt;/p&gt;    &lt;p&gt;Rx is a superset of the standard LINQ sequence operators that exposes asynchronous and event-based computations as push-based, observable&amp;#160; collections via the new .NET 4.0 interfaces IObservable&amp;lt;T&amp;gt; and IObserver&amp;lt;T&amp;gt;.&amp;#160; These are the mathematical dual of the familiar IEnumerable&amp;lt;T&amp;gt; and IEnumerator&amp;lt;T&amp;gt; interfaces for pull-based, enumerable collections in the .NET framework. &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;The Rx project is a new project from Microsoft and I hope you to play with it and when it becomes an stable library start using it in your projects together with other niceties that Microsoft is lately releasing to the public in general.&lt;/p&gt;  &lt;p&gt;You may infer from the excerpt above that this is only available for .Net 4.0, but in fact it is also available for .Net 3.5. Check the downloadable installers and you’ll see there are 3 different versions of Rx: One for .Net 3.5, other for .Net 4.0 Beta 2, and another for Silverlight 3.&lt;/p&gt;  &lt;p&gt;The code I’m going to present you today is using the .Net 3.5 bits (to reach a broader audience), but I think it is also applicable to .Net 4.0, I am not sure about Silverlight 3.&lt;/p&gt;  &lt;p&gt;There’s a great set of articles which will introduce you into Rx way more articulated that I’m doing it, I’ve read them all and found them very useful:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://codebetter.com/blogs/matthew.podwysocki/archive/2009/10/19/f-october-2009-ctp-beta2-f-rx-together-at-last.aspx" target="_blank"&gt;F# October 2009 CTP/Beta2 – F# + Rx Together At Last&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://codebetter.com/blogs/matthew.podwysocki/archive/2009/11/03/introduction-to-the-reactive-framework-part-ii.aspx" target="_blank"&gt;Introduction to the Reactive Framework Part II&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://codebetter.com/blogs/matthew.podwysocki/archive/2009/11/12/introduction-to-the-reactive-framework-part-iii.aspx" target="_blank"&gt;Introduction to the Reactive Framework Part III&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://codebetter.com/blogs/matthew.podwysocki/archive/2009/11/15/introduction-to-the-reactive-framework-part-iv.aspx" target="_blank"&gt;Introduction to the Reactive Framework Part IV&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://codebetter.com/blogs/matthew.podwysocki/archive/2009/11/18/introduction-to-the-reactive-framework-part-v.aspx" target="_blank"&gt;Introduction to the Reactive Framework Part V&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://codebetter.com/blogs/matthew.podwysocki/archive/2009/11/25/going-interactive-with-the-reactive-extensions.aspx" target="_blank"&gt;Going Interactive with the Reactive Extensions&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Also, there’s a wiki with a great amount of information about the Rx API which is updated from time to time, you check it out &lt;a href="http://rxwiki.wikidot.com/" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;h2&gt;demonstrating Rx usage&lt;/h2&gt;  &lt;p&gt;As usual, I tend myself to explain things in code, together with a *common* scenario, well, at least one that could slightly reflect real world issues. However, this is completely relative from developer to developer.&lt;/p&gt;  &lt;p&gt;The scenario is as follows, in our company we’ve a website that requires the following notifications:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Register all the visits. &lt;/li&gt;    &lt;li&gt;When the user visiting our site is a new one, sent a notification to the webmaster about this. &lt;/li&gt;    &lt;li&gt;When the user visiting our site is from USA or UK, sent a notification to the webmaster about this. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Those are roughly what the user tell to us, we as developer, add a couple of niceties that the user is not aware of:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;In order to avoid spamming the webmaster email account, we sent those emails by chunks X, and each feature has a way to set the threshold. For our sample we are going to set this value to 4, but in a real app you must provide perhaps a UI with a database or some other way to configure this. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Now, lets define our ISiteVisitorsService interface:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="font-family: consolas; background: #171717; color: #e0e0e0; font-size: 10pt"&gt;   &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160;&amp;#160; 1&lt;/span&gt;&amp;#160;&lt;span style="color: #40c4ff"&gt;public&lt;/span&gt; &lt;span style="color: #40c4ff"&gt;interface&lt;/span&gt; &lt;span style="color: #2b91af"&gt;ISiteVisitorsService&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160;&amp;#160; 2&lt;/span&gt; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160;&amp;#160; 3&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #40c4ff"&gt;void&lt;/span&gt; &lt;span style="color: #eee8aa"&gt;StartMonitoring&lt;/span&gt;();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160;&amp;#160; 4&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #2b91af"&gt;IObservable&lt;/span&gt;&lt;span style="color: silver"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af"&gt;IEvent&lt;/span&gt;&lt;span style="color: silver"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #66cdaa"&gt;VisitEventArgs&lt;/span&gt;&lt;span style="color: silver"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style="color: #eee8aa"&gt;NewVisitsObservable&lt;/span&gt; { &lt;span style="color: #40c4ff"&gt;get&lt;/span&gt;; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160;&amp;#160; 5&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #40c4ff"&gt;event&lt;/span&gt; &lt;span style="color: #2b91af"&gt;EventHandler&lt;/span&gt;&lt;span style="color: silver"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #66cdaa"&gt;VisitEventArgs&lt;/span&gt;&lt;span style="color: silver"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color: #eee8aa"&gt;NewVisitEvent&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160;&amp;#160; 6&lt;/span&gt; }&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;The VisitEventArgs and its surrounding classes are structured as follows:&lt;/p&gt;  &lt;div style="font-family: consolas; background: #171717; color: #e0e0e0; font-size: 10pt"&gt;   &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160;&amp;#160; 1&lt;/span&gt;&amp;#160;&lt;span style="color: #40c4ff"&gt;public&lt;/span&gt; &lt;span style="color: #40c4ff"&gt;class&lt;/span&gt; &lt;span style="color: #66cdaa"&gt;VisitEventArgs&lt;/span&gt; : &lt;span style="color: #66cdaa"&gt;EventArgs&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160;&amp;#160; 2&lt;/span&gt; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160;&amp;#160; 3&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #40c4ff"&gt;public&lt;/span&gt; &lt;span style="color: #66cdaa"&gt;VisitDetails&lt;/span&gt; &lt;span style="color: #eee8aa"&gt;VisitDetail&lt;/span&gt; { &lt;span style="color: #40c4ff"&gt;get&lt;/span&gt;; &lt;span style="color: #40c4ff"&gt;set&lt;/span&gt;; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160;&amp;#160; 4&lt;/span&gt; }&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="font-family: consolas; background: #171717; color: #e0e0e0; font-size: 10pt"&gt;   &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160;&amp;#160; 1&lt;/span&gt;&amp;#160;&lt;span style="color: #40c4ff"&gt;public&lt;/span&gt; &lt;span style="color: #40c4ff"&gt;class&lt;/span&gt; &lt;span style="color: #66cdaa"&gt;VisitDetails&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160;&amp;#160; 2&lt;/span&gt; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160;&amp;#160; 3&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #40c4ff"&gt;public&lt;/span&gt; &lt;span style="color: #40c4ff"&gt;int&lt;/span&gt; &lt;span style="color: #eee8aa"&gt;VisitId&lt;/span&gt; { &lt;span style="color: #40c4ff"&gt;get&lt;/span&gt;; &lt;span style="color: #40c4ff"&gt;set&lt;/span&gt;; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160;&amp;#160; 4&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #40c4ff"&gt;public&lt;/span&gt; &lt;span style="color: #40c4ff"&gt;string&lt;/span&gt; &lt;span style="color: #eee8aa"&gt;FirstName&lt;/span&gt; { &lt;span style="color: #40c4ff"&gt;get&lt;/span&gt;; &lt;span style="color: #40c4ff"&gt;set&lt;/span&gt;; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160;&amp;#160; 5&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #40c4ff"&gt;public&lt;/span&gt; &lt;span style="color: #40c4ff"&gt;string&lt;/span&gt; &lt;span style="color: #eee8aa"&gt;LastName&lt;/span&gt; { &lt;span style="color: #40c4ff"&gt;get&lt;/span&gt;; &lt;span style="color: #40c4ff"&gt;set&lt;/span&gt;; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160;&amp;#160; 6&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #40c4ff"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af"&gt;VisitTypes&lt;/span&gt; &lt;span style="color: #eee8aa"&gt;VisitType&lt;/span&gt; { &lt;span style="color: #40c4ff"&gt;get&lt;/span&gt;; &lt;span style="color: #40c4ff"&gt;set&lt;/span&gt;; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160;&amp;#160; 7&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #40c4ff"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Contries&lt;/span&gt; &lt;span style="color: #eee8aa"&gt;Country&lt;/span&gt; { &lt;span style="color: #40c4ff"&gt;get&lt;/span&gt;; &lt;span style="color: #40c4ff"&gt;set&lt;/span&gt;; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160;&amp;#160; 8&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #40c4ff"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af"&gt;DateTime&lt;/span&gt; &lt;span style="color: #eee8aa"&gt;VisitDate&lt;/span&gt; { &lt;span style="color: #40c4ff"&gt;get&lt;/span&gt;; &lt;span style="color: #40c4ff"&gt;set&lt;/span&gt;; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160;&amp;#160; 9&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #40c4ff"&gt;public&lt;/span&gt; &lt;span style="color: #40c4ff"&gt;int&lt;/span&gt; &lt;span style="color: #eee8aa"&gt;VisitCount&lt;/span&gt; { &lt;span style="color: #40c4ff"&gt;get&lt;/span&gt;; &lt;span style="color: #40c4ff"&gt;set&lt;/span&gt;; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 10&lt;/span&gt; }&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="font-family: consolas; background: #171717; color: #e0e0e0; font-size: 10pt"&gt;   &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160;&amp;#160; 1&lt;/span&gt;&amp;#160;&lt;span style="color: #40c4ff"&gt;public&lt;/span&gt; &lt;span style="color: #40c4ff"&gt;enum&lt;/span&gt; &lt;span style="color: #2b91af"&gt;VisitTypes&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160;&amp;#160; 2&lt;/span&gt; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160;&amp;#160; 3&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #eee8aa"&gt;FirstVisitor&lt;/span&gt; &lt;span style="color: silver"&gt;=&lt;/span&gt; &lt;span style="color: #60ff60"&gt;0&lt;/span&gt;,&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160;&amp;#160; 4&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #eee8aa"&gt;ReturningVisitor&lt;/span&gt; &lt;span style="color: silver"&gt;=&lt;/span&gt; &lt;span style="color: #60ff60"&gt;1&lt;/span&gt;,&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160;&amp;#160; 5&lt;/span&gt; }&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="font-family: consolas; background: #171717; color: #e0e0e0; font-size: 10pt"&gt;   &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160;&amp;#160; 1&lt;/span&gt;&amp;#160;&lt;span style="color: #40c4ff"&gt;public&lt;/span&gt; &lt;span style="color: #40c4ff"&gt;enum&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Contries&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160;&amp;#160; 2&lt;/span&gt; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160;&amp;#160; 3&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #eee8aa"&gt;Usa&lt;/span&gt; &lt;span style="color: silver"&gt;=&lt;/span&gt; &lt;span style="color: #60ff60"&gt;0&lt;/span&gt;,&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160;&amp;#160; 4&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #eee8aa"&gt;Uk&lt;/span&gt; &lt;span style="color: silver"&gt;=&lt;/span&gt; &lt;span style="color: #60ff60"&gt;1&lt;/span&gt;,&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160;&amp;#160; 5&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #eee8aa"&gt;China&lt;/span&gt; &lt;span style="color: silver"&gt;=&lt;/span&gt; &lt;span style="color: #60ff60"&gt;2&lt;/span&gt;,&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160;&amp;#160; 6&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #eee8aa"&gt;Other&lt;/span&gt; &lt;span style="color: silver"&gt;=&lt;/span&gt; &lt;span style="color: #60ff60"&gt;3&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160;&amp;#160; 7&lt;/span&gt; }&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="font-family: consolas; background: #171717; color: #e0e0e0; font-size: 10pt"&gt;   &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160;&amp;#160; 1&lt;/span&gt;&amp;#160;&lt;span style="color: #40c4ff"&gt;public&lt;/span&gt; &lt;span style="color: #40c4ff"&gt;static&lt;/span&gt; &lt;span style="color: #40c4ff"&gt;class&lt;/span&gt; &lt;span style="color: #66cdaa"&gt;VisitorHandlerHelper&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160;&amp;#160; 2&lt;/span&gt; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160;&amp;#160; 3&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #40c4ff"&gt;public&lt;/span&gt; &lt;span style="color: #40c4ff"&gt;static&lt;/span&gt; &lt;span style="color: #40c4ff"&gt;void&lt;/span&gt; &lt;span style="color: #eee8aa"&gt;LogVisit&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;IEnumerable&lt;/span&gt;&lt;span style="color: silver"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #66cdaa"&gt;VisitDetails&lt;/span&gt;&lt;span style="color: silver"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color: #eee8aa"&gt;visitDetails&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160;&amp;#160; 4&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160;&amp;#160; 5&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #40c4ff"&gt;foreach&lt;/span&gt; (&lt;span style="color: #40c4ff"&gt;var&lt;/span&gt; &lt;span style="color: #eee8aa"&gt;visitDetail&lt;/span&gt; &lt;span style="color: #40c4ff"&gt;in&lt;/span&gt; &lt;span style="color: #eee8aa"&gt;visitDetails&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160;&amp;#160; 6&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160;&amp;#160; 7&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #66cdaa"&gt;Console&lt;/span&gt;&lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;WriteLine&lt;/span&gt;();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160;&amp;#160; 8&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #66cdaa"&gt;Console&lt;/span&gt;&lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;WriteLine&lt;/span&gt;(&lt;span style="color: #60ff60"&gt;&amp;quot;Registering visit =&amp;gt; {0}: {1} {2} {3} {4} {5} {6}&amp;quot;&lt;/span&gt;, &lt;span style="color: #eee8aa"&gt;visitDetail&lt;/span&gt;&lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;VisitId&lt;/span&gt;,&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160;&amp;#160; 9&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #eee8aa"&gt;visitDetail&lt;/span&gt;&lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;FirstName&lt;/span&gt;, &lt;span style="color: #eee8aa"&gt;visitDetail&lt;/span&gt;&lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;LastName&lt;/span&gt;, &lt;span style="color: #eee8aa"&gt;visitDetail&lt;/span&gt;&lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;VisitType&lt;/span&gt;,&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 10&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #eee8aa"&gt;visitDetail&lt;/span&gt;&lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;Country&lt;/span&gt;,&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 11&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #eee8aa"&gt;visitDetail&lt;/span&gt;&lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;VisitDate&lt;/span&gt;, &lt;span style="color: #eee8aa"&gt;visitDetail&lt;/span&gt;&lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;VisitCount&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 12&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 13&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 14&lt;/span&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 15&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #40c4ff"&gt;public&lt;/span&gt; &lt;span style="color: #40c4ff"&gt;static&lt;/span&gt; &lt;span style="color: #40c4ff"&gt;void&lt;/span&gt; &lt;span style="color: #eee8aa"&gt;SendEmailForEnglishSpeakersVisitors&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;IEnumerable&lt;/span&gt;&lt;span style="color: silver"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #66cdaa"&gt;VisitDetails&lt;/span&gt;&lt;span style="color: silver"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color: #eee8aa"&gt;visitDetails&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 16&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 17&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #40c4ff"&gt;foreach&lt;/span&gt; (&lt;span style="color: #40c4ff"&gt;var&lt;/span&gt; &lt;span style="color: #eee8aa"&gt;visitDetail&lt;/span&gt; &lt;span style="color: #40c4ff"&gt;in&lt;/span&gt; &lt;span style="color: #eee8aa"&gt;visitDetails&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 18&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 19&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #66cdaa"&gt;Console&lt;/span&gt;&lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;WriteLine&lt;/span&gt;(&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 20&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #60ff60"&gt;&amp;quot;Sending email to webmaster notifying an english speaker visitor =&amp;gt; {0}: {1} {2} - {3}&amp;quot;&lt;/span&gt;,&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 21&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #eee8aa"&gt;visitDetail&lt;/span&gt;&lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;VisitId&lt;/span&gt;,&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 22&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #eee8aa"&gt;visitDetail&lt;/span&gt;&lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;FirstName&lt;/span&gt;,&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 23&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #eee8aa"&gt;visitDetail&lt;/span&gt;&lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;LastName&lt;/span&gt;,&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 24&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #eee8aa"&gt;visitDetail&lt;/span&gt;&lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;Country&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 25&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 26&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 27&lt;/span&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 28&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #40c4ff"&gt;public&lt;/span&gt; &lt;span style="color: #40c4ff"&gt;static&lt;/span&gt; &lt;span style="color: #40c4ff"&gt;void&lt;/span&gt; &lt;span style="color: #eee8aa"&gt;SendFirstVisitorMessage&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;IEnumerable&lt;/span&gt;&lt;span style="color: silver"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #66cdaa"&gt;VisitDetails&lt;/span&gt;&lt;span style="color: silver"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color: #eee8aa"&gt;visitDetails&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 29&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 30&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #40c4ff"&gt;foreach&lt;/span&gt; (&lt;span style="color: #40c4ff"&gt;var&lt;/span&gt; &lt;span style="color: #eee8aa"&gt;visitDetail&lt;/span&gt; &lt;span style="color: #40c4ff"&gt;in&lt;/span&gt; &lt;span style="color: #eee8aa"&gt;visitDetails&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 31&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 32&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #66cdaa"&gt;Console&lt;/span&gt;&lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;WriteLine&lt;/span&gt;(&lt;span style="color: #60ff60"&gt;&amp;quot;Sending email to webmaster notifying a new visitor =&amp;gt; {0}: {1} {2} {3} {4} {5}&amp;quot;&lt;/span&gt;,&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 33&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #eee8aa"&gt;visitDetail&lt;/span&gt;&lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;VisitId&lt;/span&gt;,&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 34&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #eee8aa"&gt;visitDetail&lt;/span&gt;&lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;FirstName&lt;/span&gt;,&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 35&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #eee8aa"&gt;visitDetail&lt;/span&gt;&lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;LastName&lt;/span&gt;,&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 36&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #eee8aa"&gt;visitDetail&lt;/span&gt;&lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;Country&lt;/span&gt;,&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 37&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #eee8aa"&gt;visitDetail&lt;/span&gt;&lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;VisitType&lt;/span&gt;,&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 38&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #eee8aa"&gt;visitDetail&lt;/span&gt;&lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;VisitCount&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 39&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 40&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 41&lt;/span&gt; }&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;I provide two flavors to hook into the scenario where a new visitor arrives, the old fashioned will use the NewVisitEvent, and the others could use the Rx IObservable interface. I’ve added to StartMonitoring method to tell the service to enable firing events when new visitors land to our site. Obviously, I’m have no plans in implement a real monitoring service, rather you’ll see a faked service here. The implementations looks as follows:&lt;/p&gt;  &lt;div style="font-family: consolas; background: #171717; color: #e0e0e0; font-size: 10pt"&gt;   &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160;&amp;#160; 1&lt;/span&gt;&amp;#160;&lt;span style="color: #40c4ff"&gt;public&lt;/span&gt; &lt;span style="color: #40c4ff"&gt;class&lt;/span&gt; &lt;span style="color: #66cdaa"&gt;SiteVisitorsService&lt;/span&gt; : &lt;span style="color: #2b91af"&gt;ISiteVisitorsService&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160;&amp;#160; 2&lt;/span&gt; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160;&amp;#160; 3&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #40c4ff"&gt;private&lt;/span&gt; &lt;span style="color: #40c4ff"&gt;readonly&lt;/span&gt; &lt;span style="color: #2b91af"&gt;IObservable&lt;/span&gt;&lt;span style="color: silver"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af"&gt;IEvent&lt;/span&gt;&lt;span style="color: silver"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #66cdaa"&gt;VisitEventArgs&lt;/span&gt;&lt;span style="color: silver"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style="color: #eee8aa"&gt;_visitsObservable&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160;&amp;#160; 4&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #40c4ff"&gt;private&lt;/span&gt; &lt;span style="color: #40c4ff"&gt;readonly&lt;/span&gt; &lt;span style="color: #40c4ff"&gt;string&lt;/span&gt;[] &lt;span style="color: #eee8aa"&gt;_names&lt;/span&gt; &lt;span style="color: silver"&gt;=&lt;/span&gt; &lt;span style="color: #40c4ff"&gt;new&lt;/span&gt;[] { &lt;span style="color: #60ff60"&gt;&amp;quot;John&amp;quot;&lt;/span&gt;, &lt;span style="color: #60ff60"&gt;&amp;quot;Alex&amp;quot;&lt;/span&gt;, &lt;span style="color: #60ff60"&gt;&amp;quot;Jose&amp;quot;&lt;/span&gt;, &lt;span style="color: #60ff60"&gt;&amp;quot;Frank&amp;quot;&lt;/span&gt;, &lt;span style="color: #60ff60"&gt;&amp;quot;Laura&amp;quot;&lt;/span&gt;, &lt;span style="color: #60ff60"&gt;&amp;quot;Marco&amp;quot;&lt;/span&gt;, &lt;span style="color: #60ff60"&gt;&amp;quot;Mary&amp;quot;&lt;/span&gt; };&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160;&amp;#160; 5&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #40c4ff"&gt;private&lt;/span&gt; &lt;span style="color: #40c4ff"&gt;readonly&lt;/span&gt; &lt;span style="color: #40c4ff"&gt;string&lt;/span&gt;[] &lt;span style="color: #eee8aa"&gt;_lastNames&lt;/span&gt; &lt;span style="color: silver"&gt;=&lt;/span&gt; &lt;span style="color: #40c4ff"&gt;new&lt;/span&gt;[] { &lt;span style="color: #60ff60"&gt;&amp;quot;Cruz&amp;quot;&lt;/span&gt;, &lt;span style="color: #60ff60"&gt;&amp;quot;Smith&amp;quot;&lt;/span&gt;, &lt;span style="color: #60ff60"&gt;&amp;quot;Gonzales&amp;quot;&lt;/span&gt;, &lt;span style="color: #60ff60"&gt;&amp;quot;Garcia&amp;quot;&lt;/span&gt;, &lt;span style="color: #60ff60"&gt;&amp;quot;Williams&amp;quot;&lt;/span&gt; };&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160;&amp;#160; 6&lt;/span&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160;&amp;#160; 7&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #40c4ff"&gt;public&lt;/span&gt; &lt;span style="color: #40c4ff"&gt;event&lt;/span&gt; &lt;span style="color: #2b91af"&gt;EventHandler&lt;/span&gt;&lt;span style="color: silver"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #66cdaa"&gt;VisitEventArgs&lt;/span&gt;&lt;span style="color: silver"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color: #eee8aa"&gt;NewVisitEvent&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160;&amp;#160; 8&lt;/span&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160;&amp;#160; 9&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #40c4ff"&gt;public&lt;/span&gt; &lt;span style="color: #eee8aa"&gt;SiteVisitorsService&lt;/span&gt;()&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 10&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 11&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #eee8aa"&gt;_visitsObservable&lt;/span&gt; &lt;span style="color: silver"&gt;=&lt;/span&gt; &lt;span style="color: #66cdaa"&gt;Observable&lt;/span&gt;&lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;FromEvent&lt;/span&gt;&lt;span style="color: silver"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #66cdaa"&gt;VisitEventArgs&lt;/span&gt;&lt;span style="color: silver"&gt;&amp;gt;&lt;/span&gt;(&lt;span style="color: #eee8aa"&gt;handler&lt;/span&gt; &lt;span style="color: silver"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color: #eee8aa"&gt;NewVisitEvent&lt;/span&gt; &lt;span style="color: silver"&gt;+=&lt;/span&gt; &lt;span style="color: #eee8aa"&gt;handler&lt;/span&gt;,&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 12&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #eee8aa"&gt;handler&lt;/span&gt; &lt;span style="color: silver"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color: #eee8aa"&gt;NewVisitEvent&lt;/span&gt; &lt;span style="color: silver"&gt;-=&lt;/span&gt; &lt;span style="color: #eee8aa"&gt;handler&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 13&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 14&lt;/span&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 15&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #40c4ff"&gt;public&lt;/span&gt; &lt;span style="color: #40c4ff"&gt;void&lt;/span&gt; &lt;span style="color: #eee8aa"&gt;StartMonitoring&lt;/span&gt;()&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 16&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 17&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #66cdaa"&gt;ThreadPool&lt;/span&gt;&lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;QueueUserWorkItem&lt;/span&gt;(&lt;span style="color: #eee8aa"&gt;runSimulation&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 18&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 19&lt;/span&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 20&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #40c4ff"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af"&gt;IObservable&lt;/span&gt;&lt;span style="color: silver"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #2b91af"&gt;IEvent&lt;/span&gt;&lt;span style="color: silver"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #66cdaa"&gt;VisitEventArgs&lt;/span&gt;&lt;span style="color: silver"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style="color: #eee8aa"&gt;NewVisitObservable&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 21&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 22&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #40c4ff"&gt;get&lt;/span&gt; { &lt;span style="color: #40c4ff"&gt;return&lt;/span&gt; &lt;span style="color: #eee8aa"&gt;_visitsObservable&lt;/span&gt;; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 23&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 24&lt;/span&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 25&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #40c4ff"&gt;private&lt;/span&gt; &lt;span style="color: #40c4ff"&gt;void&lt;/span&gt; &lt;span style="color: #eee8aa"&gt;invokeNewVisitEvent&lt;/span&gt;(&lt;span style="color: #66cdaa"&gt;VisitEventArgs&lt;/span&gt; &lt;span style="color: #eee8aa"&gt;e&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 26&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 27&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #40c4ff"&gt;var&lt;/span&gt; &lt;span style="color: #eee8aa"&gt;newVisitEvent&lt;/span&gt; &lt;span style="color: silver"&gt;=&lt;/span&gt; &lt;span style="color: #eee8aa"&gt;NewVisitEvent&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 28&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #40c4ff"&gt;if&lt;/span&gt; (&lt;span style="color: #eee8aa"&gt;newVisitEvent&lt;/span&gt; &lt;span style="color: silver"&gt;!=&lt;/span&gt; &lt;span style="color: #40c4ff"&gt;null&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 29&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 30&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #eee8aa"&gt;newVisitEvent&lt;/span&gt;(&lt;span style="color: #40c4ff"&gt;this&lt;/span&gt;, &lt;span style="color: #eee8aa"&gt;e&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 31&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 32&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 33&lt;/span&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 34&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #40c4ff"&gt;private&lt;/span&gt; &lt;span style="color: #40c4ff"&gt;void&lt;/span&gt; &lt;span style="color: #eee8aa"&gt;runSimulation&lt;/span&gt;(&lt;span style="color: #40c4ff"&gt;object&lt;/span&gt; &lt;span style="color: #eee8aa"&gt;state&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 35&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 36&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #40c4ff"&gt;var&lt;/span&gt; &lt;span style="color: #eee8aa"&gt;visitId&lt;/span&gt; &lt;span style="color: silver"&gt;=&lt;/span&gt; &lt;span style="color: #60ff60"&gt;0&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 37&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #40c4ff"&gt;while&lt;/span&gt; (&lt;span style="color: #40c4ff"&gt;true&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 38&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 39&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #66cdaa"&gt;Thread&lt;/span&gt;&lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;Sleep&lt;/span&gt;(&lt;span style="color: #60ff60"&gt;2000&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 40&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #40c4ff"&gt;var&lt;/span&gt; &lt;span style="color: #eee8aa"&gt;rnd&lt;/span&gt; &lt;span style="color: silver"&gt;=&lt;/span&gt; &lt;span style="color: #40c4ff"&gt;new&lt;/span&gt; &lt;span style="color: #66cdaa"&gt;Random&lt;/span&gt;();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 41&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #40c4ff"&gt;var&lt;/span&gt; &lt;span style="color: #eee8aa"&gt;visitType&lt;/span&gt; &lt;span style="color: silver"&gt;=&lt;/span&gt; (&lt;span style="color: #2b91af"&gt;VisitTypes&lt;/span&gt;) &lt;span style="color: #eee8aa"&gt;rnd&lt;/span&gt;&lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;Next&lt;/span&gt;(&lt;span style="color: #60ff60"&gt;0&lt;/span&gt;, &lt;span style="color: #60ff60"&gt;2&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 42&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #40c4ff"&gt;var&lt;/span&gt; &lt;span style="color: #eee8aa"&gt;visitDetail&lt;/span&gt; &lt;span style="color: silver"&gt;=&lt;/span&gt; &lt;span style="color: #40c4ff"&gt;new&lt;/span&gt; &lt;span style="color: #66cdaa"&gt;VisitDetails&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 43&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 44&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #eee8aa"&gt;VisitId&lt;/span&gt; &lt;span style="color: silver"&gt;=&lt;/span&gt; &lt;span style="color: #eee8aa"&gt;visitId&lt;/span&gt;&lt;span style="color: silver"&gt;++&lt;/span&gt;,&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 45&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #eee8aa"&gt;Country&lt;/span&gt; &lt;span style="color: silver"&gt;=&lt;/span&gt; (&lt;span style="color: #2b91af"&gt;Contries&lt;/span&gt;) &lt;span style="color: #eee8aa"&gt;rnd&lt;/span&gt;&lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;Next&lt;/span&gt;(&lt;span style="color: #60ff60"&gt;0&lt;/span&gt;, &lt;span style="color: #60ff60"&gt;4&lt;/span&gt;),&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 46&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #eee8aa"&gt;FirstName&lt;/span&gt; &lt;span style="color: silver"&gt;=&lt;/span&gt; &lt;span style="color: #eee8aa"&gt;_names&lt;/span&gt;[&lt;span style="color: #eee8aa"&gt;rnd&lt;/span&gt;&lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;Next&lt;/span&gt;(&lt;span style="color: #60ff60"&gt;0&lt;/span&gt;, &lt;span style="color: #eee8aa"&gt;_names&lt;/span&gt;&lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;Length&lt;/span&gt;)],&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 47&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #eee8aa"&gt;LastName&lt;/span&gt; &lt;span style="color: silver"&gt;=&lt;/span&gt; &lt;span style="color: #eee8aa"&gt;_lastNames&lt;/span&gt;[&lt;span style="color: #eee8aa"&gt;rnd&lt;/span&gt;&lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;Next&lt;/span&gt;(&lt;span style="color: #60ff60"&gt;0&lt;/span&gt;, &lt;span style="color: #eee8aa"&gt;_lastNames&lt;/span&gt;&lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;Length&lt;/span&gt;)],&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 48&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #eee8aa"&gt;VisitCount&lt;/span&gt; &lt;span style="color: silver"&gt;=&lt;/span&gt; &lt;span style="color: #eee8aa"&gt;visitType&lt;/span&gt; &lt;span style="color: silver"&gt;==&lt;/span&gt; &lt;span style="color: #2b91af"&gt;VisitTypes&lt;/span&gt;&lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;FirstVisitor&lt;/span&gt; &lt;span style="color: silver"&gt;?&lt;/span&gt; &lt;span style="color: #60ff60"&gt;1&lt;/span&gt; : &lt;span style="color: #eee8aa"&gt;rnd&lt;/span&gt;&lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;Next&lt;/span&gt;(&lt;span style="color: #60ff60"&gt;1&lt;/span&gt;, &lt;span style="color: #60ff60"&gt;2000&lt;/span&gt;),&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 49&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #eee8aa"&gt;VisitDate&lt;/span&gt; &lt;span style="color: silver"&gt;=&lt;/span&gt; &lt;span style="color: #2b91af"&gt;DateTime&lt;/span&gt;&lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;Now&lt;/span&gt;&lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;AddMonths&lt;/span&gt;(&lt;span style="color: #eee8aa"&gt;rnd&lt;/span&gt;&lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;Next&lt;/span&gt;(&lt;span style="color: #60ff60"&gt;0&lt;/span&gt;, &lt;span style="color: #60ff60"&gt;12&lt;/span&gt;)),&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 50&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #eee8aa"&gt;VisitType&lt;/span&gt; &lt;span style="color: silver"&gt;=&lt;/span&gt; &lt;span style="color: #eee8aa"&gt;visitType&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 51&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; };&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 52&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #eee8aa"&gt;invokeNewVisitEvent&lt;/span&gt;(&lt;span style="color: #40c4ff"&gt;new&lt;/span&gt; &lt;span style="color: #66cdaa"&gt;VisitEventArgs&lt;/span&gt;()&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 53&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 54&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #eee8aa"&gt;VisitDetail&lt;/span&gt; &lt;span style="color: silver"&gt;=&lt;/span&gt; &lt;span style="color: #eee8aa"&gt;visitDetail&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 55&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; });&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 56&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 57&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 58&lt;/span&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 59&lt;/span&gt; }&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;I think the code is pretty clear on what it does, what’s interesting about the code is the following snippet:&lt;/p&gt;  &lt;div style="font-family: consolas; background: #171717; color: #e0e0e0; font-size: 10pt"&gt;   &lt;p style="margin: 0px"&gt;&lt;span style="color: #eee8aa"&gt;_visitsObservable&lt;/span&gt; &lt;span style="color: silver"&gt;=&lt;/span&gt; &lt;span style="color: #66cdaa"&gt;Observable&lt;/span&gt;&lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;FromEvent&lt;/span&gt;&lt;span style="color: silver"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #66cdaa"&gt;VisitEventArgs&lt;/span&gt;&lt;span style="color: silver"&gt;&amp;gt;&lt;/span&gt;(&lt;span style="color: #eee8aa"&gt;handler&lt;/span&gt; &lt;span style="color: silver"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color: #eee8aa"&gt;NewVisitEvent&lt;/span&gt; &lt;span style="color: silver"&gt;+=&lt;/span&gt; &lt;span style="color: #eee8aa"&gt;handler&lt;/span&gt;,&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #eee8aa"&gt;handler&lt;/span&gt; &lt;span style="color: silver"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color: #eee8aa"&gt;NewVisitEvent&lt;/span&gt; &lt;span style="color: silver"&gt;-=&lt;/span&gt; &lt;span style="color: #eee8aa"&gt;handler&lt;/span&gt;);&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;What I’m doing there is creating an &lt;a href="http://msdn.microsoft.com/en-us/library/dd990377(VS.100).aspx" target="_blank"&gt;IObservable&lt;/a&gt; (thus, an instance that sent notifications) from our NewVisitEvent.     &lt;br /&gt;The FromEvent extension method has the following signature:&lt;/p&gt;  &lt;p&gt;public static System.IObservable&amp;lt;IEvent&amp;lt;TEventArgs&amp;gt;&amp;gt; FromEvent&amp;lt;TEventArgs&amp;gt;(System.Action&amp;lt;EventHandler&amp;lt;TEventArgs&amp;gt;&amp;gt; addHandler, System.Action&amp;lt;EventHandler&amp;lt;TEventArgs&amp;gt;&amp;gt; removeHandler)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; where TEventArgs : System.EventArgs&lt;/p&gt;  &lt;p&gt;As you can see, it’s a generic method which expect an inheritor of EventArgs, that would be our VisitEventArgs class, and also a delegate to add and remove handlers to this event.&lt;/p&gt;  &lt;p&gt;Now, lets define our handlers, they should apply to the following interface:&lt;/p&gt;  &lt;div style="font-family: consolas; background: #171717; color: #e0e0e0; font-size: 10pt"&gt;   &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160;&amp;#160; 1&lt;/span&gt;&amp;#160;&lt;span style="color: #40c4ff"&gt;public&lt;/span&gt; &lt;span style="color: #40c4ff"&gt;interface&lt;/span&gt; &lt;span style="color: #2b91af"&gt;IVisitorHandler&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160;&amp;#160; 2&lt;/span&gt; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160;&amp;#160; 3&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #40c4ff"&gt;void&lt;/span&gt; &lt;span style="color: #eee8aa"&gt;RegisterListeners&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;ISiteVisitorsService&lt;/span&gt; &lt;span style="color: #eee8aa"&gt;service&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160;&amp;#160; 4&lt;/span&gt; }&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h2&gt;The old way of do things&lt;/h2&gt;  &lt;p&gt;First, our old fashioned handler:&lt;/p&gt;  &lt;div style="font-family: consolas; background: #171717; color: #e0e0e0; font-size: 10pt"&gt;   &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160;&amp;#160; 1&lt;/span&gt;&amp;#160;&lt;span style="color: #40c4ff"&gt;public&lt;/span&gt; &lt;span style="color: #40c4ff"&gt;class&lt;/span&gt; &lt;span style="color: #66cdaa"&gt;OldFashionedVisitorHandler&lt;/span&gt; : &lt;span style="color: #2b91af"&gt;IVisitorHandler&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160;&amp;#160; 2&lt;/span&gt; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160;&amp;#160; 3&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #40c4ff"&gt;private&lt;/span&gt; &lt;span style="color: #40c4ff"&gt;static&lt;/span&gt; &lt;span style="color: #40c4ff"&gt;readonly&lt;/span&gt; &lt;span style="color: #66cdaa"&gt;List&lt;/span&gt;&lt;span style="color: silver"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #66cdaa"&gt;VisitDetails&lt;/span&gt;&lt;span style="color: silver"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color: #eee8aa"&gt;VisitsBuffer&lt;/span&gt; &lt;span style="color: silver"&gt;=&lt;/span&gt; &lt;span style="color: #40c4ff"&gt;new&lt;/span&gt; &lt;span style="color: #66cdaa"&gt;List&lt;/span&gt;&lt;span style="color: silver"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #66cdaa"&gt;VisitDetails&lt;/span&gt;&lt;span style="color: silver"&gt;&amp;gt;&lt;/span&gt;();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160;&amp;#160; 4&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #40c4ff"&gt;private&lt;/span&gt; &lt;span style="color: #40c4ff"&gt;static&lt;/span&gt; &lt;span style="color: #40c4ff"&gt;readonly&lt;/span&gt; &lt;span style="color: #66cdaa"&gt;List&lt;/span&gt;&lt;span style="color: silver"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #66cdaa"&gt;VisitDetails&lt;/span&gt;&lt;span style="color: silver"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color: #eee8aa"&gt;EnglishSpeakersVisitorsBuffer&lt;/span&gt; &lt;span style="color: silver"&gt;=&lt;/span&gt; &lt;span style="color: #40c4ff"&gt;new&lt;/span&gt; &lt;span style="color: #66cdaa"&gt;List&lt;/span&gt;&lt;span style="color: silver"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #66cdaa"&gt;VisitDetails&lt;/span&gt;&lt;span style="color: silver"&gt;&amp;gt;&lt;/span&gt;();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160;&amp;#160; 5&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #40c4ff"&gt;private&lt;/span&gt; &lt;span style="color: #40c4ff"&gt;static&lt;/span&gt; &lt;span style="color: #40c4ff"&gt;readonly&lt;/span&gt; &lt;span style="color: #66cdaa"&gt;List&lt;/span&gt;&lt;span style="color: silver"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #66cdaa"&gt;VisitDetails&lt;/span&gt;&lt;span style="color: silver"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color: #eee8aa"&gt;FirstVisitorBuffer&lt;/span&gt; &lt;span style="color: silver"&gt;=&lt;/span&gt; &lt;span style="color: #40c4ff"&gt;new&lt;/span&gt; &lt;span style="color: #66cdaa"&gt;List&lt;/span&gt;&lt;span style="color: silver"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #66cdaa"&gt;VisitDetails&lt;/span&gt;&lt;span style="color: silver"&gt;&amp;gt;&lt;/span&gt;();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160;&amp;#160; 6&lt;/span&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160;&amp;#160; 7&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #40c4ff"&gt;public&lt;/span&gt; &lt;span style="color: #40c4ff"&gt;void&lt;/span&gt; &lt;span style="color: #eee8aa"&gt;RegisterListeners&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;ISiteVisitorsService&lt;/span&gt; &lt;span style="color: #eee8aa"&gt;service&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160;&amp;#160; 8&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160;&amp;#160; 9&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #eee8aa"&gt;service&lt;/span&gt;&lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;NewVisitEvent&lt;/span&gt; &lt;span style="color: silver"&gt;+=&lt;/span&gt; &lt;span style="color: #eee8aa"&gt;serviceNewVisitHandler&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 10&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 11&lt;/span&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 12&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #40c4ff"&gt;static&lt;/span&gt; &lt;span style="color: #40c4ff"&gt;void&lt;/span&gt; &lt;span style="color: #eee8aa"&gt;serviceNewVisitHandler&lt;/span&gt;(&lt;span style="color: #40c4ff"&gt;object&lt;/span&gt; &lt;span style="color: #eee8aa"&gt;sender&lt;/span&gt;, &lt;span style="color: #66cdaa"&gt;VisitEventArgs&lt;/span&gt; &lt;span style="color: #eee8aa"&gt;e&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 13&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 14&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #40c4ff"&gt;var&lt;/span&gt; &lt;span style="color: #eee8aa"&gt;visitDetail&lt;/span&gt; &lt;span style="color: silver"&gt;=&lt;/span&gt; &lt;span style="color: #eee8aa"&gt;e&lt;/span&gt;&lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;VisitDetail&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 15&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #eee8aa"&gt;VisitsBuffer&lt;/span&gt;&lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;Add&lt;/span&gt;(&lt;span style="color: #eee8aa"&gt;visitDetail&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 16&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #40c4ff"&gt;if&lt;/span&gt; (&lt;span style="color: #eee8aa"&gt;VisitsBuffer&lt;/span&gt;&lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;Count&lt;/span&gt; &lt;span style="color: silver"&gt;==&lt;/span&gt; &lt;span style="color: #66cdaa"&gt;VisitorHandlerHelper&lt;/span&gt;&lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;LogVisitThreshold&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 17&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 18&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #66cdaa"&gt;VisitorHandlerHelper&lt;/span&gt;&lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;LogVisit&lt;/span&gt;(&lt;span style="color: #eee8aa"&gt;VisitsBuffer&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 19&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #eee8aa"&gt;VisitsBuffer&lt;/span&gt;&lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;Clear&lt;/span&gt;();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 20&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 21&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #40c4ff"&gt;if&lt;/span&gt; (&lt;span style="color: #eee8aa"&gt;visitDetail&lt;/span&gt;&lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;Country&lt;/span&gt; &lt;span style="color: silver"&gt;==&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Contries&lt;/span&gt;&lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;Uk&lt;/span&gt; &lt;span style="color: silver"&gt;||&lt;/span&gt; &lt;span style="color: #eee8aa"&gt;visitDetail&lt;/span&gt;&lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;Country&lt;/span&gt; &lt;span style="color: silver"&gt;==&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Contries&lt;/span&gt;&lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;Usa&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 22&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 23&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #eee8aa"&gt;EnglishSpeakersVisitorsBuffer&lt;/span&gt;&lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;Add&lt;/span&gt;(&lt;span style="color: #eee8aa"&gt;visitDetail&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 24&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #40c4ff"&gt;if&lt;/span&gt; (&lt;span style="color: #eee8aa"&gt;EnglishSpeakersVisitorsBuffer&lt;/span&gt;&lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;Count&lt;/span&gt; &lt;span style="color: silver"&gt;==&lt;/span&gt; &lt;span style="color: #66cdaa"&gt;VisitorHandlerHelper&lt;/span&gt;&lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;SendEmailForEnglishSpeakersVisitorsThreshold&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 25&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 26&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #66cdaa"&gt;VisitorHandlerHelper&lt;/span&gt;&lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;SendEmailForEnglishSpeakersVisitors&lt;/span&gt;(&lt;span style="color: #eee8aa"&gt;EnglishSpeakersVisitorsBuffer&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 27&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #eee8aa"&gt;EnglishSpeakersVisitorsBuffer&lt;/span&gt;&lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;Clear&lt;/span&gt;();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 28&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 29&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 30&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #40c4ff"&gt;if&lt;/span&gt; (&lt;span style="color: #eee8aa"&gt;visitDetail&lt;/span&gt;&lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;VisitType&lt;/span&gt; &lt;span style="color: silver"&gt;==&lt;/span&gt; &lt;span style="color: #2b91af"&gt;VisitTypes&lt;/span&gt;&lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;FirstVisitor&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 31&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 32&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #eee8aa"&gt;FirstVisitorBuffer&lt;/span&gt;&lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;Add&lt;/span&gt;(&lt;span style="color: #eee8aa"&gt;visitDetail&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 33&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #40c4ff"&gt;if&lt;/span&gt; (&lt;span style="color: #eee8aa"&gt;FirstVisitorBuffer&lt;/span&gt;&lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;Count&lt;/span&gt; &lt;span style="color: silver"&gt;==&lt;/span&gt; &lt;span style="color: #66cdaa"&gt;VisitorHandlerHelper&lt;/span&gt;&lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;SendFirstVisitorMessageThreshold&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 34&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 35&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #66cdaa"&gt;VisitorHandlerHelper&lt;/span&gt;&lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;SendFirstVisitorMessage&lt;/span&gt;(&lt;span style="color: #eee8aa"&gt;FirstVisitorBuffer&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 36&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #eee8aa"&gt;FirstVisitorBuffer&lt;/span&gt;&lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;Clear&lt;/span&gt;();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 37&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 38&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 39&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 40&lt;/span&gt; }&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Now, please look at the serviceNewVisitHandler static method, all those if statements, the thing about the three buffers to hold the VisitDetails instances (VisitsBuffer, EnglishSpeakersVisitorsBuffer and FirstVisitorBuffer), a complete mess!, also all that complexity add noises and hides the real purpose of the class. Also one last thing, in the RegisterListeners method we are using the NewVisitEvent event to handle when a new visitor arrives.    &lt;br /&gt;To summarize, this is how we’ve been doing this until today (I hope).&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h2&gt;Using the Reactive Library&lt;/h2&gt;  &lt;p&gt;One of the benefits we get by using the RX library is that we can use events in a LINQ fashion, thus, that’s why some people name the Reactive Library as LINQ to Events.    &lt;br /&gt;Now, lets take a look to our reactive fashioned visitor handler:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="font-family: consolas; background: #171717; color: #e0e0e0; font-size: 10pt"&gt;   &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160;&amp;#160; 1&lt;/span&gt;&amp;#160;&lt;span style="color: #40c4ff"&gt;public&lt;/span&gt; &lt;span style="color: #40c4ff"&gt;class&lt;/span&gt; &lt;span style="color: #66cdaa"&gt;ReactiveVisitorHandler&lt;/span&gt; : &lt;span style="color: #2b91af"&gt;IVisitorHandler&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160;&amp;#160; 2&lt;/span&gt; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160;&amp;#160; 3&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #40c4ff"&gt;const&lt;/span&gt; &lt;span style="color: #40c4ff"&gt;int&lt;/span&gt; &lt;span style="color: #eee8aa"&gt;LogVisitThreshold&lt;/span&gt; &lt;span style="color: silver"&gt;=&lt;/span&gt; &lt;span style="color: #66cdaa"&gt;VisitorHandlerHelper&lt;/span&gt;&lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;LogVisitThreshold&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160;&amp;#160; 4&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #40c4ff"&gt;const&lt;/span&gt; &lt;span style="color: #40c4ff"&gt;int&lt;/span&gt; &lt;span style="color: #eee8aa"&gt;SendEmailForEnglishSpeakersVisitorsThreshold&lt;/span&gt; &lt;span style="color: silver"&gt;=&lt;/span&gt; &lt;span style="color: #66cdaa"&gt;VisitorHandlerHelper&lt;/span&gt;&lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;SendEmailForEnglishSpeakersVisitorsThreshold&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160;&amp;#160; 5&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #40c4ff"&gt;const&lt;/span&gt; &lt;span style="color: #40c4ff"&gt;int&lt;/span&gt; &lt;span style="color: #eee8aa"&gt;SendFirstVisitorMessageThreshold&lt;/span&gt; &lt;span style="color: silver"&gt;=&lt;/span&gt; &lt;span style="color: #66cdaa"&gt;VisitorHandlerHelper&lt;/span&gt;&lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;SendFirstVisitorMessageThreshold&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160;&amp;#160; 6&lt;/span&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160;&amp;#160; 7&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #40c4ff"&gt;public&lt;/span&gt; &lt;span style="color: #40c4ff"&gt;void&lt;/span&gt; &lt;span style="color: #eee8aa"&gt;RegisterListeners&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;ISiteVisitorsService&lt;/span&gt; &lt;span style="color: #eee8aa"&gt;service&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160;&amp;#160; 8&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160;&amp;#160; 9&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #40c4ff"&gt;var&lt;/span&gt; &lt;span style="color: #eee8aa"&gt;observerData&lt;/span&gt; &lt;span style="color: silver"&gt;=&lt;/span&gt; &lt;span style="color: #eee8aa"&gt;service&lt;/span&gt;&lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;NewVisitObservable&lt;/span&gt;&lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;Select&lt;/span&gt;(&lt;span style="color: #eee8aa"&gt;x&lt;/span&gt; &lt;span style="color: silver"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color: #eee8aa"&gt;x&lt;/span&gt;&lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;EventArgs&lt;/span&gt;&lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;VisitDetail&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 10&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #eee8aa"&gt;observerData&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 11&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;Buffer&lt;/span&gt;(&lt;span style="color: #eee8aa"&gt;LogVisitThreshold&lt;/span&gt;, &lt;span style="color: #eee8aa"&gt;LogVisitThreshold&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 12&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;Subscribe&lt;/span&gt;(&lt;span style="color: #66cdaa"&gt;VisitorHandlerHelper&lt;/span&gt;&lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;LogVisit&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 13&lt;/span&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 14&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #eee8aa"&gt;observerData&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 15&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;Where&lt;/span&gt;(&lt;span style="color: #eee8aa"&gt;x&lt;/span&gt; &lt;span style="color: silver"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color: #eee8aa"&gt;x&lt;/span&gt;&lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;Country&lt;/span&gt; &lt;span style="color: silver"&gt;==&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Contries&lt;/span&gt;&lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;Uk&lt;/span&gt; &lt;span style="color: silver"&gt;||&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 16&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #eee8aa"&gt;x&lt;/span&gt;&lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;Country&lt;/span&gt; &lt;span style="color: silver"&gt;==&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Contries&lt;/span&gt;&lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;Usa&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 17&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;Buffer&lt;/span&gt;(&lt;span style="color: #eee8aa"&gt;SendEmailForEnglishSpeakersVisitorsThreshold&lt;/span&gt;, &lt;span style="color: #eee8aa"&gt;SendEmailForEnglishSpeakersVisitorsThreshold&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 18&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;Subscribe&lt;/span&gt;(&lt;span style="color: #66cdaa"&gt;VisitorHandlerHelper&lt;/span&gt;&lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;SendEmailForEnglishSpeakersVisitors&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 19&lt;/span&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 20&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #eee8aa"&gt;observerData&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 21&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;Where&lt;/span&gt;(&lt;span style="color: #eee8aa"&gt;x&lt;/span&gt; &lt;span style="color: silver"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color: #eee8aa"&gt;x&lt;/span&gt;&lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;VisitType&lt;/span&gt; &lt;span style="color: silver"&gt;==&lt;/span&gt; &lt;span style="color: #2b91af"&gt;VisitTypes&lt;/span&gt;&lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;FirstVisitor&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 22&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;Buffer&lt;/span&gt;(&lt;span style="color: #eee8aa"&gt;SendFirstVisitorMessageThreshold&lt;/span&gt;, &lt;span style="color: #eee8aa"&gt;SendFirstVisitorMessageThreshold&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 23&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;Subscribe&lt;/span&gt;(&lt;span style="color: #66cdaa"&gt;VisitorHandlerHelper&lt;/span&gt;&lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;SendFirstVisitorMessage&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 24&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 25&lt;/span&gt; }&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;The interesting stuffs happen in the RegisterListeners method.    &lt;br /&gt;First of all, if you look at the line 9, you’ll see we are projecting the&amp;#160; event arguments from the service IObservable to get only the stuff we are interesting in (the VisitDetail property). &lt;/p&gt;  &lt;p&gt;Later on, we start&amp;#160; subscribing our delegates to the IObservable previously created.&lt;/p&gt;  &lt;p&gt;From line 10 to 12, we are buffering the output of the event and after that we are subscribing the resulting IObservable to our VisitorHandlerHelper.LogVisit method. Way more simpler way than in our counterpart from the OldFashionedVisitorHandler.&lt;/p&gt;  &lt;p&gt;From line 14 to 17 and from line 20 to 23, first we are filtering the IObservable by certain criteria, the first one will filter those events where the Country property is UK or USA, while the other IObservable is filtered only to be handled when the VisitType is equal to FirstVisitor. Next we are buffering the output as we did for the previous observer. And finally, we just subscribe the observable to its corresponding methods.&lt;/p&gt;  &lt;p&gt;I don’t know about you, but I think that our ReactiveVisitorHandler is way more friendly than the OldFashionedVisitorHandler. It removes all that complexity and reduces drastically the amount of code you need to write in order to subscribe to an event and perform some special handling based on a complex requirement.&lt;/p&gt;  &lt;h2&gt;The output&lt;/h2&gt;  &lt;p&gt;Both versions will output the same thing, which in a console app may look like :&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_-4wV51cifeA/SyaP8NchCZI/AAAAAAAAAIo/IX9Ni1lWxUE/s1600-h/ReactiveSample%5B6%5D.jpg" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="ReactiveSample" border="0" alt="ReactiveSample" src="http://lh3.ggpht.com/_-4wV51cifeA/SyaQAEzYHZI/AAAAAAAAAIs/mYP8cHF1jOw/ReactiveSample_thumb%5B4%5D.jpg?imgmax=800" width="640" height="317" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h2&gt;And one day we get a request for an improvement…&lt;/h2&gt;  &lt;p&gt;So, days go by, everything seems to work correctly. However we get a request telling us that the notification handling should work as always but now it must work in an async fashion, without blocking the service, thus, improving the performance.&lt;/p&gt;  &lt;p&gt;So, what’s required to solve this problem? Let’s change our code to reflect just this:&lt;/p&gt;  &lt;div style="font-family: consolas; background: #171717; color: #e0e0e0; font-size: 10pt"&gt;   &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160;&amp;#160; 1&lt;/span&gt;&amp;#160;&lt;span style="color: #40c4ff"&gt;public&lt;/span&gt; &lt;span style="color: #40c4ff"&gt;void&lt;/span&gt; &lt;span style="color: #eee8aa"&gt;RegisterListeners&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;ISiteVisitorsService&lt;/span&gt; &lt;span style="color: #eee8aa"&gt;service&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160;&amp;#160; 2&lt;/span&gt; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160;&amp;#160; 3&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #40c4ff"&gt;var&lt;/span&gt; &lt;span style="color: #eee8aa"&gt;observerData&lt;/span&gt; &lt;span style="color: silver"&gt;=&lt;/span&gt; &lt;span style="color: #eee8aa"&gt;service&lt;/span&gt;&lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;NewVisitObservable&lt;/span&gt;&lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;Select&lt;/span&gt;(&lt;span style="color: #eee8aa"&gt;x&lt;/span&gt; &lt;span style="color: silver"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color: #eee8aa"&gt;x&lt;/span&gt;&lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;EventArgs&lt;/span&gt;&lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;VisitDetail&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160;&amp;#160; 4&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;strong&gt;&lt;em&gt;&lt;u&gt;&lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;Asynchronous&lt;/span&gt;();&lt;/u&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160;&amp;#160; 5&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #eee8aa"&gt;observerData&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160;&amp;#160; 6&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;Buffer&lt;/span&gt;(&lt;span style="color: #eee8aa"&gt;LogVisitThreshold&lt;/span&gt;, &lt;span style="color: #eee8aa"&gt;LogVisitThreshold&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160;&amp;#160; 7&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;Subscribe&lt;/span&gt;(&lt;span style="color: #66cdaa"&gt;VisitorHandlerHelper&lt;/span&gt;&lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;LogVisit&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160;&amp;#160; 8&lt;/span&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160;&amp;#160; 9&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #eee8aa"&gt;observerData&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 10&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;Where&lt;/span&gt;(&lt;span style="color: #eee8aa"&gt;x&lt;/span&gt; &lt;span style="color: silver"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color: #eee8aa"&gt;x&lt;/span&gt;&lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;Country&lt;/span&gt; &lt;span style="color: silver"&gt;==&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Contries&lt;/span&gt;&lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;Uk&lt;/span&gt; &lt;span style="color: silver"&gt;||&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 11&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #eee8aa"&gt;x&lt;/span&gt;&lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;Country&lt;/span&gt; &lt;span style="color: silver"&gt;==&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Contries&lt;/span&gt;&lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;Usa&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 12&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;Buffer&lt;/span&gt;(&lt;span style="color: #eee8aa"&gt;SendEmailForEnglishSpeakersVisitorsThreshold&lt;/span&gt;, &lt;span style="color: #eee8aa"&gt;SendEmailForEnglishSpeakersVisitorsThreshold&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 13&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;Subscribe&lt;/span&gt;(&lt;span style="color: #66cdaa"&gt;VisitorHandlerHelper&lt;/span&gt;&lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;SendEmailForEnglishSpeakersVisitors&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 14&lt;/span&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 15&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #eee8aa"&gt;observerData&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 16&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;Where&lt;/span&gt;(&lt;span style="color: #eee8aa"&gt;x&lt;/span&gt; &lt;span style="color: silver"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color: #eee8aa"&gt;x&lt;/span&gt;&lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;VisitType&lt;/span&gt; &lt;span style="color: silver"&gt;==&lt;/span&gt; &lt;span style="color: #2b91af"&gt;VisitTypes&lt;/span&gt;&lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;FirstVisitor&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 17&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;Buffer&lt;/span&gt;(&lt;span style="color: #eee8aa"&gt;SendFirstVisitorMessageThreshold&lt;/span&gt;, &lt;span style="color: #eee8aa"&gt;SendFirstVisitorMessageThreshold&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 18&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;Subscribe&lt;/span&gt;(&lt;span style="color: #66cdaa"&gt;VisitorHandlerHelper&lt;/span&gt;&lt;span style="color: silver"&gt;.&lt;/span&gt;&lt;span style="color: #eee8aa"&gt;SendFirstVisitorMessage&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="background: #404040; color: #adadad"&gt;&amp;#160;&amp;#160; 19&lt;/span&gt; }&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Do you note the difference (line 4)? So it took us just one line to achieve such a complex thing in a thread safe fashion.&lt;/p&gt;  &lt;p&gt;What’s required to do the same in our OldFashionedVisitorHandler…well, I left that as an exercise to the reader, because from now on, frankly, I don’t care.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h2&gt;Summary&lt;/h2&gt;  &lt;p&gt;I hope dear reader you’ve noted the great improvement and less amount of code that you’ll get by using the Reactive Library, while it is in its initial stage, it is definitely something you should give a try.&lt;/p&gt;  &lt;p&gt;The downloadable bits can be found &lt;a href="http://emiajnetsamples.googlecode.com/files/ReactiveFramework.zip" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Bye bye.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12895914-1503789022197216591?l=emiajnet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://emiajnet.blogspot.com/feeds/1503789022197216591/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12895914&amp;postID=1503789022197216591' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12895914/posts/default/1503789022197216591'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12895914/posts/default/1503789022197216591'/><link rel='alternate' type='text/html' href='http://emiajnet.blogspot.com/2009/12/quick-look-at-reactive-extensions-rx.html' title='A quick look at the Reactive Extensions (Rx) for .Net'/><author><name>jaime</name><uri>http://www.blogger.com/profile/05400435935764737984</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_-4wV51cifeA/SyaQAEzYHZI/AAAAAAAAAIs/mYP8cHF1jOw/s72-c/ReactiveSample_thumb%5B4%5D.jpg?imgmax=800' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12895914.post-8689887410679404977</id><published>2009-09-15T19:19:00.001-05:00</published><updated>2009-09-15T19:27:54.555-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PostSharp'/><category scheme='http://www.blogger.com/atom/ns#' term='codeproject'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='AOP'/><category scheme='http://www.blogger.com/atom/ns#' term='.Net'/><title type='text'>Implementing a Dead Simple Licensing Library with PostSharp</title><content type='html'>&lt;p&gt;Hello everyone, had been a long time from my last post (as usual, been busy busy busy).&lt;/p&gt;  &lt;p&gt;Today I want to talk about something that for most .Net developers is unknown but has been in the development industry a long time ago. I’m talking about Aspect Oriented Programming - &lt;a href="http://en.wikipedia.org/wiki/Aspect-oriented_programming" target="_blank"&gt;AOP&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;AOP can help you to remove a lot of boilerplate code and to separate concerns from the code your are implementing. I don’t want to talk much about this because surely there’s far more smarter people than I out there that could explain in more detail what AOP is and how you can improve yourself by using it (like &lt;a href="http://ayende.com/Blog/archive/2007/07/02/7-Approaches-for-AOP-in-.Net.aspx" target="_blank"&gt;ayende&lt;/a&gt;).&lt;/p&gt;  &lt;p&gt;I came across &lt;a href="http://www.postsharp.org/" target="_blank"&gt;PostSharp&lt;/a&gt; a couple of months ago and immediately felt that it was such a great tool to use with no effort, it allows you to do AOP in existent code, and even better if you start using it from day zero at a project.&lt;/p&gt;  &lt;p&gt;What this post is about? Well, the idea is to introduce licensing features to an existent Windows Form application, you know, that little thing that you see when you are evaluating a product and you get notifications about license renewal or limited use of some features given some condition.&lt;/p&gt;  &lt;p&gt;Our little app looks like this:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_-4wV51cifeA/SrAu9Pfv3bI/AAAAAAAAAHw/_yY9r_wv9XA/s1600-h/aop_licensing_ui%5B7%5D.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="aop_licensing_ui" border="0" alt="aop_licensing_ui" src="http://lh5.ggpht.com/_-4wV51cifeA/SrAu-FQQo-I/AAAAAAAAAH0/cRQccBojGJ0/aop_licensing_ui_thumb%5B5%5D.jpg?imgmax=800" width="240" height="158" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Every single button just display a MessageBox with its Text property as the message content. Our initial code looks like the following:&lt;/p&gt;  &lt;div style="font-family: courier new; background: white; color: black; font-size: 10pt"&gt;   &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;private&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; button_Click(&lt;span style="color: blue"&gt;object&lt;/span&gt; sender, &lt;span style="color: #2b91af"&gt;EventArgs&lt;/span&gt; e)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;{&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #2b91af"&gt;MessageBox&lt;/span&gt;.Show(&lt;span style="color: #a31515"&gt;&amp;quot;Executing =&amp;gt; &amp;quot;&lt;/span&gt; + ((&lt;span style="color: #2b91af"&gt;Button&lt;/span&gt;)(sender)).Text);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;}&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;Every button has its Click event handler pointing to this method.&lt;/p&gt;  &lt;p&gt;Here is the unrealistic scenario that our app now has to support:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;All the buttons inside the “Unrestricted Methods” groupbox are not handled by the licensing component.&lt;/li&gt;    &lt;li&gt;All the buttons inside the “Restricted Methods” groupbox are handled by the licensing component.&lt;/li&gt;    &lt;li&gt;For Button1 and Button2, the spec says that if the licensing component deny the use of the application, the method should not be executed, and a message at the status bar should appear notifying this problem.&lt;/li&gt;    &lt;li&gt;For Button3, the spec says that if the licensing component deny the use of the application, the method should be executed as always, but this only must be allowed 10 times at max, after that it should cancel the method execution and throw an exception, as with the previous buttons, the user should be notified about such problem.&lt;/li&gt;    &lt;li&gt;For Button4, the spec says that if the licensing component deny the use of the application, the method should be executed as always, but the user should be notified that besides this fact the license should be renewed. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Ok, so lets start implementing those updates into our code.&lt;/p&gt;  &lt;p&gt;In the attached sample project you’ll find the final solution for this article; the EmiajNet.AOP.Licensing.Foundation is the key of everything, lets examine one by one each class.&lt;/p&gt;  &lt;h4&gt;&lt;u&gt;LicensingManager.cs&lt;/u&gt;&lt;/h4&gt;  &lt;p&gt;This is the class which is in charge of evaluate if the license is valid. Well, as you can see from the code, the license is only valid when in the mornings. The silliest condition let me tell you, but for our sample project works just fine. In a real world app, you may want to check some registry key, or to call a webservice to check the user credentials or anything else.&lt;/p&gt;  &lt;div style="font-family: courier new; background: white; color: black; font-size: 10pt"&gt;   &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;LicensingManager&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;{&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;bool&lt;/span&gt; IsValid()&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return&lt;/span&gt; &lt;span style="color: #2b91af"&gt;DateTime&lt;/span&gt;.Now.Hour &amp;lt; 12;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;}&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h4&gt;LicensingCheckOptions.cs&lt;/h4&gt;  &lt;p&gt;Those are the constraints that are going to be used for our app for the monitored methods.   &lt;br /&gt;&lt;em&gt;ContinueInvocation&lt;/em&gt; means that it should not cancel the method execution.    &lt;br /&gt;&lt;em&gt;EndInvocation&lt;/em&gt; means that it should cancel the method execution.    &lt;br /&gt;&lt;em&gt;ThrowSecurityCheckOperationException&lt;/em&gt; means that it should throw our custom &lt;em&gt;SecurityCheckOperationException&lt;/em&gt; error.&lt;/p&gt;  &lt;div style="font-family: courier new; background: white; color: black; font-size: 10pt"&gt;   &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;enum&lt;/span&gt; &lt;span style="color: #2b91af"&gt;LicensingCheckOptions&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;{&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; ContinueInvocation,&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; EndInvocation,&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; ThrowSecurityCheckOperationException&lt;/p&gt;    &lt;p style="margin: 0px"&gt;}&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h4&gt;LicensingHandlerParameter.cs&lt;/h4&gt;  &lt;p&gt;This is a class used to pass information about the method being handled by our licensing component, it has properties to diagnostic where the problem occurs so the client could handled according by inspecting those properties.   &lt;br /&gt;&lt;em&gt;Instance&lt;/em&gt; is the instance (duh!) of the class on which the method is executed.    &lt;br /&gt;&lt;em&gt;Tag&lt;/em&gt; is an arbitrary value that is assigned to the &lt;em&gt;LicensingCheckAttribute&lt;/em&gt; (more info below) which decorate the intercepted method.    &lt;br /&gt;&lt;em&gt;Method&lt;/em&gt; is the object that represent to the method being intercepted.    &lt;br /&gt;&lt;em&gt;Arguments&lt;/em&gt; is the object that represent the original parameters that were used to call to the intercepted method.    &lt;br /&gt;&lt;em&gt;CheckOptions&lt;/em&gt; is the &lt;em&gt;LicensingCheckOption&lt;/em&gt; enum value assigned to the &lt;em&gt;LicensingCheckAttribute&lt;/em&gt; (more info below) which decorate the intercepted method.&lt;/p&gt;  &lt;div style="font-family: courier new; background: white; color: black; font-size: 10pt"&gt;   &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;LicensingHandlerParameter&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;{&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;object&lt;/span&gt; Instance { &lt;span style="color: blue"&gt;get&lt;/span&gt;; &lt;span style="color: blue"&gt;protected&lt;/span&gt; &lt;span style="color: blue"&gt;set&lt;/span&gt;; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;object&lt;/span&gt; Tag { &lt;span style="color: blue"&gt;get&lt;/span&gt;; &lt;span style="color: blue"&gt;protected&lt;/span&gt; &lt;span style="color: blue"&gt;set&lt;/span&gt;; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af"&gt;MethodInfo&lt;/span&gt; Method { &lt;span style="color: blue"&gt;get&lt;/span&gt;; &lt;span style="color: blue"&gt;protected&lt;/span&gt; &lt;span style="color: blue"&gt;set&lt;/span&gt;; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;object&lt;/span&gt;[] Arguments { &lt;span style="color: blue"&gt;get&lt;/span&gt;; &lt;span style="color: blue"&gt;protected&lt;/span&gt; &lt;span style="color: blue"&gt;set&lt;/span&gt;; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af"&gt;LicensingCheckOptions&lt;/span&gt; CheckOption { &lt;span style="color: blue"&gt;get&lt;/span&gt;; &lt;span style="color: blue"&gt;protected&lt;/span&gt; &lt;span style="color: blue"&gt;set&lt;/span&gt;; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; LicensingHandlerParameter(&lt;span style="color: blue"&gt;object&lt;/span&gt; instance, &lt;span style="color: blue"&gt;object&lt;/span&gt; tag, &lt;span style="color: #2b91af"&gt;MethodInfo&lt;/span&gt; method, &lt;span style="color: blue"&gt;object&lt;/span&gt;[] arguments, &lt;span style="color: #2b91af"&gt;LicensingCheckOptions&lt;/span&gt; checkOption)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Instance = instance;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Tag = tag;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Method = method;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Arguments = arguments;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; CheckOption = checkOption;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;}&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h4&gt;ILicensingHandler.cs&lt;/h4&gt;  &lt;p&gt;This is a key class in our licensing component, when our LicensingCheckAttribute detects that the host instance implements this interface, uses their methods to notify the several stages of the evaluation. The name of the methods indicate their meaning as well.&lt;/p&gt;  &lt;div style="font-family: courier new; background: white; color: black; font-size: 10pt"&gt;   &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;interface&lt;/span&gt; &lt;span style="color: #2b91af"&gt;ILicensingHandler&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;{&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;void&lt;/span&gt; BeforePerformSecurityCheck(&lt;span style="color: #2b91af"&gt;LicensingHandlerParameter&lt;/span&gt; information);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;void&lt;/span&gt; AfterPerformSecurityCheck(&lt;span style="color: #2b91af"&gt;LicensingHandlerParameter&lt;/span&gt; information, &lt;span style="color: blue"&gt;bool&lt;/span&gt; valid);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;void&lt;/span&gt; SecurityCheckFailed(&lt;span style="color: #2b91af"&gt;LicensingHandlerParameter&lt;/span&gt; information);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;void&lt;/span&gt; HandleSecurityCheckOperationException(&lt;span style="color: #2b91af"&gt;LicensingHandlerParameter&lt;/span&gt; information, &lt;span style="color: blue"&gt;ref&lt;/span&gt; &lt;span style="color: blue"&gt;bool&lt;/span&gt; cancel);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;}&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h4&gt;SecurityCheckOperationException.cs&lt;/h4&gt;  &lt;p&gt;This is our custom exception to be thrown when the &lt;em&gt;IsValid&lt;/em&gt; method of our licensing component (&lt;em&gt;LicensingManager&lt;/em&gt;) return false and the intercepted method is marked with our custom attribute indicating that an error must be thrown (by configuring the &lt;em&gt;CheckOption&lt;/em&gt; property as &lt;em&gt;ThrowSecurityCheckOperationException&lt;/em&gt;).&lt;/p&gt;  &lt;div style="font-family: courier new; background: white; color: black; font-size: 10pt"&gt;   &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;SecurityCheckOperationException&lt;/span&gt; : &lt;span style="color: #2b91af"&gt;InvalidOperationException&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;{&lt;/p&gt;    &lt;p style="margin: 0px"&gt;}&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h4&gt;LicensingCheckAttribute.cs&lt;/h4&gt;  &lt;p&gt;And finally the most important class in the whole project, this class inherits from PostSharp.Laos.OnMethodInvocationAspect, which allow us to decorate any method and intercept it just before gets executed, and we can do whatever we want at that stage, like cancel the execution or do some other crazy stuff.   &lt;br /&gt;The interesting bits occur in the &lt;em&gt;OnInvocation&lt;/em&gt; method. &lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;From line 21 to 25 we are just assigning values to variables that are going to be used later with the help of the &lt;em&gt;eventArgs&lt;/em&gt; parameter&amp;#160; which holds a lot of useful information.     &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;Line 26 to 29 is for notify to the ILicesingHandler implementor (if any) that we are about to perform a validation check.   &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;Line 30 is where we call to the &lt;em&gt;LicensingManager&lt;/em&gt; class to check if the license is in a valid state.    &lt;br /&gt;Between line 31 to 59 we handle the scenario when the validation check had failed.    &lt;br /&gt;From line 33 to 36 we notify to the &lt;em&gt;ILicensingHandler&lt;/em&gt; implementor (if any) that the validation check had failed.    &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;From line 37 to 58 we check what is the value of the &lt;em&gt;CheckOption&lt;/em&gt; property, and perform the according strategy to represent such option.     &lt;br /&gt;If the enum is assigned as &lt;em&gt;ContinueInvocation&lt;/em&gt;, then we just execute the original method by calling to &lt;em&gt;base.OnInvocation(eventArgs)&lt;/em&gt;.     &lt;br /&gt;If the enum is assigned as &lt;em&gt;EndInvocation&lt;/em&gt;, then we break the switch statement and nothing else is done.    &lt;br /&gt;if the enum is assigned as &lt;em&gt;ThrowSecurityCheckOperationException&lt;/em&gt;, then we inform about this to the &lt;em&gt;ILicensingHandler&lt;/em&gt; implementor (if any) and we pass a boolean variable “by ref”, this boolean variable can be used to abort this action (no exception is throw), if the implementor does not cancel this, then the exception is thrown, if is the opposite, then we do not throw any exception and execute the original method.    &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;From line 60 to 64, we execute the original method because the LicensingManager class returns a valid result for the license evaluation.&lt;/p&gt;  &lt;p&gt;And finally from line 65 to 68, we notify to the &lt;em&gt;ILicensingHandler&lt;/em&gt; implementor (if any)&amp;#160; that the security check had terminated.&lt;/p&gt;  &lt;div style="font-family: courier new; background: white; color: black; font-size: 10pt"&gt;   &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 6&lt;/span&gt; [&lt;span style="color: #2b91af"&gt;Serializable&lt;/span&gt;]&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 7&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;LicensingCheckAttribute&lt;/span&gt; : &lt;span style="color: #2b91af"&gt;OnMethodInvocationAspect&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 8&lt;/span&gt; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 9&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: #2b91af"&gt;LicensingCheckOptions&lt;/span&gt; CheckOption&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 10&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 11&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;get&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 12&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;set&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 13&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 14&lt;/span&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 15&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;object&lt;/span&gt; Tag { &lt;span style="color: blue"&gt;get&lt;/span&gt;; &lt;span style="color: blue"&gt;set&lt;/span&gt;; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 16&lt;/span&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 17&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;override&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; OnInvocation(&lt;span style="color: #2b91af"&gt;MethodInvocationEventArgs&lt;/span&gt; eventArgs)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 18&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 19&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: green"&gt;// Security check goes here&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 20&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: green"&gt;// DO NOT USE THIS IN PRODUCTION &lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 21&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;var&lt;/span&gt; licensingHandler = eventArgs.Instance &lt;span style="color: blue"&gt;as&lt;/span&gt; &lt;span style="color: #2b91af"&gt;ILicensingHandler&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 22&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;var&lt;/span&gt; instance = eventArgs.Instance;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 23&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;var&lt;/span&gt; method = eventArgs.Method;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 24&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;var&lt;/span&gt; arguments = eventArgs.GetArgumentArray();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 25&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;var&lt;/span&gt; licensingHandlerParameter = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;LicensingHandlerParameter&lt;/span&gt;(instance, Tag, method, arguments, CheckOption);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 26&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (licensingHandler != &lt;span style="color: blue"&gt;null&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 27&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 28&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; licensingHandler.BeforePerformSecurityCheck(licensingHandlerParameter);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 29&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 30&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;var&lt;/span&gt; isValid = &lt;span style="color: #2b91af"&gt;LicensingManager&lt;/span&gt;.IsValid();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 31&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (!isValid)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 32&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 33&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (licensingHandler != &lt;span style="color: blue"&gt;null&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 34&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 35&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; licensingHandler.SecurityCheckFailed(licensingHandlerParameter);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 36&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 37&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;switch&lt;/span&gt; (CheckOption)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 38&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 39&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;case&lt;/span&gt; &lt;span style="color: #2b91af"&gt;LicensingCheckOptions&lt;/span&gt;.ContinueInvocation:&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 40&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;base&lt;/span&gt;.OnInvocation(eventArgs);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 41&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;break&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 42&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;case&lt;/span&gt; &lt;span style="color: #2b91af"&gt;LicensingCheckOptions&lt;/span&gt;.EndInvocation:&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 43&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;break&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 44&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;case&lt;/span&gt; &lt;span style="color: #2b91af"&gt;LicensingCheckOptions&lt;/span&gt;.ThrowSecurityCheckOperationException:&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 45&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;bool&lt;/span&gt; cancel = &lt;span style="color: blue"&gt;false&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 46&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (licensingHandler != &lt;span style="color: blue"&gt;null&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 47&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 48&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; licensingHandler.HandleSecurityCheckOperationException(licensingHandlerParameter, &lt;span style="color: blue"&gt;ref&lt;/span&gt; cancel);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 49&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 50&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (!cancel)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 51&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 52&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;throw&lt;/span&gt; &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;SecurityCheckOperationException&lt;/span&gt;();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 53&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 54&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;base&lt;/span&gt;.OnInvocation(eventArgs);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 55&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;return&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 56&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;default&lt;/span&gt;:&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 57&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;throw&lt;/span&gt; &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;ArgumentOutOfRangeException&lt;/span&gt;();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 58&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 59&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 60&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;else&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 61&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 62&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;base&lt;/span&gt;.OnInvocation(eventArgs);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 63&lt;/span&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 64&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 65&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (licensingHandler != &lt;span style="color: blue"&gt;null&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 66&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 67&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; licensingHandler.AfterPerformSecurityCheck(licensingHandlerParameter, isValid);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 68&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 69&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 70&lt;/span&gt; }&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;With all this infrastructure code we can go and change our Winform App to use our licensing component as follows:&lt;/p&gt;  &lt;div style="font-family: courier new; background: white; color: black; font-size: 10pt"&gt;   &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 8&lt;/span&gt;&amp;#160;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;partial&lt;/span&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Form1&lt;/span&gt; : &lt;span style="color: #2b91af"&gt;Form&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;ILicensingHandler&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160;&amp;#160; 9&lt;/span&gt; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 10&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; Form1()&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 11&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 12&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; InitializeComponent();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 13&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 14&lt;/span&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 15&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;private&lt;/span&gt; &lt;span style="color: blue"&gt;int&lt;/span&gt; _invalidCallsCount;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 16&lt;/span&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 17&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [&lt;span style="color: #2b91af"&gt;LicensingCheck&lt;/span&gt;(CheckOption = &lt;span style="color: #2b91af"&gt;LicensingCheckOptions&lt;/span&gt;.EndInvocation)]&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 18&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;private&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; button1_Click(&lt;span style="color: blue"&gt;object&lt;/span&gt; sender, &lt;span style="color: #2b91af"&gt;EventArgs&lt;/span&gt; e)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 19&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 20&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #2b91af"&gt;MessageBox&lt;/span&gt;.Show(&lt;span style="color: #a31515"&gt;&amp;quot;Executing =&amp;gt; &amp;quot;&lt;/span&gt; + button1.Text);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 21&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 22&lt;/span&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 23&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [&lt;span style="color: #2b91af"&gt;LicensingCheck&lt;/span&gt;(CheckOption = &lt;span style="color: #2b91af"&gt;LicensingCheckOptions&lt;/span&gt;.EndInvocation)]&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 24&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;private&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; button2_Click(&lt;span style="color: blue"&gt;object&lt;/span&gt; sender, &lt;span style="color: #2b91af"&gt;EventArgs&lt;/span&gt; e)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 25&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 26&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #2b91af"&gt;MessageBox&lt;/span&gt;.Show(&lt;span style="color: #a31515"&gt;&amp;quot;Executing =&amp;gt; &amp;quot;&lt;/span&gt; + button2.Text);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 27&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 28&lt;/span&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 29&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [&lt;span style="color: #2b91af"&gt;LicensingCheck&lt;/span&gt;(CheckOption = &lt;span style="color: #2b91af"&gt;LicensingCheckOptions&lt;/span&gt;.ThrowSecurityCheckOperationException)]&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 30&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;private&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; button3_Click(&lt;span style="color: blue"&gt;object&lt;/span&gt; sender, &lt;span style="color: #2b91af"&gt;EventArgs&lt;/span&gt; e)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 31&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 32&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #2b91af"&gt;MessageBox&lt;/span&gt;.Show(&lt;span style="color: #a31515"&gt;&amp;quot;Executing =&amp;gt; &amp;quot;&lt;/span&gt; + button3.Text);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 33&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 34&lt;/span&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 35&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [&lt;span style="color: #2b91af"&gt;LicensingCheck&lt;/span&gt;(CheckOption = &lt;span style="color: #2b91af"&gt;LicensingCheckOptions&lt;/span&gt;.ContinueInvocation)]&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 36&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;private&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; button4_Click(&lt;span style="color: blue"&gt;object&lt;/span&gt; sender, &lt;span style="color: #2b91af"&gt;EventArgs&lt;/span&gt; e)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 37&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 38&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #2b91af"&gt;MessageBox&lt;/span&gt;.Show(&lt;span style="color: #a31515"&gt;&amp;quot;Executing =&amp;gt; &amp;quot;&lt;/span&gt; + button4.Text);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 39&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 40&lt;/span&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 41&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;private&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; unrestricted_Click(&lt;span style="color: blue"&gt;object&lt;/span&gt; sender, &lt;span style="color: #2b91af"&gt;EventArgs&lt;/span&gt; e)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 42&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 43&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; securityCheckStatus.Text = &lt;span style="color: #a31515"&gt;&amp;quot;Unrestricted method&amp;quot;&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 44&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #2b91af"&gt;MessageBox&lt;/span&gt;.Show(&lt;span style="color: #a31515"&gt;&amp;quot;Executing =&amp;gt; &amp;quot;&lt;/span&gt; + ((&lt;span style="color: #2b91af"&gt;Button&lt;/span&gt;)(sender)).Text);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 45&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 46&lt;/span&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 47&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; BeforePerformSecurityCheck(&lt;span style="color: #2b91af"&gt;LicensingHandlerParameter&lt;/span&gt; information)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 48&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 49&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; securityCheckStatus.Text = &lt;span style="color: #a31515"&gt;&amp;quot;Performing Security Check&amp;quot;&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 50&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 51&lt;/span&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 52&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; AfterPerformSecurityCheck(&lt;span style="color: #2b91af"&gt;LicensingHandlerParameter&lt;/span&gt; information, &lt;span style="color: blue"&gt;bool&lt;/span&gt; valid)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 53&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 54&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (valid)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 55&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 56&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; securityCheckStatus.Text = &lt;span style="color: #a31515"&gt;&amp;quot;You have licensing permissions to execute this method &amp;quot;&lt;/span&gt; + information.Method.Name;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 57&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 58&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;else&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 59&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 60&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (information.CheckOption == &lt;span style="color: #2b91af"&gt;LicensingCheckOptions&lt;/span&gt;.ContinueInvocation)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 61&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 62&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; securityCheckStatus.Text = &lt;span style="color: #a31515"&gt;&amp;quot;You have temporary permissions to execute this method &amp;quot;&lt;/span&gt; +&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 63&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; information.Method.Name + &lt;span style="color: #a31515"&gt;&amp;quot;\n please renew your license&amp;quot;&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 64&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 65&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;else&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 66&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 67&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; securityCheckStatus.Text = &lt;span style="color: #a31515"&gt;&amp;quot;You don't have licensing permissions to execute this method &amp;quot;&lt;/span&gt; +&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 68&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; information.Method.Name + &lt;span style="color: #a31515"&gt;&amp;quot;\n please renew your license&amp;quot;&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 69&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 70&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 71&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 72&lt;/span&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 73&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; SecurityCheckFailed(&lt;span style="color: #2b91af"&gt;LicensingHandlerParameter&lt;/span&gt; information)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 74&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 75&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #2b91af"&gt;Debug&lt;/span&gt;.WriteLine(&lt;span style="color: #a31515"&gt;&amp;quot;Security check failed for &amp;quot;&lt;/span&gt; + information.Method.Name);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 76&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 77&lt;/span&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 78&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; HandleSecurityCheckOperationException(&lt;span style="color: #2b91af"&gt;LicensingHandlerParameter&lt;/span&gt; information, &lt;span style="color: blue"&gt;ref&lt;/span&gt; &lt;span style="color: blue"&gt;bool&lt;/span&gt; cancel)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 79&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 80&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;if&lt;/span&gt; (_invalidCallsCount &amp;lt; 10)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 81&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 82&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;string&lt;/span&gt; message =&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 83&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;string&lt;/span&gt;.Format(&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 84&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #a31515"&gt;&amp;quot;You only have {0} more chances of use this method, after that, it will throw an exception.&amp;quot;&lt;/span&gt;,&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 85&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 10 - _invalidCallsCount);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 86&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; securityCheckStatus.Text = message;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 87&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; _invalidCallsCount++;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 88&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; cancel = &lt;span style="color: blue"&gt;true&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 89&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 90&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: blue"&gt;else&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 91&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 92&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; securityCheckStatus.Text = &lt;span style="color: #a31515"&gt;&amp;quot;You have run out of chances to execute this method &amp;quot;&lt;/span&gt; +&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 93&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; information.Method.Name + &lt;span style="color: #a31515"&gt;&amp;quot;\n please renew your license&amp;quot;&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 94&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 95&lt;/span&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #2b91af"&gt;&amp;#160;&amp;#160; 96&lt;/span&gt; }&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;You can inspect the solution attached to this article to understand how everything works, and for the lazy programmer out there, here is a small video showcasing how the application behaves after those changes.&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:5737277B-5D6D-4f48-ABFC-DD9C333F4C5D:be93c402-f316-4459-992d-43def4ad8044" class="wlWriterEditableSmartContent"&gt;&lt;div id="6e318b30-17a4-4100-80a5-21e536d52a4a" style="margin: 0px; padding: 0px; display: inline;"&gt;&lt;div&gt;&lt;a href="http://www.youtube.com/watch?v=HV4tJyM8rDc" target="_new"&gt;&lt;img src="http://lh4.ggpht.com/_-4wV51cifeA/SrAu_JsLnVI/AAAAAAAAAIE/d9w07SFFHG0/video8c2c6bd08263%5B10%5D.jpg?imgmax=800" style="border-style: none" galleryimg="no" onload="var downlevelDiv = document.getElementById('6e318b30-17a4-4100-80a5-21e536d52a4a'); downlevelDiv.innerHTML = &amp;quot;&amp;lt;div&amp;gt;&amp;lt;object width=\&amp;quot;425\&amp;quot; height=\&amp;quot;355\&amp;quot;&amp;gt;&amp;lt;param name=\&amp;quot;movie\&amp;quot; value=\&amp;quot;http://www.youtube.com/v/HV4tJyM8rDc&amp;amp;hl=en\&amp;quot;&amp;gt;&amp;lt;\/param&amp;gt;&amp;lt;embed src=\&amp;quot;http://www.youtube.com/v/HV4tJyM8rDc&amp;amp;hl=en\&amp;quot; type=\&amp;quot;application/x-shockwave-flash\&amp;quot; width=\&amp;quot;425\&amp;quot; height=\&amp;quot;355\&amp;quot;&amp;gt;&amp;lt;\/embed&amp;gt;&amp;lt;\/object&amp;gt;&amp;lt;\/div&amp;gt;&amp;quot;;" alt=""&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;  &lt;p&gt;You can download the sample project from &lt;a href="http://emiajnetsamples.googlecode.com/files/EmiajNet.AOP.zip" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Happy coding, bye bye.&amp;#160; &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12895914-8689887410679404977?l=emiajnet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://emiajnet.blogspot.com/feeds/8689887410679404977/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12895914&amp;postID=8689887410679404977' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12895914/posts/default/8689887410679404977'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12895914/posts/default/8689887410679404977'/><link rel='alternate' type='text/html' href='http://emiajnet.blogspot.com/2009/09/implementing-dead-simple-licensing.html' title='Implementing a Dead Simple Licensing Library with PostSharp'/><author><name>jaime</name><uri>http://www.blogger.com/profile/05400435935764737984</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_-4wV51cifeA/SrAu-FQQo-I/AAAAAAAAAH0/cRQccBojGJ0/s72-c/aop_licensing_ui_thumb%5B5%5D.jpg?imgmax=800' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12895914.post-994328312983189947</id><published>2009-07-08T11:10:00.000-05:00</published><updated>2009-07-08T11:10:21.143-05:00</updated><title type='text'>Official Google Blog: Introducing the Google Chrome OS</title><content type='html'>&lt;a href="http://googleblog.blogspot.com/2009/07/introducing-google-chrome-os.html"&gt;Official Google Blog: Introducing the Google Chrome OS&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12895914-994328312983189947?l=emiajnet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://googleblog.blogspot.com/2009/07/introducing-google-chrome-os.html' title='Official Google Blog: Introducing the Google Chrome OS'/><link rel='replies' type='application/atom+xml' href='http://emiajnet.blogspot.com/feeds/994328312983189947/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12895914&amp;postID=994328312983189947' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12895914/posts/default/994328312983189947'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12895914/posts/default/994328312983189947'/><link rel='alternate' type='text/html' href='http://emiajnet.blogspot.com/2009/07/official-google-blog-introducing-google.html' title='Official Google Blog: Introducing the Google Chrome OS'/><author><name>jaime</name><uri>http://www.blogger.com/profile/05400435935764737984</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12895914.post-3567424998321278152</id><published>2009-06-23T22:37:00.001-05:00</published><updated>2009-06-23T22:44:59.624-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Refactoring'/><category scheme='http://www.blogger.com/atom/ns#' term='codeproject'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='.Net'/><title type='text'>Refactoring Switch Statements (Take 2)</title><content type='html'>&lt;p&gt;Hello to everyone, had been such a long time since my last article. Many interesting things had been going on in &lt;a href="http://www.sansir.fo/" target="_blank"&gt;Sansir&lt;/a&gt; lately that had been taking my entire free time, and also I’m a man with strong family links, so that makes difficult to publish articles fluently. I am not complaining about it, not at all, color me “happy”.&lt;/p&gt;  &lt;p&gt;Ok, stop the whining. &lt;/p&gt;  &lt;p&gt;In one of our previous articles, I showed you how to refactor a piece of code which was deciding what method to execute based on the evaluation result of a Switch statement, you can read about it &lt;a href="http://emiajnet.blogspot.com/2009/01/refactoring-cases.html" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;As a final note I stated in such article that the presented code could be refactored even further, because if you look careful, we had just moved the maintenance nightmare to another place in the program, but the original problem stills.&lt;/p&gt;  &lt;p&gt;What to do then? This is what I would do:&lt;/p&gt;  &lt;p&gt;1) Create an specific class for each Sport that is going to be handled, those classes&amp;#160; must implement a simple interface and they need to be decorated with an attribute where is specified the target sport that it will handle, those looks like:&lt;/p&gt;  &lt;p style="margin: 0px; font-family: lucida console; background: #141414; color: #bebec8; font-size: 10pt"&gt;&lt;span style="color: #cda869"&gt;public&lt;/span&gt; &lt;span style="color: #cda869"&gt;interface&lt;/span&gt; &lt;span style="color: #d0da90"&gt;INewsDisplayer&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin: 0px; font-family: lucida console; background: #141414; color: #bebec8; font-size: 10pt"&gt;{&lt;/p&gt;  &lt;p style="margin: 0px; font-family: lucida console; background: #141414; color: #bebec8; font-size: 10pt"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #cda869"&gt;void&lt;/span&gt; Display();&lt;/p&gt;  &lt;p style="margin: 0px; font-family: lucida console; background: #141414; color: #bebec8; font-size: 10pt"&gt;}&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="font-family: lucida console; background: #141414; color: #bebec8; font-size: 10pt"&gt;   &lt;p style="margin: 0px"&gt;&lt;span style="color: #cda869"&gt;public&lt;/span&gt; &lt;span style="color: #cda869"&gt;class&lt;/span&gt; &lt;span style="color: #7386a5"&gt;NewsDisplayerDefinitionAttribute&lt;/span&gt; : &lt;span style="color: #7386a5"&gt;Attribute&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;{&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #cda869"&gt;public&lt;/span&gt; NewsDisplayerDefinitionAttribute(&lt;span style="color: #7386a5"&gt;Sports&lt;/span&gt; sport)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Sport &lt;span style="color: #cda869"&gt;=&lt;/span&gt; sport;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #cda869"&gt;public&lt;/span&gt; &lt;span style="color: #7386a5"&gt;Sports&lt;/span&gt; Sport { &lt;span style="color: #cda869"&gt;get&lt;/span&gt;; &lt;span style="color: #cda869"&gt;private&lt;/span&gt; &lt;span style="color: #cda869"&gt;set&lt;/span&gt;; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;}&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;An implementation of this convention would look like:&lt;/p&gt;  &lt;div style="font-family: lucida console; background: #141414; color: #bebec8; font-size: 10pt"&gt;   &lt;p style="margin: 0px"&gt;[&lt;span style="color: #7386a5"&gt;NewsDisplayerDefinition&lt;/span&gt;(&lt;span style="color: #7386a5"&gt;Sports&lt;/span&gt;&lt;span style="color: #cda869"&gt;.&lt;/span&gt;Soccer)]       &lt;br /&gt;&lt;span style="color: #cda869"&gt;public&lt;/span&gt; &lt;span style="color: #cda869"&gt;class&lt;/span&gt; &lt;span style="color: #7386a5"&gt;SoccerNewsDisplayer&lt;/span&gt; : &lt;span style="color: #d0da90"&gt;INewsDisplayer&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;{ &lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #cda869"&gt;&amp;#160;&amp;#160;&amp;#160; #region&lt;/span&gt; INewsDisplayer Members&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #cda869"&gt;public&lt;/span&gt; &lt;span style="color: #cda869"&gt;void&lt;/span&gt; Display()&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #7386a5"&gt;Console&lt;/span&gt;&lt;span style="color: #cda869"&gt;.&lt;/span&gt;WriteLine(&lt;span style="color: #8f9d6a"&gt;&amp;quot;Displaying News for Soccer&amp;quot;&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #5f5a60"&gt;// Real implementation below&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #5f5a60"&gt;// Do something&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;span style="color: #cda869"&gt;&amp;#160;&amp;#160; #endregion&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;}&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;2) Using the &lt;a href="http://en.wikipedia.org/wiki/Factory_method_pattern" target="_blank"&gt;Factory Pattern&lt;/a&gt;, create a class that takes an Sport parameter and return an IEnumerable&amp;lt;INewsDisplayer&amp;gt; instance.&amp;#160; &lt;br /&gt;One difference with our previous attempt is that we are going to be able to define more than one implementation for a given Sport.     &lt;br /&gt;This factory class, will scan all the assemblies for the current App Domain and&amp;#160; if it finds a type which follows the pattern that I have described in the previous point, it will read the metadata and append an instance of this type to a dictionary that will serve us as our lookup table to return the correct instances for the requested Sport. This factory class looks like:&lt;/p&gt;  &lt;div style="font-family: lucida console; background: #141414; color: #bebec8; font-size: 10pt"&gt;   &lt;p style="margin: 0px"&gt;&lt;span style="color: #cda869"&gt;public&lt;/span&gt; &lt;span style="color: #cda869"&gt;static&lt;/span&gt; &lt;span style="color: #cda869"&gt;class&lt;/span&gt; &lt;span style="color: #7386a5"&gt;NewsDisplayerFactory&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;{&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #cda869"&gt;private&lt;/span&gt; &lt;span style="color: #cda869"&gt;static&lt;/span&gt; &lt;span style="color: #cda869"&gt;readonly&lt;/span&gt; &lt;span style="color: #d0da90"&gt;IDictionary&lt;/span&gt;&lt;span style="color: #cda869"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #7386a5"&gt;Sports&lt;/span&gt;, &lt;span style="color: #d0da90"&gt;IEnumerable&lt;/span&gt;&lt;span style="color: #cda869"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #d0da90"&gt;INewsDisplayer&lt;/span&gt;&lt;span style="color: #cda869"&gt;&amp;gt;&amp;gt;&lt;/span&gt; lookupTable &lt;span style="color: #cda869"&gt;=&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #cda869"&gt;new&lt;/span&gt; &lt;span style="color: #7386a5"&gt;Dictionary&lt;/span&gt;&lt;span style="color: #cda869"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #7386a5"&gt;Sports&lt;/span&gt;, &lt;span style="color: #d0da90"&gt;IEnumerable&lt;/span&gt;&lt;span style="color: #cda869"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #d0da90"&gt;INewsDisplayer&lt;/span&gt;&lt;span style="color: #cda869"&gt;&amp;gt;&amp;gt;&lt;/span&gt;();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #cda869"&gt;static&lt;/span&gt; NewsDisplayerFactory()&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; BootStrap();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #cda869"&gt;private&lt;/span&gt; &lt;span style="color: #cda869"&gt;static&lt;/span&gt; &lt;span style="color: #cda869"&gt;void&lt;/span&gt; BootStrap()&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #5f5a60"&gt;// Find all types in all the assemblies from the current appdomain &lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #5f5a60"&gt;// that have a correct implementation of &lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #5f5a60"&gt;// News Displayer&amp;#160; (NewsDisplayerDefinitionAttribute + INewsDisplayer)&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #cda869"&gt;var&lt;/span&gt; interfaceFullName &lt;span style="color: #cda869"&gt;=&lt;/span&gt; &lt;span style="color: #cda869"&gt;typeof&lt;/span&gt; (&lt;span style="color: #d0da90"&gt;INewsDisplayer&lt;/span&gt;)&lt;span style="color: #cda869"&gt;.&lt;/span&gt;FullName;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #cda869"&gt;var&lt;/span&gt; newsDisplayerAttributeType &lt;span style="color: #cda869"&gt;=&lt;/span&gt; &lt;span style="color: #cda869"&gt;typeof&lt;/span&gt; (&lt;span style="color: #7386a5"&gt;NewsDisplayerDefinitionAttribute&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #cda869"&gt;var&lt;/span&gt; result &lt;span style="color: #cda869"&gt;=&lt;/span&gt; &lt;span style="color: #cda869"&gt;from&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; assembly &lt;span style="color: #cda869"&gt;in&lt;/span&gt; &lt;span style="color: #7386a5"&gt;AppDomain&lt;/span&gt;&lt;span style="color: #cda869"&gt;.&lt;/span&gt;CurrentDomain&lt;span style="color: #cda869"&gt;.&lt;/span&gt;GetAssemblies()&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #cda869"&gt;from&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; type &lt;span style="color: #cda869"&gt;in&lt;/span&gt; assembly&lt;span style="color: #cda869"&gt;.&lt;/span&gt;GetTypes()&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #cda869"&gt;let&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; definition &lt;span style="color: #cda869"&gt;=&lt;/span&gt; type&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #cda869"&gt;.&lt;/span&gt;GetCustomAttributes(newsDisplayerAttributeType, &lt;span style="color: #cda869"&gt;true&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #cda869"&gt;.&lt;/span&gt;Cast&lt;span style="color: #cda869"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #7386a5"&gt;NewsDisplayerDefinitionAttribute&lt;/span&gt;&lt;span style="color: #cda869"&gt;&amp;gt;&lt;/span&gt;()&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #cda869"&gt;.&lt;/span&gt;FirstOrDefault()&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #cda869"&gt;where&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; type&lt;span style="color: #cda869"&gt;.&lt;/span&gt;GetInterface(interfaceFullName) &lt;span style="color: #cda869"&gt;!=&lt;/span&gt; &lt;span style="color: #cda869"&gt;null&lt;/span&gt; &lt;span style="color: #cda869"&gt;&amp;amp;&amp;amp;&lt;/span&gt; definition &lt;span style="color: #cda869"&gt;!=&lt;/span&gt; &lt;span style="color: #cda869"&gt;null&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #cda869"&gt;group&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; (&lt;span style="color: #d0da90"&gt;INewsDisplayer&lt;/span&gt;) &lt;span style="color: #7386a5"&gt;Activator&lt;/span&gt;&lt;span style="color: #cda869"&gt;.&lt;/span&gt;CreateInstance(type)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #cda869"&gt;by&lt;/span&gt; definition&lt;span style="color: #cda869"&gt;.&lt;/span&gt;Sport;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #5f5a60"&gt;// Filling the dictionary&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #cda869"&gt;foreach&lt;/span&gt; (&lt;span style="color: #cda869"&gt;var&lt;/span&gt; item &lt;span style="color: #cda869"&gt;in&lt;/span&gt; result)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; lookupTable&lt;span style="color: #cda869"&gt;.&lt;/span&gt;Add(item&lt;span style="color: #cda869"&gt;.&lt;/span&gt;Key, item&lt;span style="color: #cda869"&gt;.&lt;/span&gt;ToList());&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #cda869"&gt;public&lt;/span&gt; &lt;span style="color: #cda869"&gt;static&lt;/span&gt; &lt;span style="color: #d0da90"&gt;IEnumerable&lt;/span&gt;&lt;span style="color: #cda869"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #d0da90"&gt;INewsDisplayer&lt;/span&gt;&lt;span style="color: #cda869"&gt;&amp;gt;&lt;/span&gt; GetInstance(&lt;span style="color: #7386a5"&gt;Sports&lt;/span&gt; sport)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #d0da90"&gt;IEnumerable&lt;/span&gt;&lt;span style="color: #cda869"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #d0da90"&gt;INewsDisplayer&lt;/span&gt;&lt;span style="color: #cda869"&gt;&amp;gt;&lt;/span&gt; newsDisplayer;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #cda869"&gt;if&lt;/span&gt; (lookupTable&lt;span style="color: #cda869"&gt;.&lt;/span&gt;TryGetValue(sport, &lt;span style="color: #cda869"&gt;out&lt;/span&gt; newsDisplayer))&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #cda869"&gt;return&lt;/span&gt; newsDisplayer;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #cda869"&gt;else&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #cda869"&gt;throw&lt;/span&gt; &lt;span style="color: #cda869"&gt;new&lt;/span&gt; &lt;span style="color: #7386a5"&gt;NotImplementedException&lt;/span&gt;(&lt;span style="color: #cda869"&gt;string.&lt;/span&gt;Format(&lt;span style="color: #8f9d6a"&gt;&amp;quot;The method for the sport {0} is not implemented&amp;quot;&lt;/span&gt;, sport));&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;}&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;3) Using the &lt;a href="http://en.wikipedia.org/wiki/Strategy_pattern" target="_blank"&gt;Strategy Pattern&lt;/a&gt;, we are going to change our SportNews class to change its context by passing to it the kind of Sport that is going to handle.     &lt;br /&gt;Such class now it will look like:&lt;/p&gt;  &lt;div style="font-family: lucida console; background: #141414; color: #bebec8; font-size: 10pt"&gt;   &lt;p style="margin: 0px"&gt;&lt;span style="color: #cda869"&gt;public&lt;/span&gt; &lt;span style="color: #cda869"&gt;class&lt;/span&gt; &lt;span style="color: #7386a5"&gt;SportNews&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;{&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #cda869"&gt;private&lt;/span&gt; &lt;span style="color: #d0da90"&gt;IEnumerable&lt;/span&gt;&lt;span style="color: #cda869"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #d0da90"&gt;INewsDisplayer&lt;/span&gt;&lt;span style="color: #cda869"&gt;&amp;gt;&lt;/span&gt; newsDisplayer;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #cda869"&gt;public&lt;/span&gt; &lt;span style="color: #cda869"&gt;void&lt;/span&gt; SetContext(&lt;span style="color: #7386a5"&gt;Sports&lt;/span&gt; sport)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; newsDisplayer &lt;span style="color: #cda869"&gt;=&lt;/span&gt; &lt;span style="color: #7386a5"&gt;NewsDisplayerFactory&lt;/span&gt;&lt;span style="color: #cda869"&gt;.&lt;/span&gt;GetInstance(sport);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #cda869"&gt;public&lt;/span&gt; &lt;span style="color: #cda869"&gt;void&lt;/span&gt; DisplayNews()&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #cda869"&gt;foreach&lt;/span&gt; (&lt;span style="color: #cda869"&gt;var&lt;/span&gt; displayer &lt;span style="color: #cda869"&gt;in&lt;/span&gt; newsDisplayer)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; displayer&lt;span style="color: #cda869"&gt;.&lt;/span&gt;Display();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;}&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;That’s it, with our new approach we can continue adding NewsDisplayers and use those in our program without touching other parts of our developed program, doing it by adding more classes to our assembly or dropping assemblies into the bin directory (isn’t this named a Plugin model?).&lt;/p&gt;  &lt;p&gt;Finally, I’ll like to show our Program class where every components is used to perform the original idea for this program:&lt;/p&gt;  &lt;div style="font-family: lucida console; background: #141414; color: #bebec8; font-size: 10pt"&gt;   &lt;p style="margin: 0px"&gt;&lt;span style="color: #cda869"&gt;class&lt;/span&gt; &lt;span style="color: #7386a5"&gt;Program&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;{&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #cda869"&gt;private&lt;/span&gt; &lt;span style="color: #cda869"&gt;static&lt;/span&gt; &lt;span style="color: #cda869"&gt;string&lt;/span&gt; options &lt;span style="color: #cda869"&gt;=&lt;/span&gt; &lt;span style="color: #cda869"&gt;null&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #cda869"&gt;private&lt;/span&gt; &lt;span style="color: #cda869"&gt;static&lt;/span&gt; &lt;span style="color: #cda869"&gt;readonly&lt;/span&gt; &lt;span style="color: #7386a5"&gt;Type&lt;/span&gt; sportsEnumType &lt;span style="color: #cda869"&gt;=&lt;/span&gt; &lt;span style="color: #cda869"&gt;typeof&lt;/span&gt;(&lt;span style="color: #7386a5"&gt;Sports&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #cda869"&gt;static&lt;/span&gt; &lt;span style="color: #cda869"&gt;void&lt;/span&gt; Main(&lt;span style="color: #cda869"&gt;string&lt;/span&gt;[] args)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #cda869"&gt;var&lt;/span&gt; news &lt;span style="color: #cda869"&gt;=&lt;/span&gt; &lt;span style="color: #cda869"&gt;new&lt;/span&gt; &lt;span style="color: #7386a5"&gt;SportNews&lt;/span&gt;();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #cda869"&gt;while&lt;/span&gt; (&lt;span style="color: #cda869"&gt;true&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #7386a5"&gt;Console&lt;/span&gt;&lt;span style="color: #cda869"&gt;.&lt;/span&gt;WriteLine();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; DisplayOptions();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #cda869"&gt;var&lt;/span&gt; key &lt;span style="color: #cda869"&gt;=&lt;/span&gt; &lt;span style="color: #7386a5"&gt;Console&lt;/span&gt;&lt;span style="color: #cda869"&gt;.&lt;/span&gt;ReadKey()&lt;span style="color: #cda869"&gt;.&lt;/span&gt;KeyChar&lt;span style="color: #cda869"&gt;.&lt;/span&gt;ToString();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #7386a5"&gt;Console&lt;/span&gt;&lt;span style="color: #cda869"&gt;.&lt;/span&gt;WriteLine();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #cda869"&gt;try&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #cda869"&gt;var&lt;/span&gt; sport &lt;span style="color: #cda869"&gt;=&lt;/span&gt; (&lt;span style="color: #7386a5"&gt;Sports&lt;/span&gt;)(&lt;span style="color: #7386a5"&gt;Enum&lt;/span&gt;&lt;span style="color: #cda869"&gt;.&lt;/span&gt;Parse(sportsEnumType, key));&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; news&lt;span style="color: #cda869"&gt;.&lt;/span&gt;SetContext(sport);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; news&lt;span style="color: #cda869"&gt;.&lt;/span&gt;DisplayNews();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #cda869"&gt;catch&lt;/span&gt; (&lt;span style="color: #7386a5"&gt;Exception&lt;/span&gt; ex)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #7386a5"&gt;Console&lt;/span&gt;&lt;span style="color: #cda869"&gt;.&lt;/span&gt;WriteLine(ex);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #7386a5"&gt;Console&lt;/span&gt;&lt;span style="color: #cda869"&gt;.&lt;/span&gt;ReadLine();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #cda869"&gt;return&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #cda869"&gt;private&lt;/span&gt; &lt;span style="color: #cda869"&gt;static&lt;/span&gt; &lt;span style="color: #cda869"&gt;void&lt;/span&gt; DisplayOptions()&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #cda869"&gt;if&lt;/span&gt; (options &lt;span style="color: #cda869"&gt;==&lt;/span&gt; &lt;span style="color: #cda869"&gt;null&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #7386a5"&gt;StringBuilder&lt;/span&gt; optionsBuilder &lt;span style="color: #cda869"&gt;=&lt;/span&gt; &lt;span style="color: #cda869"&gt;new&lt;/span&gt; &lt;span style="color: #7386a5"&gt;StringBuilder&lt;/span&gt;();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #7386a5"&gt;FieldInfo&lt;/span&gt;[] enumFields &lt;span style="color: #cda869"&gt;=&lt;/span&gt; sportsEnumType&lt;span style="color: #cda869"&gt;.&lt;/span&gt;UnderlyingSystemType&lt;span style="color: #cda869"&gt;.&lt;/span&gt;GetFields(&lt;span style="color: #7386a5"&gt;BindingFlags&lt;/span&gt;&lt;span style="color: #cda869"&gt;.&lt;/span&gt;Public &lt;span style="color: #cda869"&gt;|&lt;/span&gt; &lt;span style="color: #7386a5"&gt;BindingFlags&lt;/span&gt;&lt;span style="color: #cda869"&gt;.&lt;/span&gt;Static);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #cda869"&gt;foreach&lt;/span&gt; (&lt;span style="color: #7386a5"&gt;FieldInfo&lt;/span&gt; enumField &lt;span style="color: #cda869"&gt;in&lt;/span&gt; enumFields)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #cda869"&gt;object&lt;/span&gt; enumValue &lt;span style="color: #cda869"&gt;=&lt;/span&gt; enumField&lt;span style="color: #cda869"&gt;.&lt;/span&gt;GetRawConstantValue();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #7386a5"&gt;Sports&lt;/span&gt; sport &lt;span style="color: #cda869"&gt;=&lt;/span&gt; (&lt;span style="color: #7386a5"&gt;Sports&lt;/span&gt;)(enumValue);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; optionsBuilder&lt;span style="color: #cda869"&gt;.&lt;/span&gt;AppendFormat(&lt;span style="color: #8f9d6a"&gt;&amp;quot;To display the news for {0} press {1}\n&amp;quot;&lt;/span&gt;, sport, enumValue);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; options &lt;span style="color: #cda869"&gt;=&lt;/span&gt; optionsBuilder&lt;span style="color: #cda869"&gt;.&lt;/span&gt;ToString();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #7386a5"&gt;Console&lt;/span&gt;&lt;span style="color: #cda869"&gt;.&lt;/span&gt;WriteLine(options);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;}&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;You can download the working sample from &lt;a href="http://emiajnetsamples.googlecode.com/files/EmiajNet.SwitchRefactoring2.zip" target="_blank"&gt;here&lt;/a&gt;.     &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;Happy coding, see you soon.&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:2977b22a-1137-49f2-9463-96d7e51d04f6" class="wlWriterEditableSmartContent"&gt;Etiquetas de Technorati: &lt;a href="http://technorati.com/tags/.Net" rel="tag"&gt;.Net&lt;/a&gt;,&lt;a href="http://technorati.com/tags/C%23" rel="tag"&gt;C#&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Refactoring" rel="tag"&gt;Refactoring&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12895914-3567424998321278152?l=emiajnet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://emiajnet.blogspot.com/feeds/3567424998321278152/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12895914&amp;postID=3567424998321278152' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12895914/posts/default/3567424998321278152'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12895914/posts/default/3567424998321278152'/><link rel='alternate' type='text/html' href='http://emiajnet.blogspot.com/2009/06/refactoring-switch-statements-take-2.html' title='Refactoring Switch Statements (Take 2)'/><author><name>jaime</name><uri>http://www.blogger.com/profile/05400435935764737984</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12895914.post-4855039394517769435</id><published>2009-05-07T16:54:00.001-05:00</published><updated>2009-05-08T10:42:07.553-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Refactoring'/><category scheme='http://www.blogger.com/atom/ns#' term='codeproject'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='.Net'/><title type='text'>Getting Fun with .Net Static Reflection</title><content type='html'>&lt;p&gt;Hi there to everyone. Today I want to talk about a fantastic technique that I think it will help you dear reader a lot in your daily programming task.    &lt;br /&gt;This technique is called &lt;em&gt;Static Reflection&lt;/em&gt;, here is a nice explanation about what it does from &lt;a href="http://www.lostechies.com/blogs/gabrielschenker/archive/2009/02/03/dynamic-reflection-versus-static-reflection.aspx"&gt;http://www.lostechies.com/blogs/gabrielschenker/archive/2009/02/03/dynamic-reflection-versus-static-reflection.aspx&lt;/a&gt;:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;strong&gt;Static Reflection&lt;/strong&gt; gathers meta information through the inspection of the &lt;strong&gt;Expression Tree&lt;/strong&gt;.&lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Thanks to this, you do not need any magic string to interrogate a given type for their properties or methods (like with Dynamic Reflection happens).&lt;/p&gt;  &lt;p&gt;One of the benefits that you could get from this technique is to create highly “refactorable” (is that a word?) projects due to the elimination of magic strings.&lt;/p&gt;  &lt;p&gt;Let me show you an example about this scenario:&lt;/p&gt;  &lt;p&gt;Lets say that we have a junior programmer who does have a very bad way of name things in code, he likes a lot to use TXTSpeak while writes code.    &lt;br /&gt;So one day we ask him to write a tiny windows app which should load in a dropdown a list of persons, and he goes ahead and write the following data structure:&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;div style="font-family: lucida console; background: #141414; color: #bebec8; font-size: 10pt"&gt;   &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #cda869"&gt;public&lt;/span&gt; &lt;span style="color: #cda869"&gt;class&lt;/span&gt; &lt;span style="color: #7386a5"&gt;PRSN&lt;/span&gt; &lt;span style="color: #5f5a60"&gt;//&amp;quot;Person&amp;quot; = PRSN in TXTSpeak&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #cda869"&gt;public&lt;/span&gt; &lt;span style="color: #cda869"&gt;int&lt;/span&gt; PRSNID { &lt;span style="color: #cda869"&gt;get&lt;/span&gt;; &lt;span style="color: #cda869"&gt;set&lt;/span&gt;; } &lt;span style="color: #5f5a60"&gt;//&amp;quot;PersonID&amp;quot; = PRSNID in TXTSpeak&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #cda869"&gt;public&lt;/span&gt; &lt;span style="color: #cda869"&gt;string&lt;/span&gt; PRSNNM { &lt;span style="color: #cda869"&gt;get&lt;/span&gt;; &lt;span style="color: #cda869"&gt;set&lt;/span&gt;; } &lt;span style="color: #5f5a60"&gt;//&amp;quot;PersonName&amp;quot; = PRSNNM in TXTSpeak&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;And his winform client would look like: &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;div style="font-family: lucida console; background: #141414; color: #bebec8; font-size: 10pt"&gt;   &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #cda869"&gt;public&lt;/span&gt; &lt;span style="color: #cda869"&gt;partial&lt;/span&gt; &lt;span style="color: #cda869"&gt;class&lt;/span&gt; &lt;span style="color: #7386a5"&gt;Form1&lt;/span&gt; : &lt;span style="color: #7386a5"&gt;Form&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #cda869"&gt;public&lt;/span&gt; Form1()&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; fillList();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; InitializeComponent();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #cda869"&gt;private&lt;/span&gt; &lt;span style="color: #7386a5"&gt;List&lt;/span&gt;&lt;span style="color: #cda869"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #7386a5"&gt;PRSN&lt;/span&gt;&lt;span style="color: #cda869"&gt;&amp;gt;&lt;/span&gt; dropdownDataSource &lt;span style="color: #cda869"&gt;=&lt;/span&gt; &lt;span style="color: #cda869"&gt;new&lt;/span&gt; &lt;span style="color: #7386a5"&gt;List&lt;/span&gt;&lt;span style="color: #cda869"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #7386a5"&gt;PRSN&lt;/span&gt;&lt;span style="color: #cda869"&gt;&amp;gt;&lt;/span&gt;();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #cda869"&gt;private&lt;/span&gt; &lt;span style="color: #cda869"&gt;void&lt;/span&gt; fillList()&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #5f5a60"&gt;// in the real world here you should call to the database to retrieve this data&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #5f5a60"&gt;// for the sake of the demo just use the following&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; dropdownDataSource&lt;span style="color: #cda869"&gt;.&lt;/span&gt;Add(&lt;span style="color: #cda869"&gt;new&lt;/span&gt; &lt;span style="color: #7386a5"&gt;PRSN&lt;/span&gt;()&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; PRSNID &lt;span style="color: #cda869"&gt;=&lt;/span&gt; &lt;span style="color: #9b7032"&gt;1&lt;/span&gt;,&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; PRSNNM &lt;span style="color: #cda869"&gt;=&lt;/span&gt; &lt;span style="color: #8f9d6a"&gt;&amp;quot;Jaime&amp;quot;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; });&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; dropdownDataSource&lt;span style="color: #cda869"&gt;.&lt;/span&gt;Add(&lt;span style="color: #cda869"&gt;new&lt;/span&gt; &lt;span style="color: #7386a5"&gt;PRSN&lt;/span&gt;()&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; PRSNID &lt;span style="color: #cda869"&gt;=&lt;/span&gt; &lt;span style="color: #9b7032"&gt;2&lt;/span&gt;,&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; PRSNNM &lt;span style="color: #cda869"&gt;=&lt;/span&gt; &lt;span style="color: #8f9d6a"&gt;&amp;quot;John&amp;quot;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; });&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; dropdownDataSource&lt;span style="color: #cda869"&gt;.&lt;/span&gt;Add(&lt;span style="color: #cda869"&gt;new&lt;/span&gt; &lt;span style="color: #7386a5"&gt;PRSN&lt;/span&gt;()&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; PRSNID &lt;span style="color: #cda869"&gt;=&lt;/span&gt; &lt;span style="color: #9b7032"&gt;3&lt;/span&gt;,&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; PRSNNM &lt;span style="color: #cda869"&gt;=&lt;/span&gt; &lt;span style="color: #8f9d6a"&gt;&amp;quot;Charles&amp;quot;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; });&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; dropdownDataSource&lt;span style="color: #cda869"&gt;.&lt;/span&gt;Add(&lt;span style="color: #cda869"&gt;new&lt;/span&gt; &lt;span style="color: #7386a5"&gt;PRSN&lt;/span&gt;()&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; PRSNID &lt;span style="color: #cda869"&gt;=&lt;/span&gt; &lt;span style="color: #9b7032"&gt;3&lt;/span&gt;,&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; PRSNNM &lt;span style="color: #cda869"&gt;=&lt;/span&gt; &lt;span style="color: #8f9d6a"&gt;&amp;quot;Mark&amp;quot;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; });&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #cda869"&gt;private&lt;/span&gt; &lt;span style="color: #cda869"&gt;void&lt;/span&gt; Form1_Load(&lt;span style="color: #cda869"&gt;object&lt;/span&gt; sender, &lt;span style="color: #7386a5"&gt;EventArgs&lt;/span&gt; e)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; cboPersons&lt;span style="color: #cda869"&gt;.&lt;/span&gt;ValueMember &lt;span style="color: #cda869"&gt;=&lt;/span&gt; &lt;span style="color: #8f9d6a"&gt;&amp;quot;PRSNID&amp;quot;&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; cboPersons&lt;span style="color: #cda869"&gt;.&lt;/span&gt;DisplayMember &lt;span style="color: #cda869"&gt;=&lt;/span&gt; &lt;span style="color: #8f9d6a"&gt;&amp;quot;PRSNNM&amp;quot;&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; cboPersons&lt;span style="color: #cda869"&gt;.&lt;/span&gt;DataSource &lt;span style="color: #cda869"&gt;=&lt;/span&gt; dropdownDataSource;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Here is the thing, please take a look at how the ValueMember and DisplayMember properties are being configured, the original programmer used just simple string to point to the name of the properties in his data structure. Now, your manager assigns you a task to clean up this mess and replace all that TXTSpeak with proper names, what is worst is that this kind of code is all over the place and you would have to go with the pain process of “&lt;em&gt;search/replace&lt;/em&gt;” all over your code.&lt;/p&gt;  &lt;p&gt;Is there a better way? Sure it is, here is when it comes Static Reflection.&lt;/p&gt;  &lt;p&gt;With Static Reflection all you have to do is to pass an &lt;em&gt;Expression&lt;/em&gt; indicating which property do you want to inspect and that will give you a &lt;em&gt;PropertyInfo&lt;/em&gt; object from where you can ask for the Name property of such instance and do the very same thing… but better :).&lt;/p&gt;  &lt;p&gt;First of all let me explain how this works. In the project attached to this article you’ll find the following structure:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_-4wV51cifeA/SgRSuPPQlDI/AAAAAAAAAEY/dRV57jIXGEc/s1600-h/StaticReflection-Solution%5B2%5D.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="StaticReflection-Solution" border="0" alt="StaticReflection-Solution" src="http://lh4.ggpht.com/_-4wV51cifeA/SgRSuze8VoI/AAAAAAAAAEc/NX-ZNlyzupQ/StaticReflection-Solution_thumb.jpg?imgmax=800" width="308" height="354" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;The project where all the interesting happens are is the EmiajNet.StaticReflection.Library, in there you are going to find the ReflectionHelper and StaticReflector static classes. Both of them have methods related to static reflection, but why two?, well, the ReflectionHelper class it has been borrowed from another library (FluentNHibernate) so I think is better to have it in a separated class, and the StaticReflector class it has been created by me to fill some functionality that the ReflectionHelper class does not provide (static reflection over methods that return void).    &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;Here is a class diagram to illustrate how those classes look like:    &lt;br /&gt;&lt;a href="http://lh4.ggpht.com/_-4wV51cifeA/SgRSvxeUY5I/AAAAAAAAAEg/pFkLtrpjew4/s1600-h/StaticReflection-Diagram%5B2%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="StaticReflection-Diagram" border="0" alt="StaticReflection-Diagram" src="http://lh5.ggpht.com/_-4wV51cifeA/SgRSw7DR0FI/AAAAAAAAAEk/hvHXvdDelCk/StaticReflection-Diagram_thumb.png?imgmax=800" width="643" height="392" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;The basic idea of all of them is to inspect the expression being passed and extract the object that is related to the signature of the method. So the GetMethod method returns a MethodInfo, the GetProperty method returns a PropertyInfo and so on.&lt;/p&gt;  &lt;p&gt;This is how some of those methods look like:&lt;/p&gt;  &lt;p&gt;&lt;em&gt;ReflectionHelper&lt;/em&gt;:&lt;/p&gt;  &lt;div style="font-family: lucida console; background: #141414; color: #bebec8; font-size: 10pt"&gt;   &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #cda869"&gt;public&lt;/span&gt; &lt;span style="color: #cda869"&gt;static&lt;/span&gt; &lt;span style="color: #7386a5"&gt;MethodInfo&lt;/span&gt; GetMethod&lt;span style="color: #cda869"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color: #cda869"&gt;&amp;gt;&lt;/span&gt;(&lt;span style="color: #7386a5"&gt;Expression&lt;/span&gt;&lt;span style="color: #cda869"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #7386a5"&gt;Func&lt;/span&gt;&lt;span style="color: #cda869"&gt;&amp;lt;&lt;/span&gt;T, &lt;span style="color: #cda869"&gt;object&amp;gt;&amp;gt;&lt;/span&gt; expression)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #7386a5"&gt;MethodCallExpression&lt;/span&gt; methodCall &lt;span style="color: #cda869"&gt;=&lt;/span&gt; (&lt;span style="color: #7386a5"&gt;MethodCallExpression&lt;/span&gt;) expression&lt;span style="color: #cda869"&gt;.&lt;/span&gt;Body;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #cda869"&gt;return&lt;/span&gt; methodCall&lt;span style="color: #cda869"&gt;.&lt;/span&gt;Method;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt; &lt;/div&gt;  &lt;div style="font-family: lucida console; background: #141414; color: #bebec8; font-size: 10pt"&gt;   &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #cda869"&gt;public&lt;/span&gt; &lt;span style="color: #cda869"&gt;static&lt;/span&gt; &lt;span style="color: #7386a5"&gt;PropertyInfo&lt;/span&gt; GetProperty&lt;span style="color: #cda869"&gt;&amp;lt;&lt;/span&gt;MODEL&lt;span style="color: #cda869"&gt;&amp;gt;&lt;/span&gt;(&lt;span style="color: #7386a5"&gt;Expression&lt;/span&gt;&lt;span style="color: #cda869"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #7386a5"&gt;Func&lt;/span&gt;&lt;span style="color: #cda869"&gt;&amp;lt;&lt;/span&gt;MODEL, &lt;span style="color: #cda869"&gt;object&amp;gt;&amp;gt;&lt;/span&gt; expression)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #cda869"&gt;return&lt;/span&gt; (&lt;span style="color: #7386a5"&gt;PropertyInfo&lt;/span&gt;) GetMember(expression);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt; &lt;/div&gt;  &lt;div style="font-family: lucida console; background: #141414; color: #bebec8; font-size: 10pt"&gt;   &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #cda869"&gt;public&lt;/span&gt; &lt;span style="color: #cda869"&gt;static&lt;/span&gt; &lt;span style="color: #7386a5"&gt;MemberInfo&lt;/span&gt; GetMember&lt;span style="color: #cda869"&gt;&amp;lt;&lt;/span&gt;MODEL&lt;span style="color: #cda869"&gt;&amp;gt;&lt;/span&gt;(&lt;span style="color: #7386a5"&gt;Expression&lt;/span&gt;&lt;span style="color: #cda869"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #7386a5"&gt;Func&lt;/span&gt;&lt;span style="color: #cda869"&gt;&amp;lt;&lt;/span&gt;MODEL, &lt;span style="color: #cda869"&gt;object&amp;gt;&amp;gt;&lt;/span&gt; expression)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #7386a5"&gt;MemberExpression&lt;/span&gt; memberExpression &lt;span style="color: #cda869"&gt;=&lt;/span&gt; getMemberExpression(expression);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #cda869"&gt;return&lt;/span&gt; memberExpression&lt;span style="color: #cda869"&gt;.&lt;/span&gt;Member;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt; &lt;/div&gt;  &lt;div style="font-family: lucida console; background: #141414; color: #bebec8; font-size: 10pt"&gt;   &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #cda869"&gt;public&lt;/span&gt; &lt;span style="color: #cda869"&gt;static&lt;/span&gt; &lt;span style="color: #7386a5"&gt;FieldInfo&lt;/span&gt; GetField&lt;span style="color: #cda869"&gt;&amp;lt;&lt;/span&gt;MODEL&lt;span style="color: #cda869"&gt;&amp;gt;&lt;/span&gt;(&lt;span style="color: #7386a5"&gt;Expression&lt;/span&gt;&lt;span style="color: #cda869"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #7386a5"&gt;Func&lt;/span&gt;&lt;span style="color: #cda869"&gt;&amp;lt;&lt;/span&gt;MODEL, &lt;span style="color: #cda869"&gt;object&amp;gt;&amp;gt;&lt;/span&gt; expression)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #cda869"&gt;return&lt;/span&gt; (&lt;span style="color: #7386a5"&gt;FieldInfo&lt;/span&gt;)GetMember(expression);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&lt;em&gt;StaticReflector&lt;/em&gt;:&lt;/p&gt;  &lt;div style="font-family: lucida console; background: #141414; color: #bebec8; font-size: 10pt"&gt;   &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #cda869"&gt;public&lt;/span&gt; &lt;span style="color: #cda869"&gt;static&lt;/span&gt; &lt;span style="color: #7386a5"&gt;MethodInfo&lt;/span&gt; GetMethod&lt;span style="color: #cda869"&gt;&amp;lt;&lt;/span&gt;MODEL&lt;span style="color: #cda869"&gt;&amp;gt;&lt;/span&gt;(&lt;span style="color: #7386a5"&gt;Expression&lt;/span&gt;&lt;span style="color: #cda869"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #7386a5"&gt;Func&lt;/span&gt;&lt;span style="color: #cda869"&gt;&amp;lt;&lt;/span&gt;MODEL, &lt;span style="color: #7386a5"&gt;Action&lt;/span&gt;&lt;span style="color: #cda869"&gt;&amp;gt;&amp;gt;&lt;/span&gt; exp)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #cda869"&gt;return&lt;/span&gt; GetMethodFromLambda(exp);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt; &lt;/div&gt;  &lt;div style="font-family: lucida console; background: #141414; color: #bebec8; font-size: 10pt"&gt;   &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #cda869"&gt;private&lt;/span&gt; &lt;span style="color: #cda869"&gt;static&lt;/span&gt; &lt;span style="color: #7386a5"&gt;MethodInfo&lt;/span&gt; GetMethodFromLambda(&lt;span style="color: #7386a5"&gt;LambdaExpression&lt;/span&gt; exp)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #cda869"&gt;var&lt;/span&gt; unaryExp &lt;span style="color: #cda869"&gt;=&lt;/span&gt; (&lt;span style="color: #7386a5"&gt;UnaryExpression&lt;/span&gt;)exp&lt;span style="color: #cda869"&gt;.&lt;/span&gt;Body;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #cda869"&gt;var&lt;/span&gt; methodCallExp &lt;span style="color: #cda869"&gt;=&lt;/span&gt; (&lt;span style="color: #7386a5"&gt;MethodCallExpression&lt;/span&gt;)unaryExp&lt;span style="color: #cda869"&gt;.&lt;/span&gt;Operand;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #cda869"&gt;var&lt;/span&gt; constantExp &lt;span style="color: #cda869"&gt;=&lt;/span&gt; (&lt;span style="color: #7386a5"&gt;ConstantExpression&lt;/span&gt;)methodCallExp&lt;span style="color: #cda869"&gt;.&lt;/span&gt;Arguments[&lt;span style="color: #9b7032"&gt;2&lt;/span&gt;];&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #7386a5"&gt;MethodInfo&lt;/span&gt; output &lt;span style="color: #cda869"&gt;=&lt;/span&gt; (&lt;span style="color: #7386a5"&gt;MethodInfo&lt;/span&gt;)constantExp&lt;span style="color: #cda869"&gt;.&lt;/span&gt;Value;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #cda869"&gt;return&lt;/span&gt; output;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;As you can see, is very straightforward, you can dig more into the library to give a more detailed idea.&lt;/p&gt;  &lt;p&gt;Here are some examples from the EmiajNet.StaticReflection.Test project that I want to show you so you could realize how this thing works :&lt;/p&gt;  &lt;p&gt;We have the following class that is subject of inspection:&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;div style="font-family: lucida console; background: #141414; color: #bebec8; font-size: 10pt"&gt;   &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #cda869"&gt;private&lt;/span&gt; &lt;span style="color: #cda869"&gt;class&lt;/span&gt; &lt;span style="color: #7386a5"&gt;TestClass&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #cda869"&gt;public&lt;/span&gt; &lt;span style="color: #cda869"&gt;int&lt;/span&gt; SomeIntMember;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #cda869"&gt;public&lt;/span&gt; &lt;span style="color: #cda869"&gt;string&lt;/span&gt; SomeStringMember;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #cda869"&gt;public&lt;/span&gt; &lt;span style="color: #7386a5"&gt;TestClass&lt;/span&gt; SomeComplexMember;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #cda869"&gt;public&lt;/span&gt; &lt;span style="color: #cda869"&gt;string&lt;/span&gt; SomeStringProperty { &lt;span style="color: #cda869"&gt;get&lt;/span&gt;; &lt;span style="color: #cda869"&gt;set&lt;/span&gt;; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #cda869"&gt;public&lt;/span&gt; &lt;span style="color: #cda869"&gt;int&lt;/span&gt; SomeIntProperty { &lt;span style="color: #cda869"&gt;get&lt;/span&gt;; &lt;span style="color: #cda869"&gt;set&lt;/span&gt;; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #5f5a60"&gt;//indexed property&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #cda869"&gt;public&lt;/span&gt; &lt;span style="color: #cda869"&gt;object&lt;/span&gt; &lt;span style="color: #cda869"&gt;this&lt;/span&gt;[&lt;span style="color: #cda869"&gt;int&lt;/span&gt; index]&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #cda869"&gt;get&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #cda869"&gt;return&lt;/span&gt; &lt;span style="color: #cda869"&gt;null&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #cda869"&gt;public&lt;/span&gt; &lt;span style="color: #7386a5"&gt;TestClass&lt;/span&gt; SomeComplexProperty { &lt;span style="color: #cda869"&gt;get&lt;/span&gt;; &lt;span style="color: #cda869"&gt;set&lt;/span&gt;; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #cda869"&gt;public&lt;/span&gt; &lt;span style="color: #cda869"&gt;void&lt;/span&gt; SomeParameterlessMethod()&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #cda869"&gt;public&lt;/span&gt; &lt;span style="color: #cda869"&gt;void&lt;/span&gt; SomeMethod(&lt;span style="color: #cda869"&gt;object&lt;/span&gt; x)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #cda869"&gt;public&lt;/span&gt; &lt;span style="color: #7386a5"&gt;TestClass&lt;/span&gt; SomeParameterlessMethodWithReturnValue()&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #cda869"&gt;return&lt;/span&gt; &lt;span style="color: #cda869"&gt;null&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #cda869"&gt;public&lt;/span&gt; &lt;span style="color: #7386a5"&gt;TestClass&lt;/span&gt; SomeMethodWithReturnValue(&lt;span style="color: #cda869"&gt;object&lt;/span&gt; x)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #cda869"&gt;return&lt;/span&gt; &lt;span style="color: #cda869"&gt;null&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;And here are a some test that I throw at it:&lt;/p&gt;  &lt;div style="font-family: lucida console; background: #141414; color: #bebec8; font-size: 10pt"&gt;   &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [&lt;span style="color: #7386a5"&gt;Fact&lt;/span&gt;()]&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #cda869"&gt;public&lt;/span&gt; &lt;span style="color: #cda869"&gt;void&lt;/span&gt; TestStringProperty()&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #cda869"&gt;string&lt;/span&gt; expected &lt;span style="color: #cda869"&gt;=&lt;/span&gt; &lt;span style="color: #8f9d6a"&gt;&amp;quot;SomeStringProperty&amp;quot;&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #cda869"&gt;string&lt;/span&gt; propertyName &lt;span style="color: #cda869"&gt;=&lt;/span&gt; &lt;span style="color: #7386a5"&gt;ReflectionHelper&lt;/span&gt;&lt;span style="color: #cda869"&gt;.&lt;/span&gt;GetProperty&lt;span style="color: #cda869"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #7386a5"&gt;TestClass&lt;/span&gt;&lt;span style="color: #cda869"&gt;&amp;gt;&lt;/span&gt;(x &lt;span style="color: #cda869"&gt;=&amp;gt;&lt;/span&gt; x&lt;span style="color: #cda869"&gt;.&lt;/span&gt;SomeStringProperty)&lt;span style="color: #cda869"&gt;.&lt;/span&gt;Name;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #7386a5"&gt;Assert&lt;/span&gt;&lt;span style="color: #cda869"&gt;.&lt;/span&gt;Equal(expected, propertyName);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [&lt;span style="color: #7386a5"&gt;Fact&lt;/span&gt;()]&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #cda869"&gt;public&lt;/span&gt; &lt;span style="color: #cda869"&gt;void&lt;/span&gt; TestFunction()&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #cda869"&gt;string&lt;/span&gt; expected &lt;span style="color: #cda869"&gt;=&lt;/span&gt; &lt;span style="color: #8f9d6a"&gt;&amp;quot;SomeMethodWithReturnValue&amp;quot;&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #cda869"&gt;string&lt;/span&gt; methodName &lt;span style="color: #cda869"&gt;=&lt;/span&gt; &lt;span style="color: #7386a5"&gt;ReflectionHelper&lt;/span&gt;&lt;span style="color: #cda869"&gt;.&lt;/span&gt;GetMethod&lt;span style="color: #cda869"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #7386a5"&gt;TestClass&lt;/span&gt;&lt;span style="color: #cda869"&gt;&amp;gt;&lt;/span&gt;(x &lt;span style="color: #cda869"&gt;=&amp;gt;&lt;/span&gt; x&lt;span style="color: #cda869"&gt;.&lt;/span&gt;SomeMethodWithReturnValue(&lt;span style="color: #cda869"&gt;null&lt;/span&gt;))&lt;span style="color: #cda869"&gt;.&lt;/span&gt;Name;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #7386a5"&gt;Assert&lt;/span&gt;&lt;span style="color: #cda869"&gt;.&lt;/span&gt;Equal(expected, methodName);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt; &lt;/div&gt;  &lt;div style="font-family: lucida console; background: #141414; color: #bebec8; font-size: 10pt"&gt;   &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; [&lt;span style="color: #7386a5"&gt;Fact&lt;/span&gt;()]&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #cda869"&gt;public&lt;/span&gt; &lt;span style="color: #cda869"&gt;void&lt;/span&gt; TestMethod()&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #cda869"&gt;string&lt;/span&gt; expected &lt;span style="color: #cda869"&gt;=&lt;/span&gt; &lt;span style="color: #8f9d6a"&gt;&amp;quot;SomeMethod&amp;quot;&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #cda869"&gt;string&lt;/span&gt; methodName &lt;span style="color: #cda869"&gt;=&lt;/span&gt; &lt;span style="color: #7386a5"&gt;StaticReflector&lt;/span&gt;&lt;span style="color: #cda869"&gt;.&lt;/span&gt;GetMethod&lt;span style="color: #cda869"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #7386a5"&gt;TestClass&lt;/span&gt;, &lt;span style="color: #cda869"&gt;object&amp;gt;&lt;/span&gt;(x &lt;span style="color: #cda869"&gt;=&amp;gt;&lt;/span&gt; x&lt;span style="color: #cda869"&gt;.&lt;/span&gt;SomeMethod)&lt;span style="color: #cda869"&gt;.&lt;/span&gt;Name;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #7386a5"&gt;Assert&lt;/span&gt;&lt;span style="color: #cda869"&gt;.&lt;/span&gt;Equal(expected, methodName);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;As you can see, those test verify that the name of the expressions being evaluated are correct. Remember all of this is only to obtain information about the expression being inspected.&lt;/p&gt;  &lt;p&gt;Now, continuing with the scenario that we talk about earlier, here is how this sample look like using Static Reflection:&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;div style="font-family: lucida console; background: #141414; color: #bebec8; font-size: 10pt"&gt;   &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #cda869"&gt;private&lt;/span&gt; &lt;span style="color: #cda869"&gt;void&lt;/span&gt; Form1_Load(&lt;span style="color: #cda869"&gt;object&lt;/span&gt; sender, &lt;span style="color: #7386a5"&gt;EventArgs&lt;/span&gt; e)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; cboPersons&lt;span style="color: #cda869"&gt;.&lt;/span&gt;ValueMember &lt;span style="color: #cda869"&gt;=&lt;/span&gt; &lt;span style="color: #7386a5"&gt;ReflectionHelper&lt;/span&gt;&lt;span style="color: #cda869"&gt;.&lt;/span&gt;GetProperty&lt;span style="color: #cda869"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #7386a5"&gt;PRSN&lt;/span&gt;&lt;span style="color: #cda869"&gt;&amp;gt;&lt;/span&gt;(x &lt;span style="color: #cda869"&gt;=&amp;gt;&lt;/span&gt; x&lt;span style="color: #cda869"&gt;.&lt;/span&gt;PRSNID)&lt;span style="color: #cda869"&gt;.&lt;/span&gt;Name;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; cboPersons&lt;span style="color: #cda869"&gt;.&lt;/span&gt;DisplayMember &lt;span style="color: #cda869"&gt;=&lt;/span&gt; &lt;span style="color: #7386a5"&gt;ReflectionHelper&lt;/span&gt;&lt;span style="color: #cda869"&gt;.&lt;/span&gt;GetProperty&lt;span style="color: #cda869"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #7386a5"&gt;PRSN&lt;/span&gt;&lt;span style="color: #cda869"&gt;&amp;gt;&lt;/span&gt;(x &lt;span style="color: #cda869"&gt;=&amp;gt;&lt;/span&gt; x&lt;span style="color: #cda869"&gt;.&lt;/span&gt;PRSNNM)&lt;span style="color: #cda869"&gt;.&lt;/span&gt;Name;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; cboPersons&lt;span style="color: #cda869"&gt;.&lt;/span&gt;DataSource &lt;span style="color: #cda869"&gt;=&lt;/span&gt; dropdownDataSource;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;Isn’t this something more refactor friendly?, I mean, now you just should go and rename the class and its properties correctly and with the help of Visual Studio every occurrence of the affected properties is going to be changed automatically.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_-4wV51cifeA/SgRSxbR67nI/AAAAAAAAAEo/XVF98ooOuVg/s1600-h/Refactor_Rename_Property%5B3%5D.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="Refactor_Rename_Property" border="0" alt="Refactor_Rename_Property" src="http://lh6.ggpht.com/_-4wV51cifeA/SgRSy-e-ZaI/AAAAAAAAAEs/dcClBly5njU/Refactor_Rename_Property_thumb%5B1%5D.jpg?imgmax=800" width="616" height="125" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;If we accept this action, our code it will be updated automatically and the application will continue working as usual:&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;div style="font-family: lucida console; background: #141414; color: #bebec8; font-size: 10pt"&gt;   &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #cda869"&gt;private&lt;/span&gt; &lt;span style="color: #cda869"&gt;void&lt;/span&gt; Form1_Load(&lt;span style="color: #cda869"&gt;object&lt;/span&gt; sender, &lt;span style="color: #7386a5"&gt;EventArgs&lt;/span&gt; e)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; cboPersons&lt;span style="color: #cda869"&gt;.&lt;/span&gt;ValueMember &lt;span style="color: #cda869"&gt;=&lt;/span&gt; &lt;span style="color: #7386a5"&gt;ReflectionHelper&lt;/span&gt;&lt;span style="color: #cda869"&gt;.&lt;/span&gt;GetProperty&lt;span style="color: #cda869"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #7386a5"&gt;PRSN&lt;/span&gt;&lt;span style="color: #cda869"&gt;&amp;gt;&lt;/span&gt;(x &lt;span style="color: #cda869"&gt;=&amp;gt;&lt;/span&gt; x&lt;span style="color: #cda869"&gt;.&lt;/span&gt;PersonID)&lt;span style="color: #cda869"&gt;.&lt;/span&gt;Name;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; cboPersons&lt;span style="color: #cda869"&gt;.&lt;/span&gt;DisplayMember &lt;span style="color: #cda869"&gt;=&lt;/span&gt; &lt;span style="color: #7386a5"&gt;ReflectionHelper&lt;/span&gt;&lt;span style="color: #cda869"&gt;.&lt;/span&gt;GetProperty&lt;span style="color: #cda869"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #7386a5"&gt;PRSN&lt;/span&gt;&lt;span style="color: #cda869"&gt;&amp;gt;&lt;/span&gt;(x &lt;span style="color: #cda869"&gt;=&amp;gt;&lt;/span&gt; x&lt;span style="color: #cda869"&gt;.&lt;/span&gt;PRSNNM)&lt;span style="color: #cda869"&gt;.&lt;/span&gt;Name;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; cboPersons&lt;span style="color: #cda869"&gt;.&lt;/span&gt;DataSource &lt;span style="color: #cda869"&gt;=&lt;/span&gt; dropdownDataSource;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Now you could continue refactoring the class name to Person and the other property to PersonName.&lt;/p&gt;  &lt;p&gt;You can download the sample code to play around from &lt;a href="http://emiajnetsamples.googlecode.com/files/EmiajNet.StaticReflection.zip" target="_blank"&gt;here&lt;/a&gt;. There is a serie of unit tests so you could check in more deep how this works, to run them all from inside Visual Studio you will need to have installed TestDriven .Net and configure XUnit as you test suite.&lt;/p&gt;  &lt;p&gt;Hope you liked the article.&lt;/p&gt;  &lt;p&gt;Bye bye.&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:d3324f1d-478a-4c26-961a-9b2b24da5a04" class="wlWriterEditableSmartContent"&gt;Etiquetas de Technorati: &lt;a href="http://technorati.com/tags/C%23" rel="tag"&gt;C#&lt;/a&gt;,&lt;a href="http://technorati.com/tags/.Net" rel="tag"&gt;.Net&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Refactoring" rel="tag"&gt;Refactoring&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12895914-4855039394517769435?l=emiajnet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://emiajnet.blogspot.com/feeds/4855039394517769435/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12895914&amp;postID=4855039394517769435' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12895914/posts/default/4855039394517769435'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12895914/posts/default/4855039394517769435'/><link rel='alternate' type='text/html' href='http://emiajnet.blogspot.com/2009/05/getting-fun-with-net-static-reflection.html' title='Getting Fun with .Net Static Reflection'/><author><name>jaime</name><uri>http://www.blogger.com/profile/05400435935764737984</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_-4wV51cifeA/SgRSuze8VoI/AAAAAAAAAEc/NX-ZNlyzupQ/s72-c/StaticReflection-Solution_thumb.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12895914.post-9054566966518082057</id><published>2009-04-17T20:42:00.003-05:00</published><updated>2009-04-20T09:54:30.792-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='NHibernate'/><category scheme='http://www.blogger.com/atom/ns#' term='Fluent NHibernate'/><category scheme='http://www.blogger.com/atom/ns#' term='codeproject'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='.Net'/><category scheme='http://www.blogger.com/atom/ns#' term='LINQ to NHibernate'/><title type='text'>Fluent NHibernate and Linq to NHibernate  Demo Project</title><content type='html'>&lt;h3&gt;Introduction&lt;/h3&gt;  &lt;p&gt;This is my so long waited demo project showcasing the use of Fluent NHibernate and Linq to NHibernate (and some other interesting bits).&lt;/p&gt;  &lt;p&gt;First of all, I you are completely new to NHibernate I encourage you to take a look at my previous introductory article &lt;a href="http://emiajnet.blogspot.com/2009/02/fluent-nhibernate-and-linq2nhibernate.html" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;h3&gt;Disclaimer&lt;/h3&gt;  &lt;p&gt;Before commencing, I want to make a disclaimer about this project, as you may expect, this is just demo code, not intended to be take too serious, please use it just a *soft* guide of how very basic things can be done using NHibernate. However, I’ve tried to make my best implementing the code for this article, with time limitations and all the related issues that an active developer have.&lt;/p&gt;  &lt;h3&gt;Prerequisites &lt;/h3&gt;  &lt;p&gt;.Net Framework 3.5 SP1&lt;/p&gt;  &lt;p&gt;Visual Studio 2008&lt;/p&gt;  &lt;p&gt;To run the test from inside Visual Studio : TestDriven.Net&lt;/p&gt;  &lt;p&gt;MSSQL Server 2005 with the AdventureWorks database installed.&lt;/p&gt;  &lt;p&gt;All other dependencies (assemblies) are included within the solution.&lt;/p&gt;  &lt;h3&gt;Lets go&lt;/h3&gt;  &lt;p&gt;What is this about? Take a look at the solution structure:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_-4wV51cifeA/SekwFuc63ZI/AAAAAAAAADw/fstxHHnIndg/s1600-h/Solution-1%5B6%5D.jpg" target="_blank"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="Solution-1" border="0" alt="Solution-1" src="http://lh6.ggpht.com/_-4wV51cifeA/SekwGXtfCaI/AAAAAAAAAD0/W3u_HGoidog/Solution-1_thumb%5B4%5D.jpg?imgmax=800" width="308" height="427" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt; &lt;br /&gt;I’m going to explain what’s the purpose of each of those projects:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;NHibernateSample.Model:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;This is the simplest one, here I’ve created the classes that are going to be mapped against our database, those are just &lt;a href="http://en.wikipedia.org/wiki/POCO" target="_blank"&gt;POCO&lt;/a&gt; classes that represent a view of the real database. Take a look at this image:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_-4wV51cifeA/SekwHHCX1KI/AAAAAAAAAEA/gvbfIvGnr8c/s1600-h/ModelDiagram%5B9%5D.png" target="_blank"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="ModelDiagram" border="0" alt="ModelDiagram" src="http://lh3.ggpht.com/_-4wV51cifeA/SekwINHVSbI/AAAAAAAAAEI/HjeRMkfqSxM/ModelDiagram_thumb%5B5%5D.png?imgmax=800" width="689" height="521" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Each class must overrides its GetHashCode method (which should be implement in a way that that returns &lt;em&gt;unique results&lt;/em&gt; for each &lt;em&gt;unique entity&lt;/em&gt;)  and its Equals method in order to allow to NHibernate to handle the loading and session caching process of entities. Those methods look similar in almost all the cases, except when we are handling entities that have composite ids.   &lt;br /&gt;Lets take a look at how this is being done in the AddressType class that has its AddressTypeID property as primary key:&lt;/p&gt;  &lt;div    style=" background: #141414;  font-family:lucida console;font-size:10pt;color:#bebec8;"&gt;   &lt;p style="margin: 0px"&gt;        &lt;span style="color:#cda869;"&gt;public&lt;/span&gt; &lt;span style="color:#cda869;"&gt;override&lt;/span&gt; &lt;span style="color:#cda869;"&gt;int&lt;/span&gt; GetHashCode()&lt;/p&gt;    &lt;p style="margin: 0px"&gt;        {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;            &lt;span style="color:#cda869;"&gt;return&lt;/span&gt; &lt;span style="color:#7386a5;"&gt;HashCodeGenerator&lt;/span&gt;&lt;span style="color:#cda869;"&gt;.&lt;/span&gt;GenerateHashCode(AddressTypeID);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;        }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;        &lt;span style="color:#cda869;"&gt;public&lt;/span&gt; &lt;span style="color:#cda869;"&gt;override&lt;/span&gt; &lt;span style="color:#cda869;"&gt;bool&lt;/span&gt; Equals(&lt;span style="color:#cda869;"&gt;object&lt;/span&gt; obj)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;        {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;            &lt;span style="color:#cda869;"&gt;return&lt;/span&gt; &lt;span style="color:#cda869;"&gt;this.&lt;/span&gt;IsEqual(obj);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;        }&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;The GenerateHashCode method from the HashCodeGenerator class (NHibernateSample.Model/Helper/HashCodeGenerator.cs) and it looks like:&lt;/p&gt;  &lt;div    style=" background: #141414;  font-family:lucida console;font-size:10pt;color:#bebec8;"&gt;   &lt;p style="margin: 0px"&gt;    &lt;span style="color:#cda869;"&gt;public&lt;/span&gt; &lt;span style="color:#cda869;"&gt;static&lt;/span&gt; &lt;span style="color:#cda869;"&gt;class&lt;/span&gt; &lt;span style="color:#7386a5;"&gt;HashCodeGenerator&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;    {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;        &lt;span style="color:#cda869;"&gt;public&lt;/span&gt; &lt;span style="color:#cda869;"&gt;static&lt;/span&gt; &lt;span style="color:#cda869;"&gt;int&lt;/span&gt; GenerateHashCode(&lt;span style="color:#cda869;"&gt;params&lt;/span&gt; &lt;span style="color:#cda869;"&gt;object&lt;/span&gt;[] keys)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;        {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;            &lt;span style="color:#cda869;"&gt;int&lt;/span&gt; hash &lt;span style="color:#cda869;"&gt;=&lt;/span&gt; &lt;span style="color:#9b7032;"&gt;17&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt; &lt;/p&gt;    &lt;p style="margin: 0px"&gt;            &lt;span style="color:#cda869;"&gt;foreach&lt;/span&gt; (&lt;span style="color:#cda869;"&gt;var&lt;/span&gt; item &lt;span style="color:#cda869;"&gt;in&lt;/span&gt; keys)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;            {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;                &lt;span style="color:#cda869;"&gt;int&lt;/span&gt; itemHashCode;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;                &lt;span style="color:#cda869;"&gt;if&lt;/span&gt; (item &lt;span style="color:#cda869;"&gt;==&lt;/span&gt; &lt;span style="color:#cda869;"&gt;null&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;                {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;                    itemHashCode &lt;span style="color:#cda869;"&gt;=&lt;/span&gt; &lt;span style="color:#9b7032;"&gt;1&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;                }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;                &lt;span style="color:#cda869;"&gt;else&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;                {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;                    itemHashCode &lt;span style="color:#cda869;"&gt;=&lt;/span&gt; item&lt;span style="color:#cda869;"&gt;.&lt;/span&gt;GetHashCode();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;                }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;                hash &lt;span style="color:#cda869;"&gt;=&lt;/span&gt; hash &lt;span style="color:#cda869;"&gt;*&lt;/span&gt; &lt;span style="color:#9b7032;"&gt;23&lt;/span&gt; &lt;span style="color:#cda869;"&gt;+&lt;/span&gt; itemHashCode;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;            }&lt;/p&gt;    &lt;p style="margin: 0px"&gt; &lt;/p&gt;    &lt;p style="margin: 0px"&gt;            &lt;span style="color:#cda869;"&gt;return&lt;/span&gt; hash;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;        }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;    }&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;As you can see, nothing glamorous, I’m just assuring that the result of the method is unique. &lt;/p&gt;  &lt;p&gt;The override of the Equals method is using the IsEqual extension method from the EqualityHelper class (NHibernateSample.Model/Helper/EqualityHelper.cs) and it looks like:&lt;/p&gt;  &lt;div    style=" background: #141414;  font-family:lucida console;font-size:10pt;color:#bebec8;"&gt;   &lt;p style="margin: 0px"&gt;    &lt;span style="color:#cda869;"&gt;public&lt;/span&gt; &lt;span style="color:#cda869;"&gt;static&lt;/span&gt; &lt;span style="color:#cda869;"&gt;class&lt;/span&gt; &lt;span style="color:#7386a5;"&gt;EqualityHelper&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;    {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;        &lt;span style="color:#cda869;"&gt;public&lt;/span&gt; &lt;span style="color:#cda869;"&gt;static&lt;/span&gt; &lt;span style="color:#cda869;"&gt;bool&lt;/span&gt; IsEqual&lt;span style="color:#cda869;"&gt;&amp;lt;&lt;/span&gt;T&lt;span style="color:#cda869;"&gt;&amp;gt;&lt;/span&gt;(&lt;span style="color:#cda869;"&gt;this&lt;/span&gt; T source, &lt;span style="color:#cda869;"&gt;object&lt;/span&gt; obj) &lt;span style="color:#cda869;"&gt;where&lt;/span&gt; T : &lt;span style="color:#cda869;"&gt;class&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;        {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;            &lt;span style="color:#cda869;"&gt;var&lt;/span&gt; target &lt;span style="color:#cda869;"&gt;=&lt;/span&gt; obj &lt;span style="color:#cda869;"&gt;as&lt;/span&gt; T;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;            &lt;span style="color:#cda869;"&gt;if&lt;/span&gt; (obj &lt;span style="color:#cda869;"&gt;==&lt;/span&gt; &lt;span style="color:#cda869;"&gt;null&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;            {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;                &lt;span style="color:#cda869;"&gt;return&lt;/span&gt; &lt;span style="color:#cda869;"&gt;false&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;            }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;            &lt;span style="color:#cda869;"&gt;return&lt;/span&gt; target&lt;span style="color:#cda869;"&gt;.&lt;/span&gt;GetHashCode()&lt;span style="color:#cda869;"&gt;.&lt;/span&gt;Equals(source&lt;span style="color:#cda869;"&gt;.&lt;/span&gt;GetHashCode());&lt;/p&gt;    &lt;p style="margin: 0px"&gt;        }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;    }&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;As you can see, it only checks the equality of the method GetHashCode of the instances being passed to the method, simple enough.&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;NHibernateSample.ModelMapper:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;This is a very important project, here is where I’m using the Fluent NHibernate API to map our &lt;strong&gt;NHibernateSample.Model &lt;/strong&gt;assembly against our database.   &lt;br /&gt;One of the cool things that the Fluent API provides to us is the use of conventions (following the “convention over configuration” spirit) that helps us to save a lot of time in the mapping process, for example, you may have a guideline for your database with regards to naming the primary key column of a given table, something like &amp;lt;Table_Name&amp;gt;ID, so, for the Product table you have ProductID table.   &lt;br /&gt;Using plain NHibernate mapping files you would have to go into the tedious work of map each of one entity, throwing away your convention.   &lt;br /&gt;Hopefully we are using Fluent NHibernate and this is easy cake. &lt;/p&gt;  &lt;p&gt;This project has little classes that inherit from FluentNHibernate.Mapping.ClassMap which gives us all the facilities to configure our entities.  &lt;br /&gt;Lets take a look at our StateProvinceMapper class:&lt;/p&gt;  &lt;div    style=" background: #141414;  font-family:lucida console;font-size:10pt;color:#bebec8;"&gt;   &lt;p style="margin: 0px"&gt;    &lt;span style="color:#cda869;"&gt;public&lt;/span&gt; &lt;span style="color:#cda869;"&gt;class&lt;/span&gt; &lt;span style="color:#7386a5;"&gt;StateProvinceMapper&lt;/span&gt; : &lt;span style="color:#7386a5;"&gt;ClassMap&lt;/span&gt;&lt;span style="color:#cda869;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#7386a5;"&gt;StateProvince&lt;/span&gt;&lt;span style="color:#cda869;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;    {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;        &lt;span style="color:#cda869;"&gt;private&lt;/span&gt; &lt;span style="color:#cda869;"&gt;const&lt;/span&gt; &lt;span style="color:#cda869;"&gt;string&lt;/span&gt; schema &lt;span style="color:#cda869;"&gt;=&lt;/span&gt; &lt;span style="color:#8f9d6a;"&gt;"Person"&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;        &lt;span style="color:#cda869;"&gt;public&lt;/span&gt; StateProvinceMapper()&lt;/p&gt;    &lt;p style="margin: 0px"&gt;        {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;            SchemaIs(schema);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;            Id(x &lt;span style="color:#cda869;"&gt;=&amp;gt;&lt;/span&gt; x&lt;span style="color:#cda869;"&gt;.&lt;/span&gt;StateProvinceID);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;            Map(x &lt;span style="color:#cda869;"&gt;=&amp;gt;&lt;/span&gt; x&lt;span style="color:#cda869;"&gt;.&lt;/span&gt;Name)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;                &lt;span style="color:#cda869;"&gt;.&lt;/span&gt;WithLengthOf(&lt;span style="color:#9b7032;"&gt;50&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;                &lt;span style="color:#cda869;"&gt;.&lt;/span&gt;ReadOnly();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;            References(x &lt;span style="color:#cda869;"&gt;=&amp;gt;&lt;/span&gt; x&lt;span style="color:#cda869;"&gt;.&lt;/span&gt;TerritoryID)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;                &lt;span style="color:#cda869;"&gt;.&lt;/span&gt;LazyLoad()&lt;/p&gt;    &lt;p style="margin: 0px"&gt;                &lt;span style="color:#cda869;"&gt;.&lt;/span&gt;Not&lt;span style="color:#cda869;"&gt;.&lt;/span&gt;Nullable();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;        }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;    }&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;As you can see is pretty straightforward.  &lt;br /&gt;1) We set the schema of this entity, which is the “Person” schema in the AdventureWorks database.   &lt;br /&gt;2) We set the Id of this entity, which is the StateProvinceID property that maps directly to the same column in the database table.   &lt;br /&gt;3) We map our Name property against the Name column in the database table, also, we set some attributes as its MaxLenght and also we say that this is a readonly property.   &lt;br /&gt;4) We set a reference with another entity using our TerritoryID property (of StateProvince type, which also maps to its corresponding table), also we set the LazyLoad attribute that says to NHibernate to do not retrieve it from the database until an explicit request is performed (stateProvinceInstance.TerritoryID.Name would fire a database query) and lastly we mark this property as Not-Nullable so in Update and Insert operations an attempt to store an StateProvince entity with a null value for its TerritoryID property will throw an exception.   &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;The place in charge of build the mapping from our Model against the database is the ModelBuilder class (NHibernateSample.ModelMapper/ModelBuilder.cs), in there we are doing all the heavy work to create our mapping:&lt;/p&gt;  &lt;div    style=" background: #141414;  font-family:lucida console;font-size:10pt;color:#bebec8;"&gt;   &lt;p style="margin: 0px"&gt;        &lt;span style="color:#cda869;"&gt;private&lt;/span&gt; &lt;span style="color:#cda869;"&gt;static&lt;/span&gt; &lt;span style="color:#cda869;"&gt;void&lt;/span&gt; buildModel()&lt;/p&gt;    &lt;p style="margin: 0px"&gt;        {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;            &lt;span style="color:#5f5a60;"&gt;// initialize persistance configurer&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;            &lt;span style="color:#d0da90;"&gt;IPersistenceConfigurer&lt;/span&gt; persistenceConfigurer &lt;span style="color:#cda869;"&gt;=&lt;/span&gt; getPersistenceConfigurer();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;            &lt;span style="color:#5f5a60;"&gt;// initialize nhibernate with persistance configurer properties&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;            cfg &lt;span style="color:#cda869;"&gt;=&lt;/span&gt; persistenceConfigurer&lt;span style="color:#cda869;"&gt;.&lt;/span&gt;ConfigureProperties(&lt;span style="color:#cda869;"&gt;new&lt;/span&gt; &lt;span style="color:#7386a5;"&gt;Configuration&lt;/span&gt;());&lt;/p&gt;    &lt;p style="margin: 0px"&gt;            &lt;span style="color:#5f5a60;"&gt;// add mappings definition to nhibernate configuration&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;            &lt;span style="color:#cda869;"&gt;var&lt;/span&gt; persistenceModel &lt;span style="color:#cda869;"&gt;=&lt;/span&gt; &lt;span style="color:#cda869;"&gt;new&lt;/span&gt; &lt;span style="color:#7386a5;"&gt;PersistenceModel&lt;/span&gt;();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;            persistenceModel&lt;span style="color:#cda869;"&gt;.&lt;/span&gt;addMappingsFromAssembly(&lt;span style="color:#cda869;"&gt;typeof&lt;/span&gt;(&lt;span style="color:#7386a5;"&gt;ModelBuilder&lt;/span&gt;)&lt;span style="color:#cda869;"&gt;.&lt;/span&gt;Assembly);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;            persistenceModel&lt;span style="color:#cda869;"&gt;.&lt;/span&gt;Conventions&lt;span style="color:#cda869;"&gt;.&lt;/span&gt;GetPrimaryKeyName &lt;span style="color:#cda869;"&gt;=&lt;/span&gt; x &lt;span style="color:#cda869;"&gt;=&amp;gt;&lt;/span&gt; x&lt;span style="color:#cda869;"&gt;.&lt;/span&gt;Name;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;            persistenceModel&lt;span style="color:#cda869;"&gt;.&lt;/span&gt;Conventions&lt;span style="color:#cda869;"&gt;.&lt;/span&gt;GetForeignKeyName &lt;span style="color:#cda869;"&gt;=&lt;/span&gt; x &lt;span style="color:#cda869;"&gt;=&amp;gt;&lt;/span&gt; x&lt;span style="color:#cda869;"&gt;.&lt;/span&gt;Name;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;            persistenceModel&lt;span style="color:#cda869;"&gt;.&lt;/span&gt;Configure(cfg);&lt;/p&gt;    &lt;p style="margin: 0px"&gt; &lt;/p&gt;    &lt;p style="margin: 0px"&gt;            &lt;span style="color:#5f5a60;"&gt;//Mix mode, this line allows us to append config settings to our configuration&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;            &lt;span style="color:#5f5a60;"&gt;//instance from .config files (web.config,app.config)&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;            &lt;span style="color:#5f5a60;"&gt;// or any other "traditional" (xml based) approach.&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;            &lt;span style="color:#5f5a60;"&gt;//NOTE: If you are going to go with full Fluent configuration, you should remove the line below&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;            cfg&lt;span style="color:#cda869;"&gt;.&lt;/span&gt;Configure();&lt;/p&gt;    &lt;p style="margin: 0px"&gt; &lt;/p&gt;    &lt;p style="margin: 0px"&gt;        }&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;Look how we are saying that the GetPrimaryKeyName should be inferred directly from the property name and the same for the GetForeignName method, so, if we have a class Product, and we say that its ID is ProductID, its primary key should be mapped to the column ProductID as well, and the same for its references.&lt;/p&gt;  &lt;p&gt;You can look deeper into the project to get a more detailed view of what is going on there.&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;NHibernateSample.LINQModel:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;In this project we are using the NHibernate.Linq assembly to create a NHibernateContext which has implemented a LINQ provider (not as good as LINQ to SQL) that allow us to create queries in a LINQ to SQL fashion.  &lt;br /&gt;The main class there is the ModelContext class, which takes our entities and expose them as IOrderedQueryable implementations.   &lt;br /&gt;Is very simple, here is how it looks:   &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;  &lt;div    style=" background: #141414;  font-family:lucida console;font-size:10pt;color:#bebec8;"&gt;   &lt;p style="margin: 0px"&gt;&lt;span style="color:#cda869;"&gt;public&lt;/span&gt; &lt;span style="color:#cda869;"&gt;class&lt;/span&gt; &lt;span style="color:#7386a5;"&gt;ModelContext&lt;/span&gt; : &lt;span style="color:#7386a5;"&gt;NHibernateContext&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;    {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;        &lt;span style="color:#cda869;"&gt;public&lt;/span&gt; ModelContext(&lt;span style="color:#d0da90;"&gt;ISession&lt;/span&gt; session)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;            : &lt;span style="color:#cda869;"&gt;base&lt;/span&gt;(session)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;        {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;        }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;        &lt;span style="color:#cda869;"&gt;public&lt;/span&gt; &lt;span style="color:#d0da90;"&gt;IOrderedQueryable&lt;/span&gt;&lt;span style="color:#cda869;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#7386a5;"&gt;Customer&lt;/span&gt;&lt;span style="color:#cda869;"&gt;&amp;gt;&lt;/span&gt; Customers&lt;/p&gt;    &lt;p style="margin: 0px"&gt;        {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;            &lt;span style="color:#cda869;"&gt;get&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;            {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;                &lt;span style="color:#cda869;"&gt;return&lt;/span&gt; Session&lt;span style="color:#cda869;"&gt;.&lt;/span&gt;Linq&lt;span style="color:#cda869;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#7386a5;"&gt;Customer&lt;/span&gt;&lt;span style="color:#cda869;"&gt;&amp;gt;&lt;/span&gt;();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;            }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;        }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;        &lt;span style="color:#cda869;"&gt;public&lt;/span&gt; &lt;span style="color:#d0da90;"&gt;IOrderedQueryable&lt;/span&gt;&lt;span style="color:#cda869;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#7386a5;"&gt;Address&lt;/span&gt;&lt;span style="color:#cda869;"&gt;&amp;gt;&lt;/span&gt; Addresses&lt;/p&gt;    &lt;p style="margin: 0px"&gt;        {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;            &lt;span style="color:#cda869;"&gt;get&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;            {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;                &lt;span style="color:#cda869;"&gt;return&lt;/span&gt; Session&lt;span style="color:#cda869;"&gt;.&lt;/span&gt;Linq&lt;span style="color:#cda869;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#7386a5;"&gt;Address&lt;/span&gt;&lt;span style="color:#cda869;"&gt;&amp;gt;&lt;/span&gt;();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;            }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;        }&lt;/p&gt;    &lt;p style="margin: 0px"&gt; &lt;/p&gt;    &lt;p style="margin: 0px"&gt;        &lt;span style="color:#cda869;"&gt;public&lt;/span&gt; &lt;span style="color:#d0da90;"&gt;IOrderedQueryable&lt;/span&gt;&lt;span style="color:#cda869;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#7386a5;"&gt;AddressType&lt;/span&gt;&lt;span style="color:#cda869;"&gt;&amp;gt;&lt;/span&gt; AddressTypes&lt;/p&gt;    &lt;p style="margin: 0px"&gt;        {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;            &lt;span style="color:#cda869;"&gt;get&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;            {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;                &lt;span style="color:#cda869;"&gt;return&lt;/span&gt; Session&lt;span style="color:#cda869;"&gt;.&lt;/span&gt;Linq&lt;span style="color:#cda869;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#7386a5;"&gt;AddressType&lt;/span&gt;&lt;span style="color:#cda869;"&gt;&amp;gt;&lt;/span&gt;();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;            }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;        }&lt;/p&gt;    &lt;p style="margin: 0px"&gt; &lt;/p&gt;    &lt;p style="margin: 0px"&gt;        &lt;span style="color:#cda869;"&gt;public&lt;/span&gt; &lt;span style="color:#d0da90;"&gt;IOrderedQueryable&lt;/span&gt;&lt;span style="color:#cda869;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#7386a5;"&gt;CustomerAddress&lt;/span&gt;&lt;span style="color:#cda869;"&gt;&amp;gt;&lt;/span&gt; CustomerAddresses&lt;/p&gt;    &lt;p style="margin: 0px"&gt;        {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;            &lt;span style="color:#cda869;"&gt;get&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;            {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;                &lt;span style="color:#cda869;"&gt;return&lt;/span&gt; Session&lt;span style="color:#cda869;"&gt;.&lt;/span&gt;Linq&lt;span style="color:#cda869;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#7386a5;"&gt;CustomerAddress&lt;/span&gt;&lt;span style="color:#cda869;"&gt;&amp;gt;&lt;/span&gt;();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;            }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;        }&lt;/p&gt;    &lt;p style="margin: 0px"&gt; &lt;/p&gt;    &lt;p style="margin: 0px"&gt;        &lt;span style="color:#cda869;"&gt;public&lt;/span&gt; &lt;span style="color:#d0da90;"&gt;IOrderedQueryable&lt;/span&gt;&lt;span style="color:#cda869;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#7386a5;"&gt;SalesTerritory&lt;/span&gt;&lt;span style="color:#cda869;"&gt;&amp;gt;&lt;/span&gt; SalesTerritories&lt;/p&gt;    &lt;p style="margin: 0px"&gt;        {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;            &lt;span style="color:#cda869;"&gt;get&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;            {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;                &lt;span style="color:#cda869;"&gt;return&lt;/span&gt; Session&lt;span style="color:#cda869;"&gt;.&lt;/span&gt;Linq&lt;span style="color:#cda869;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#7386a5;"&gt;SalesTerritory&lt;/span&gt;&lt;span style="color:#cda869;"&gt;&amp;gt;&lt;/span&gt;();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;            }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;        }&lt;/p&gt;    &lt;p style="margin: 0px"&gt; &lt;/p&gt;    &lt;p style="margin: 0px"&gt;        &lt;span style="color:#cda869;"&gt;public&lt;/span&gt; &lt;span style="color:#d0da90;"&gt;IOrderedQueryable&lt;/span&gt;&lt;span style="color:#cda869;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#7386a5;"&gt;StateProvince&lt;/span&gt;&lt;span style="color:#cda869;"&gt;&amp;gt;&lt;/span&gt; StateProvincies&lt;/p&gt;    &lt;p style="margin: 0px"&gt;        {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;            &lt;span style="color:#cda869;"&gt;get&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;            {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;                &lt;span style="color:#cda869;"&gt;return&lt;/span&gt; Session&lt;span style="color:#cda869;"&gt;.&lt;/span&gt;Linq&lt;span style="color:#cda869;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#7386a5;"&gt;StateProvince&lt;/span&gt;&lt;span style="color:#cda869;"&gt;&amp;gt;&lt;/span&gt;();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;            }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;        }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;    }&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;As you can see, it takes an ISession (which is our NHibernate instance to handle the database management) and for each entity I’ve created a wrapper that returns the IOrderedQueryable that are going to allow us to work with them easily.  &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;NHibernateSample.Tests:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;As its name says, there are just a bunch of tests ( I’m using XUnit as my unit test suite) that I’ve build to show how our ModelContext class can be used to perform simple operations as projections or to create aggregates. I reckon that the tests in there sucks, I’m on the process of learning how to write proper tests, so this is not a good example of how a set of  unit tests should be written.  &lt;br /&gt;Lets move on and take a look at the AddressTests class, there I’ve the following test: &lt;/p&gt;  &lt;div    style=" background: #141414;  font-family:lucida console;font-size:10pt;color:#bebec8;"&gt;   &lt;p style="margin: 0px"&gt;        [&lt;span style="color:#7386a5;"&gt;Fact&lt;/span&gt;]&lt;/p&gt;    &lt;p style="margin: 0px"&gt;        &lt;span style="color:#cda869;"&gt;public&lt;/span&gt; &lt;span style="color:#cda869;"&gt;override&lt;/span&gt; &lt;span style="color:#cda869;"&gt;void&lt;/span&gt; Test_Retrieve_Entity_With_EntityID_Equals_To_X_Should_Return_Null()&lt;/p&gt;    &lt;p style="margin: 0px"&gt;        {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;            &lt;span style="color:#cda869;"&gt;int&lt;/span&gt; addressID &lt;span style="color:#cda869;"&gt;=&lt;/span&gt; &lt;span style="color:#9b7032;"&gt;0&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;            &lt;span style="color:#cda869;"&gt;using&lt;/span&gt; (&lt;span style="color:#cda869;"&gt;var&lt;/span&gt; context &lt;span style="color:#cda869;"&gt;=&lt;/span&gt; &lt;span style="color:#cda869;"&gt;new&lt;/span&gt; &lt;span style="color:#7386a5;"&gt;ModelContext&lt;/span&gt;(Session))&lt;/p&gt;    &lt;p style="margin: 0px"&gt;            {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;                &lt;span style="color:#cda869;"&gt;var&lt;/span&gt; result &lt;span style="color:#cda869;"&gt;=&lt;/span&gt; (&lt;span style="color:#cda869;"&gt;from&lt;/span&gt; address &lt;span style="color:#cda869;"&gt;in&lt;/span&gt; context&lt;span style="color:#cda869;"&gt;.&lt;/span&gt;Addresses&lt;/p&gt;    &lt;p style="margin: 0px"&gt;                              &lt;span style="color:#cda869;"&gt;where&lt;/span&gt; address&lt;span style="color:#cda869;"&gt;.&lt;/span&gt;AddressID &lt;span style="color:#cda869;"&gt;==&lt;/span&gt; addressID&lt;/p&gt;    &lt;p style="margin: 0px"&gt;                              &lt;span style="color:#cda869;"&gt;select&lt;/span&gt; address)&lt;span style="color:#cda869;"&gt;.&lt;/span&gt;SingleOrDefault();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;                &lt;span style="color:#7386a5;"&gt;Assert&lt;/span&gt;&lt;span style="color:#cda869;"&gt;.&lt;/span&gt;Null(result);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;            }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;        }&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;As you can see, it’s very similar to what you can do using LINQ to SQL, but with NHibernate :)  &lt;br /&gt;This is another test from the same class:   &lt;br /&gt;&lt;/p&gt;  &lt;div    style=" background: #141414;  font-family:lucida console;font-size:10pt;color:#bebec8;"&gt;   &lt;p style="margin: 0px"&gt;        [&lt;span style="color:#7386a5;"&gt;Fact&lt;/span&gt;]&lt;/p&gt;    &lt;p style="margin: 0px"&gt;        &lt;span style="color:#cda869;"&gt;public&lt;/span&gt; &lt;span style="color:#cda869;"&gt;override&lt;/span&gt; &lt;span style="color:#cda869;"&gt;void&lt;/span&gt; Test_Sorting_Descending()&lt;/p&gt;    &lt;p style="margin: 0px"&gt;        {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;            &lt;span style="color:#cda869;"&gt;using&lt;/span&gt; (&lt;span style="color:#cda869;"&gt;var&lt;/span&gt; context &lt;span style="color:#cda869;"&gt;=&lt;/span&gt; &lt;span style="color:#cda869;"&gt;new&lt;/span&gt; &lt;span style="color:#7386a5;"&gt;ModelContext&lt;/span&gt;(Session))&lt;/p&gt;    &lt;p style="margin: 0px"&gt;            {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;                &lt;span style="color:#cda869;"&gt;var&lt;/span&gt; result &lt;span style="color:#cda869;"&gt;=&lt;/span&gt; (&lt;span style="color:#cda869;"&gt;from&lt;/span&gt; address &lt;span style="color:#cda869;"&gt;in&lt;/span&gt; context&lt;span style="color:#cda869;"&gt;.&lt;/span&gt;Addresses&lt;/p&gt;    &lt;p style="margin: 0px"&gt;                              &lt;span style="color:#cda869;"&gt;where&lt;/span&gt; address&lt;span style="color:#cda869;"&gt;.&lt;/span&gt;City &lt;span style="color:#cda869;"&gt;==&lt;/span&gt; &lt;span style="color:#8f9d6a;"&gt;"Bothell"&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;                              &lt;span style="color:#cda869;"&gt;orderby&lt;/span&gt; address&lt;span style="color:#cda869;"&gt;.&lt;/span&gt;AddressID &lt;span style="color:#cda869;"&gt;descending&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;                              &lt;span style="color:#cda869;"&gt;select&lt;/span&gt; address)&lt;span style="color:#cda869;"&gt;.&lt;/span&gt;ToList();&lt;/p&gt;    &lt;p style="margin: 0px"&gt; &lt;/p&gt;    &lt;p style="margin: 0px"&gt;                &lt;span style="color:#7386a5;"&gt;Assert&lt;/span&gt;&lt;span style="color:#cda869;"&gt;.&lt;/span&gt;False(result&lt;span style="color:#cda869;"&gt;.&lt;/span&gt;Last()&lt;span style="color:#cda869;"&gt;.&lt;/span&gt;AddressID &lt;span style="color:#cda869;"&gt;&amp;gt;&lt;/span&gt; result&lt;span style="color:#cda869;"&gt;.&lt;/span&gt;First()&lt;span style="color:#cda869;"&gt;.&lt;/span&gt;AddressID);&lt;/p&gt;    &lt;p style="margin: 0px"&gt; &lt;/p&gt;    &lt;p style="margin: 0px"&gt;                &lt;span style="color:#cda869;"&gt;foreach&lt;/span&gt; (&lt;span style="color:#cda869;"&gt;var&lt;/span&gt; item &lt;span style="color:#cda869;"&gt;in&lt;/span&gt; result)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;                {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;                    &lt;span style="color:#7386a5;"&gt;Console&lt;/span&gt;&lt;span style="color:#cda869;"&gt;.&lt;/span&gt;WriteLine(item&lt;span style="color:#cda869;"&gt;.&lt;/span&gt;AddressID);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;                }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;            }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;        }&lt;/p&gt; &lt;/div&gt;  &lt;p&gt; &lt;br /&gt;Very self-explanatory. You can check the other test to have some fun with the power (and several limitations) of the LINQ provider for NHibernate. &lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;NHibernateSample.BusinessLayer:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;This project is intended to be used for our web applications. I think that the interesting bits are related to the session management (NHibernateSample.BusinessLayer/SessionManagement/SessionManager.cs) and the use of StructureMap to configure our dependencies (NHibernateSample.BusinessLayer/Bootstrapper.cs, NHibernateSample.BusinessLayer/Repositories/ICustomerRepository.cs and NHibernateSample.BusinessLayer/Repositories/Implementations/CustomerRepository.cs).&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;NHibernateSample.CustomerWebSite:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;This project shows how you can use  NHibernate to perform a basic CRUD operation over our Customer entity, I’ll try to find the time to create a more complex example (I can’t assure this :D), but with that simple aspx page you should be able to go on your own and make a nicer web app.  &lt;br /&gt;Some interesting things are happen in the global.asax file, and also it will help in the process to integrate asp .net controls with NHibernate (GridView, ObjectDataSource).&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;Finally, please don’t forget to update your database connection in order to run the samples. The file that you need to update is located in the Solution Items folder in the solution tree, is named hibernate.cfg.xml, you should change the value for the property connection.connection_string with one that match your environment.&lt;/p&gt;  &lt;div    style=" background: #141414;  font-family:lucida console;font-size:10pt;color:#bebec8;"&gt;   &lt;p style="margin: 0px"&gt;&lt;span style="color:#d7d7d7;"&gt;    &amp;lt;&lt;/span&gt;&lt;span style="color:#cda869;"&gt;hibernate-configuration&lt;/span&gt;&lt;span style="color:#d7d7d7;"&gt; &lt;/span&gt;&lt;span style="color:#7386a5;"&gt;xmlns&lt;/span&gt;&lt;span style="color:#d7d7d7;"&gt;=&lt;/span&gt;&lt;span style="color:#8f9d6a;"&gt;"urn:nhibernate-configuration-2.2"&lt;/span&gt;&lt;span style="color:#d7d7d7;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color:#d7d7d7;"&gt;        &amp;lt;&lt;/span&gt;&lt;span style="color:#cda869;"&gt;session-factory&lt;/span&gt;&lt;span style="color:#d7d7d7;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color:#d7d7d7;"&gt;            &amp;lt;&lt;/span&gt;&lt;span style="color:#cda869;"&gt;property&lt;/span&gt;&lt;span style="color:#d7d7d7;"&gt; &lt;/span&gt;&lt;span style="color:#7386a5;"&gt;name&lt;/span&gt;&lt;span style="color:#d7d7d7;"&gt;=&lt;/span&gt;&lt;span style="color:#8f9d6a;"&gt;"current_session_context_class"&lt;/span&gt;&lt;span style="color:#d7d7d7;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color:#d7d7d7;"&gt;                managed_web&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color:#d7d7d7;"&gt;            &amp;lt;/&lt;/span&gt;&lt;span style="color:#cda869;"&gt;property&lt;/span&gt;&lt;span style="color:#d7d7d7;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color:#d7d7d7;"&gt;            &amp;lt;&lt;/span&gt;&lt;span style="color:#cda869;"&gt;property&lt;/span&gt;&lt;span style="color:#d7d7d7;"&gt; &lt;/span&gt;&lt;span style="color:#7386a5;"&gt;name&lt;/span&gt;&lt;span style="color:#d7d7d7;"&gt;=&lt;/span&gt;&lt;span style="color:#8f9d6a;"&gt;"connection.connection_string"&lt;/span&gt;&lt;span style="color:#d7d7d7;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color:#d7d7d7;"&gt;                Data Source=&lt;strong&gt;&lt;em&gt;&lt;u&gt;YOUR_DATABASE_SERVER_GOES_HERE&lt;/u&gt;&lt;/em&gt;&lt;/strong&gt;;Initial Catalog=AdventureWorks;Integrated Security=True&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color:#d7d7d7;"&gt;            &amp;lt;/&lt;/span&gt;&lt;span style="color:#cda869;"&gt;property&lt;/span&gt;&lt;span style="color:#d7d7d7;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color:#d7d7d7;"&gt;        &amp;lt;/&lt;/span&gt;&lt;span style="color:#cda869;"&gt;session-factory&lt;/span&gt;&lt;span style="color:#d7d7d7;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt; &lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color:#d7d7d7;"&gt;    &amp;lt;/&lt;/span&gt;&lt;span style="color:#cda869;"&gt;hibernate-configuration&lt;/span&gt;&lt;span style="color:#d7d7d7;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;Please, if you find a WTF in the source code, don’t hesitate to send your feedback, I’ll be very thankful.&lt;/p&gt;  &lt;p&gt;You can download the full demo &lt;a href="http://emiajnetsamples.googlecode.com/files/NHibernateSample.zip" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Bye bye.&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:08e903dc-8462-44af-be87-dd9b10226d64" class="wlWriterEditableSmartContent"&gt;Etiquetas de Technorati: &lt;a href="http://technorati.com/tags/NET" rel="tag"&gt;NET&lt;/a&gt;,&lt;a href="http://technorati.com/tags/C%23" rel="tag"&gt;C#&lt;/a&gt;,&lt;a href="http://technorati.com/tags/CODEPROJECT" rel="tag"&gt;CODEPROJECT&lt;/a&gt;,&lt;a href="http://technorati.com/tags/FLUENT+NHIBERNATE" rel="tag"&gt;FLUENT NHIBERNATE&lt;/a&gt;,&lt;a href="http://technorati.com/tags/LINQ+TO+NHIBERNATE" rel="tag"&gt;LINQ TO NHIBERNATE&lt;/a&gt;,&lt;a href="http://technorati.com/tags/NHIBERNATE" rel="tag"&gt;NHIBERNATE&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12895914-9054566966518082057?l=emiajnet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://emiajnet.blogspot.com/feeds/9054566966518082057/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12895914&amp;postID=9054566966518082057' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12895914/posts/default/9054566966518082057'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12895914/posts/default/9054566966518082057'/><link rel='alternate' type='text/html' href='http://emiajnet.blogspot.com/2009/04/fluent-nhibernate-and-linq2nhibernate.html' title='Fluent NHibernate and Linq to NHibernate  Demo Project'/><author><name>jaime</name><uri>http://www.blogger.com/profile/05400435935764737984</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_-4wV51cifeA/SekwGXtfCaI/AAAAAAAAAD0/W3u_HGoidog/s72-c/Solution-1_thumb%5B4%5D.jpg?imgmax=800' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12895914.post-5460751373156651719</id><published>2009-02-02T10:16:00.003-05:00</published><updated>2009-04-20T09:56:17.626-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='NHibernate'/><category scheme='http://www.blogger.com/atom/ns#' term='Fluent NHibernate'/><category scheme='http://www.blogger.com/atom/ns#' term='codeproject'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='.Net'/><category scheme='http://www.blogger.com/atom/ns#' term='LINQ to NHibernate'/><title type='text'>Fluent NHibernate and Linq to NHibernate</title><content type='html'>&lt;p&gt;Probably most of you are aware of &lt;a href="http://en.wikipedia.org/wiki/Language_Integrated_Query" target="_blank"&gt;LINQ&lt;/a&gt; and also have done some kind of work using &lt;a href="http://msdn.microsoft.com/en-us/library/bb425822.aspx" target="_blank"&gt;LINQ to SQL&lt;/a&gt; which is the &lt;a href="http://en.wikipedia.org/wiki/Object-relational_mapping" target="_blank"&gt;ORM&lt;/a&gt; product from Microsoft for its .Net platform (don't forget about &lt;a href="http://msdn.microsoft.com/en-us/library/bb386964.aspx" target="_blank"&gt;LINQ to Entities&lt;/a&gt;, which is the Enterprise version of LINQ to SQL).&lt;/p&gt;  &lt;p&gt;Well, let me tell you, if you don't already know, that exists an Open Source project which has some years out there, this project is &lt;a href="http://en.wikipedia.org/wiki/Object-relational_mapping" target="_blank"&gt;NHibernate&lt;/a&gt; which is a port from the java version &lt;a href="http://www.hibernate.org/" target="_blank"&gt;Hibernate&lt;/a&gt;, NHibernate is a powerful fully tested ORM tool that has proved over the years to be a great alternative to handle the data management in your applications. It has a learning curve that may scare you, but after a few days using it you'll never go back to the old ADO .Net API.&lt;/p&gt;  &lt;p&gt;For further reading, you can check &lt;a href="http://ayende.com/Blog/archive/2008/03/08/A-few-reasons-to-like-NHibernate.aspx" target="_blank"&gt;this&lt;/a&gt; post from &lt;a href="http://ayende.com/" target="_blank"&gt;Ayende&lt;/a&gt; which I'm sure is going to convince you to get involve and start using NHibernate in your applications.&lt;/p&gt;  &lt;p&gt;If you haven't used NHibernate before, well, I recommend you to stop to read right now and go and start playing with it, then you can go back here and continue reading :).&lt;/p&gt;  &lt;p&gt;&lt;em&gt;---A couple of days later---&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Hi again, how did you went with NHibernate? Is a great tool, isn't? &lt;/p&gt;  &lt;p&gt;Now I have a couple of questions for you:&lt;/p&gt;  &lt;p&gt;What are the most difficult parts in NHibernate?, if your answer is "Configuration, Mapping and Querying" then this post will help you to get ride of those problems.&lt;/p&gt;  &lt;p&gt;For the configuration and mapping problems, there is a project named &lt;a href="http://code.google.com/p/fluent-nhibernate/" target="_blank"&gt;Fluent NHibernate&lt;/a&gt;, which is an API based configuration and entities mapper tool which eliminate the need for all those XML files.&lt;/p&gt;  &lt;p&gt;For the querying problem, there is another project from the &lt;a href="http://sourceforge.net/projects/nhcontrib/" target="_blank"&gt;NHibernate Contrib Project&lt;/a&gt; named LINQ to NHibernate which can be downloaded from &lt;a href="http://sourceforge.net/project/showfiles.php?group_id=216446&amp;amp;package_id=306405" target="_blank"&gt;here&lt;/a&gt;, this allows you to start using NHibernate in the same fashion as with LINQ to SQL making a lot of easier and fun to work with it.&lt;/p&gt;  &lt;p&gt;For further reading of the Fluent NHibernate project you could check:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://nhforge.org/blogs/nhibernate/archive/2008/09/02/a-fluent-interface-to-nhibernate-part-1.aspx"&gt;http://nhforge.org/blogs/nhibernate/archive/2008/09/02/a-fluent-interface-to-nhibernate-part-1.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://nhforge.org/blogs/nhibernate/archive/2008/09/06/a-fluent-interface-to-nhibernate-part-2-value-objects.aspx"&gt;http://nhforge.org/blogs/nhibernate/archive/2008/09/06/a-fluent-interface-to-nhibernate-part-2-value-objects.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://nhforge.org/blogs/nhibernate/archive/2008/09/06/a-fluent-interface-to-nhibernate-part-3-mapping-relations.aspx"&gt;http://nhforge.org/blogs/nhibernate/archive/2008/09/06/a-fluent-interface-to-nhibernate-part-3-mapping-relations.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://nhforge.org/blogs/nhibernate/archive/2008/09/06/a-fluent-interface-to-nhibernate-part-4-configuration.aspx"&gt;http://nhforge.org/blogs/nhibernate/archive/2008/09/06/a-fluent-interface-to-nhibernate-part-4-configuration.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;For further reading of the LINQ to NHibernate project you could check:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.hibernatingrhinos.com/nhibernate/archive/2008/11/26/linq-to-nhibernate.aspx"&gt;http://blogs.hibernatingrhinos.com/nhibernate/archive/2008/11/26/linq-to-nhibernate.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;In my next article I'll show you an example of how you can combine both tools and get a nice app running.&lt;/p&gt;  &lt;p&gt;Bye bye.&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:32d41b9c-2ed5-4f8d-a46e-560181d6c05c" class="wlWriterEditableSmartContent"&gt;Etiquetas de Technorati: &lt;a href="http://technorati.com/tags/.Net" rel="tag"&gt;.Net&lt;/a&gt;,&lt;a href="http://technorati.com/tags/C%23" rel="tag"&gt;C#&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Fluent+NHibernate" rel="tag"&gt;Fluent NHibernate&lt;/a&gt;,&lt;a href="http://technorati.com/tags/LINQ+to+NHibernate" rel="tag"&gt;LINQ to NHibernate&lt;/a&gt;,&lt;a href="http://technorati.com/tags/NHibernate" rel="tag"&gt;NHibernate&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12895914-5460751373156651719?l=emiajnet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://emiajnet.blogspot.com/feeds/5460751373156651719/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12895914&amp;postID=5460751373156651719' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12895914/posts/default/5460751373156651719'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12895914/posts/default/5460751373156651719'/><link rel='alternate' type='text/html' href='http://emiajnet.blogspot.com/2009/02/fluent-nhibernate-and-linq2nhibernate.html' title='Fluent NHibernate and Linq to NHibernate'/><author><name>jaime</name><uri>http://www.blogger.com/profile/05400435935764737984</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12895914.post-5761824946207932224</id><published>2009-01-14T12:24:00.001-05:00</published><updated>2009-04-17T14:09:06.777-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Refactoring'/><category scheme='http://www.blogger.com/atom/ns#' term='codeproject'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='.Net'/><title type='text'>Refactoring "switch cases".</title><content type='html'>&lt;p&gt;Hello to everyone, I want to show you how to apply a simple refactoring trick to a common pattern, the &amp;quot;switch case&amp;quot; statement.&lt;/p&gt;  &lt;p&gt;Please take a look at the following program (a console app) :&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;div style="font-family: consolas; background: #282424; color: #f3f3f3; font-size: 10pt"&gt;   &lt;p style="margin: 0px"&gt;&lt;span style="color: #a2c4fd"&gt;class&lt;/span&gt; &lt;span style="color: #fdf8b9"&gt;Program&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #a2c4fd"&gt;private&lt;/span&gt; &lt;span style="color: #a2c4fd"&gt;static&lt;/span&gt; &lt;span style="color: #a2c4fd"&gt;string&lt;/span&gt; options = &lt;span style="color: #a2c4fd"&gt;null&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #a2c4fd"&gt;private&lt;/span&gt; &lt;span style="color: #a2c4fd"&gt;static&lt;/span&gt; &lt;span style="color: #a2c4fd"&gt;readonly&lt;/span&gt; &lt;span style="color: #fdf8b9"&gt;Type&lt;/span&gt; sportsEnumType = &lt;span style="color: #a2c4fd"&gt;typeof&lt;/span&gt;(&lt;span style="color: #fdf8b9"&gt;SportNews&lt;/span&gt;.&lt;span style="color: #2b91af"&gt;Sports&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #a2c4fd"&gt;static&lt;/span&gt; &lt;span style="color: #a2c4fd"&gt;void&lt;/span&gt; Main(&lt;span style="color: #a2c4fd"&gt;string&lt;/span&gt;[] args)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #fdf8b9"&gt;SportNews&lt;/span&gt; news = &lt;span style="color: #a2c4fd"&gt;new&lt;/span&gt; &lt;span style="color: #fdf8b9"&gt;SportNews&lt;/span&gt;();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #a2c4fd"&gt;while&lt;/span&gt; (&lt;span style="color: #a2c4fd"&gt;true&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #fdf8b9"&gt;Console&lt;/span&gt;.WriteLine();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; DisplayOptions();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #a2c4fd"&gt;string&lt;/span&gt; key = &lt;span style="color: #fdf8b9"&gt;Console&lt;/span&gt;.ReadKey().KeyChar.ToString();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #fdf8b9"&gt;Console&lt;/span&gt;.WriteLine();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #a2c4fd"&gt;try&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #fdf8b9"&gt;SportNews&lt;/span&gt;.&lt;span style="color: #2b91af"&gt;Sports&lt;/span&gt; sport = (&lt;span style="color: #fdf8b9"&gt;SportNews&lt;/span&gt;.&lt;span style="color: #2b91af"&gt;Sports&lt;/span&gt;)(&lt;span style="color: #fdf8b9"&gt;Enum&lt;/span&gt;.Parse(sportsEnumType, key));&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; news.DisplayNews(sport);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #a2c4fd"&gt;catch&lt;/span&gt;(&lt;span style="color: #fdf8b9"&gt;Exception&lt;/span&gt; ex)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #fdf8b9"&gt;Console&lt;/span&gt;.WriteLine(ex);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #fdf8b9"&gt;Console&lt;/span&gt;.ReadLine();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #a2c4fd"&gt;return&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #a2c4fd"&gt;private&lt;/span&gt; &lt;span style="color: #a2c4fd"&gt;static&lt;/span&gt; &lt;span style="color: #a2c4fd"&gt;void&lt;/span&gt; DisplayOptions()&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #a2c4fd"&gt;if&lt;/span&gt; (options == &lt;span style="color: #a2c4fd"&gt;null&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #fdf8b9"&gt;StringBuilder&lt;/span&gt; optionsBuilder = &lt;span style="color: #a2c4fd"&gt;new&lt;/span&gt; &lt;span style="color: #fdf8b9"&gt;StringBuilder&lt;/span&gt;();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #fdf8b9"&gt;FieldInfo&lt;/span&gt;[] enumFields = sportsEnumType.UnderlyingSystemType.GetFields(&lt;span style="color: #2b91af"&gt;BindingFlags&lt;/span&gt;.Public | &lt;span style="color: #2b91af"&gt;BindingFlags&lt;/span&gt;.Static);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #a2c4fd"&gt;foreach&lt;/span&gt; (&lt;span style="color: #fdf8b9"&gt;FieldInfo&lt;/span&gt; enumField &lt;span style="color: #a2c4fd"&gt;in&lt;/span&gt; enumFields)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #a2c4fd"&gt;object&lt;/span&gt; enumValue = enumField.GetRawConstantValue();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #fdf8b9"&gt;SportNews&lt;/span&gt;.&lt;span style="color: #2b91af"&gt;Sports&lt;/span&gt; sport = (&lt;span style="color: #fdf8b9"&gt;SportNews&lt;/span&gt;.&lt;span style="color: #2b91af"&gt;Sports&lt;/span&gt;)(enumValue);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; optionsBuilder.AppendFormat(&lt;span style="color: #6afd51"&gt;&amp;quot;To display the news for {0} press {1}\n&amp;quot;&lt;/span&gt;, sport, enumValue);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; options = optionsBuilder.ToString();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #fdf8b9"&gt;Console&lt;/span&gt;.WriteLine(options);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #a2c4fd"&gt;public&lt;/span&gt; &lt;span style="color: #a2c4fd"&gt;class&lt;/span&gt; &lt;span style="color: #fdf8b9"&gt;SportNews&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #a2c4fd"&gt;public&lt;/span&gt; &lt;span style="color: #a2c4fd"&gt;enum&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Sports&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Soccer = 0,&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; BasketBall = 1,&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Rugby = 2,&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; VolleyBall = 3&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #a2c4fd"&gt;public&lt;/span&gt; &lt;span style="color: #a2c4fd"&gt;void&lt;/span&gt; DisplayNews(&lt;span style="color: #2b91af"&gt;Sports&lt;/span&gt; sport)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #a2c4fd"&gt;switch&lt;/span&gt; (sport)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #a2c4fd"&gt;case&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Sports&lt;/span&gt;.Soccer:&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; DisplayNewsForSoccer();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #a2c4fd"&gt;break&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #a2c4fd"&gt;case&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Sports&lt;/span&gt;.BasketBall:&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; DisplayNewsForBasketBall();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #a2c4fd"&gt;break&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #a2c4fd"&gt;case&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Sports&lt;/span&gt;.Rugby:&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; DisplayNewsForRugby();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #a2c4fd"&gt;break&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #a2c4fd"&gt;case&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Sports&lt;/span&gt;.VolleyBall:&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; DisplayNewsForVolleyBall();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #a2c4fd"&gt;break&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #a2c4fd"&gt;default&lt;/span&gt;:&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #a2c4fd"&gt;throw&lt;/span&gt; &lt;span style="color: #a2c4fd"&gt;new&lt;/span&gt; &lt;span style="color: #fdf8b9"&gt;NotImplementedException&lt;/span&gt;(&lt;span style="color: #a2c4fd"&gt;string&lt;/span&gt;.Format(&lt;span style="color: #6afd51"&gt;&amp;quot;The method for the sport {0} is not implemented&amp;quot;&lt;/span&gt;, sport));&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #a2c4fd"&gt;private&lt;/span&gt; &lt;span style="color: #a2c4fd"&gt;void&lt;/span&gt; DisplayNewsForSoccer()&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #fdf8b9"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: #6afd51"&gt;&amp;quot;Displaying News for Soccer&amp;quot;&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #75ffa2"&gt;// Real implementation below&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #75ffa2"&gt;// Do something&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #a2c4fd"&gt;private&lt;/span&gt; &lt;span style="color: #a2c4fd"&gt;void&lt;/span&gt; DisplayNewsForBasketBall()&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #fdf8b9"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: #6afd51"&gt;&amp;quot;Displaying News for BasketBall&amp;quot;&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #75ffa2"&gt;// Real implementation below&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #75ffa2"&gt;// Do something&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #a2c4fd"&gt;private&lt;/span&gt; &lt;span style="color: #a2c4fd"&gt;void&lt;/span&gt; DisplayNewsForRugby()&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #fdf8b9"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: #6afd51"&gt;&amp;quot;Displaying News for Rugby&amp;quot;&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #75ffa2"&gt;// Real implementation below&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #75ffa2"&gt;// Do something&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #a2c4fd"&gt;private&lt;/span&gt; &lt;span style="color: #a2c4fd"&gt;void&lt;/span&gt; DisplayNewsForVolleyBall()&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #fdf8b9"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: #6afd51"&gt;&amp;quot;Displaying News for VolleyBall&amp;quot;&lt;/span&gt;);&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #75ffa2"&gt;// Real implementation below&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #75ffa2"&gt;// Do something&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;What this does?, well, simply ask to the user to press a given key to execute a determined action.&lt;/p&gt;  &lt;p&gt;The running program looks like this:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/_-4wV51cifeA/SejTzFgBQcI/AAAAAAAAADU/aqlMerCqUww/s1600-h/console_app_running%5B3%5D.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="console_app_running" border="0" alt="console_app_running" src="http://lh3.ggpht.com/_-4wV51cifeA/SejT0SdBOwI/AAAAAAAAADY/F1tUtAF8kJs/console_app_running_thumb%5B1%5D.jpg?imgmax=800" width="229" height="240" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Very simple isn't?&lt;/p&gt;  &lt;p&gt;This is fine for the number of alternatives that we are going to handle, but,what about if you add more items (+10) to the enum, you would need to add more cases to the switch statement, and so on. This is a very error prone process and also a maintenance nightmare.&lt;/p&gt;  &lt;p&gt;What to do then? Well, the solution is very simple, you would need to change the switch statement by a lookup table, a Dictionary object is a good candidate to do this.&lt;/p&gt;  &lt;p&gt;SHOW ME THE CODE!!. Here it is:&lt;/p&gt;  &lt;p&gt;First lets create our Dictionary instance in the SportNews class constructor :&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;div style="font-family: consolas; background: #282424; color: #f3f3f3; font-size: 10pt"&gt;   &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #a2c4fd"&gt;private&lt;/span&gt; &lt;span style="color: #fdf8b9"&gt;Dictionary&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;Sports&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;Action&lt;/span&gt;&amp;gt; lookupTable;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #a2c4fd"&gt;public&lt;/span&gt; SportNews()&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; lookupTable = &lt;span style="color: #a2c4fd"&gt;new&lt;/span&gt; &lt;span style="color: #fdf8b9"&gt;Dictionary&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;Sports&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;Action&lt;/span&gt;&amp;gt;()&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; { &lt;span style="color: #2b91af"&gt;Sports&lt;/span&gt;.Soccer, DisplayNewsForSoccer },&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; { &lt;span style="color: #2b91af"&gt;Sports&lt;/span&gt;.BasketBall, DisplayNewsForBasketBall },&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; { &lt;span style="color: #2b91af"&gt;Sports&lt;/span&gt;.Rugby, DisplayNewsForRugby },&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; { &lt;span style="color: #2b91af"&gt;Sports&lt;/span&gt;.VolleyBall, DisplayNewsForVolleyBall }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; };&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;Now lets change the DiplayNews method to get ride of the switch statement, it will end up as:&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;div style="font-family: consolas; background: #282424; color: #f3f3f3; font-size: 10pt"&gt;   &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #a2c4fd"&gt;public&lt;/span&gt; &lt;span style="color: #a2c4fd"&gt;void&lt;/span&gt; DisplayNews(&lt;span style="color: #2b91af"&gt;Sports&lt;/span&gt; sport)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #2b91af"&gt;Action&lt;/span&gt; displayMethod;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #a2c4fd"&gt;if&lt;/span&gt; (lookupTable.TryGetValue(sport, &lt;span style="color: #a2c4fd"&gt;out&lt;/span&gt; displayMethod))&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; displayMethod.Invoke();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #a2c4fd"&gt;else&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #a2c4fd"&gt;throw&lt;/span&gt; &lt;span style="color: #a2c4fd"&gt;new&lt;/span&gt; &lt;span style="color: #fdf8b9"&gt;NotImplementedException&lt;/span&gt;(&lt;span style="color: #a2c4fd"&gt;string&lt;/span&gt;.Format(&lt;span style="color: #6afd51"&gt;&amp;quot;The method for the sport {0} is not implemented&amp;quot;&lt;/span&gt;, sport));&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;Isn't this more simple and clean? &lt;/p&gt;  &lt;p&gt;Obviously, this code could be refactored even more, but for the purpose of the article I think is fine.&lt;/p&gt;  &lt;p&gt;The final working demo can be found &lt;a href="http://emiajnetsamples.googlecode.com/files/ASimpleRefactoringTrick.zip" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Bye bye.&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:31711f6f-5348-4f03-aea3-264a6adf1b75" class="wlWriterEditableSmartContent"&gt;Etiquetas de Technorati: &lt;a href="http://technorati.com/tags/.Net" rel="tag"&gt;.Net&lt;/a&gt;,&lt;a href="http://technorati.com/tags/C%23" rel="tag"&gt;C#&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Refactoring" rel="tag"&gt;Refactoring&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12895914-5761824946207932224?l=emiajnet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://emiajnet.blogspot.com/feeds/5761824946207932224/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12895914&amp;postID=5761824946207932224' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12895914/posts/default/5761824946207932224'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12895914/posts/default/5761824946207932224'/><link rel='alternate' type='text/html' href='http://emiajnet.blogspot.com/2009/01/refactoring-cases.html' title='Refactoring &amp;quot;switch cases&amp;quot;.'/><author><name>jaime</name><uri>http://www.blogger.com/profile/05400435935764737984</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_-4wV51cifeA/SejT0SdBOwI/AAAAAAAAADY/F1tUtAF8kJs/s72-c/console_app_running_thumb%5B1%5D.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12895914.post-1445409605702343681</id><published>2008-12-15T09:49:00.002-05:00</published><updated>2009-04-02T16:28:39.434-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Best Practices'/><category scheme='http://www.blogger.com/atom/ns#' term='Coding Standards'/><category scheme='http://www.blogger.com/atom/ns#' term='codeproject'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='.Net'/><title type='text'>What .Net coding standards do I use?</title><content type='html'>&lt;p&gt;Hi there, today I want to speak about something that had help me a lot in the companies that I'd worked.    &lt;br /&gt;Those are the coding standards that I follow in a daily basics, they allow me to integrate myself with other teams which, is some way or others, share some of the points that those standards have.     &lt;br /&gt;The document had been written by &lt;a href="http://www.idesign.net/" target="_blank"&gt;IDesign&lt;/a&gt; and I think is one of the greatest guidelines that is available online, also is being updated from time to time.&amp;#160; &lt;br /&gt;Please go ahead and take a look.     &lt;br /&gt;You can download it from &lt;a href="http://www.idesign.net/idesign/download/IDesign%20CSharp%20Coding%20Standard.zip" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:d4c8fb12-86b0-446a-9607-c282b2b370c7" class="wlWriterSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/.Net" rel="tag"&gt;.Net&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Best%20Practices" rel="tag"&gt;Best Practices&lt;/a&gt;,&lt;a href="http://technorati.com/tags/C#" rel="tag"&gt;C#&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Coding%20Standards" rel="tag"&gt;Coding Standards&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12895914-1445409605702343681?l=emiajnet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://emiajnet.blogspot.com/feeds/1445409605702343681/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12895914&amp;postID=1445409605702343681' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12895914/posts/default/1445409605702343681'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12895914/posts/default/1445409605702343681'/><link rel='alternate' type='text/html' href='http://emiajnet.blogspot.com/2008/12/what-coding-standards-do-i-use.html' title='What .Net coding standards do I use?'/><author><name>jaime</name><uri>http://www.blogger.com/profile/05400435935764737984</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12895914.post-5323400880083880791</id><published>2008-12-05T18:57:00.002-05:00</published><updated>2009-05-22T10:33:14.632-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='codeproject'/><category scheme='http://www.blogger.com/atom/ns#' term='CSS'/><category scheme='http://www.blogger.com/atom/ns#' term='HTML'/><title type='text'>Optimize your Pages using CSS Sprites</title><content type='html'>&lt;p&gt;Lets say that you boss calls you telling that the shiny new page of the company in the production server is having a very bad user experience, the load process takes a lot of time and the users have to wait to start using it.&lt;/p&gt;  &lt;p&gt;You, as a good developer/designer found after a trace of the web requests/responses that the main issue is related to the downloading process of the images that are being used for several elements in the main page screen...lets say 100 images (pretty large, isn't?). &lt;/p&gt;  &lt;p&gt;You check the size of those images and none of them is too large (1kb - 10kb max), then your boss look at you and you simply don't have an answer for such thing... what to do then? start blaming to the user's computers (&amp;quot;is their fault, they should upgrade to a better Internet connection, no less than T1&amp;quot;), or start blaming to the framework? (&amp;quot;is PHP/.net/java fault, I told you so, the decision to go with PHP/.net/java was a really bad idea&amp;quot;), or something else that saves your soul from hell :) .&lt;/p&gt;  &lt;p&gt;Here is when a technique named &lt;a title="CSS Sprites" href="http://www.alistapart.com/articles/sprites/" target="_blank"&gt;CSS Sprites&lt;/a&gt; comes to the rescue. This is an idea ported from the gaming industry and it can be applied to the web too. The main idea is to take all your images (in these case the 100 images) and put them all in a big image, and finally, using CSS move the coordinates around this newly image to show the correct image for a given element.&lt;/p&gt;  &lt;p&gt;Lets create an small demo showing this technique:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;The final result should look like this:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_-4wV51cifeA/SejTirg-8yI/AAAAAAAAACs/Sjaw-skUN_I/s1600-h/final_result%5B4%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="final_result" border="0" alt="final_result" src="http://lh6.ggpht.com/_-4wV51cifeA/SejTjDa9OvI/AAAAAAAAACw/Of3Wv6OYkws/final_result_thumb%5B2%5D.png?imgmax=800" width="240" height="134" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;This is our basic markup: &lt;/p&gt;  &lt;div style="font-family: consolas; background: #282424; color: #f3f3f3; font-size: 10pt"&gt;   &lt;p style="margin: 0px"&gt;&lt;span style="color: #6afd51"&gt;&amp;lt;!&lt;/span&gt;&lt;span style="color: #a2c4fd"&gt;DOCTYPE&lt;/span&gt; &lt;span style="color: #fdf8b9"&gt;html&lt;/span&gt; &lt;span style="color: #fdf8b9"&gt;PUBLIC&lt;/span&gt; &lt;span style="color: #fcb581"&gt;&amp;quot;-//W3C//DTD XHTML 1.0 Transitional//EN&amp;quot;&lt;/span&gt; &lt;span style="color: #fcb581"&gt;&amp;quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&amp;quot;&lt;/span&gt;&lt;span style="color: #6afd51"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #6afd51"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a2c4fd"&gt;html&lt;/span&gt; &lt;span style="color: #fdf8b9"&gt;xmlns&lt;/span&gt;&lt;span style="color: #a2c4fd"&gt;=&lt;/span&gt;&lt;span style="color: #fcb581"&gt;&amp;quot;http://www.w3.org/1999/xhtml&amp;quot;&lt;/span&gt;&lt;span style="color: #6afd51"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #6afd51"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a2c4fd"&gt;head&lt;/span&gt;&lt;span style="color: #6afd51"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #6afd51"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a2c4fd"&gt;style&lt;/span&gt; &lt;span style="color: #fdf8b9"&gt;type&lt;/span&gt;&lt;span style="color: #a2c4fd"&gt;=&lt;/span&gt;&lt;span style="color: #fcb581"&gt;&amp;quot;text/css&amp;quot;&lt;/span&gt;&lt;span style="color: #6afd51"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #fe9494"&gt;.container&lt;/span&gt; &lt;span style="color: #fe9494"&gt;div&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #a2c4fd"&gt;border&lt;/span&gt;: &lt;span style="color: #fdf8b9"&gt;1px&lt;/span&gt; &lt;span style="color: #fdf8b9"&gt;solid&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #a2c4fd"&gt;float&lt;/span&gt;: &lt;span style="color: #fdf8b9"&gt;left&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #a2c4fd"&gt;height&lt;/span&gt;: &lt;span style="color: #fdf8b9"&gt;100px&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #a2c4fd"&gt;left&lt;/span&gt;: &lt;span style="color: #fdf8b9"&gt;20px&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #a2c4fd"&gt;margin-left&lt;/span&gt;: &lt;span style="color: #fdf8b9"&gt;12px&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #a2c4fd"&gt;margin-top&lt;/span&gt;: &lt;span style="color: #fdf8b9"&gt;50px&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #a2c4fd"&gt;position&lt;/span&gt;: &lt;span style="color: #fdf8b9"&gt;relative&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #a2c4fd"&gt;width&lt;/span&gt;: &lt;span style="color: #fdf8b9"&gt;100px&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #fe9494"&gt;.blue&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #fe9494"&gt;.red&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #fe9494"&gt;.yellow&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #6afd51"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a2c4fd"&gt;style&lt;/span&gt;&lt;span style="color: #6afd51"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #6afd51"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a2c4fd"&gt;head&lt;/span&gt;&lt;span style="color: #6afd51"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #6afd51"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a2c4fd"&gt;body&lt;/span&gt;&lt;span style="color: #6afd51"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #6afd51"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a2c4fd"&gt;div&lt;/span&gt; &lt;span style="color: #fdf8b9"&gt;class&lt;/span&gt;&lt;span style="color: #a2c4fd"&gt;=&lt;/span&gt;&lt;span style="color: #fcb581"&gt;&amp;quot;container&amp;quot;&lt;/span&gt;&lt;span style="color: #6afd51"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #6afd51"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a2c4fd"&gt;div&lt;/span&gt; &lt;span style="color: #fdf8b9"&gt;class&lt;/span&gt;&lt;span style="color: #a2c4fd"&gt;=&lt;/span&gt;&lt;span style="color: #fcb581"&gt;&amp;quot;blue&amp;quot;&lt;/span&gt;&lt;span style="color: #6afd51"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #6afd51"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a2c4fd"&gt;div&lt;/span&gt;&lt;span style="color: #6afd51"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #6afd51"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a2c4fd"&gt;div&lt;/span&gt; &lt;span style="color: #fdf8b9"&gt;class&lt;/span&gt;&lt;span style="color: #a2c4fd"&gt;=&lt;/span&gt;&lt;span style="color: #fcb581"&gt;&amp;quot;red&amp;quot;&lt;/span&gt;&lt;span style="color: #6afd51"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #6afd51"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a2c4fd"&gt;div&lt;/span&gt;&lt;span style="color: #6afd51"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #6afd51"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a2c4fd"&gt;div&lt;/span&gt; &lt;span style="color: #fdf8b9"&gt;class&lt;/span&gt;&lt;span style="color: #a2c4fd"&gt;=&lt;/span&gt;&lt;span style="color: #fcb581"&gt;&amp;quot;yellow&amp;quot;&lt;/span&gt;&lt;span style="color: #6afd51"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #6afd51"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a2c4fd"&gt;div&lt;/span&gt;&lt;span style="color: #6afd51"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #6afd51"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a2c4fd"&gt;div&lt;/span&gt;&lt;span style="color: #6afd51"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #6afd51"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a2c4fd"&gt;body&lt;/span&gt;&lt;span style="color: #6afd51"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #6afd51"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a2c4fd"&gt;html&lt;/span&gt;&lt;span style="color: #6afd51"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;And these are our images:&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160; &lt;/p&gt;  &lt;table border="0" cellspacing="0" cellpadding="2" width="200"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="66"&gt;&lt;a href="http://lh5.ggpht.com/_-4wV51cifeA/SejTjQTTkNI/AAAAAAAAAC0/0paIOwdw0AM/s1600-h/blue%5B4%5D.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="blue" border="0" alt="blue" src="http://lh5.ggpht.com/_-4wV51cifeA/SejTj2zppnI/AAAAAAAAAC4/OQtKRZVMI0k/blue_thumb%5B2%5D.jpg?imgmax=800" width="100" height="100" /&gt;&lt;/a&gt; &lt;/td&gt;        &lt;td valign="top" width="66"&gt;&lt;a href="http://lh6.ggpht.com/_-4wV51cifeA/SejTkCy1i3I/AAAAAAAAAC8/tzILL-FOmqE/s1600-h/yellow%5B4%5D.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="yellow" border="0" alt="yellow" src="http://lh6.ggpht.com/_-4wV51cifeA/SejTktuzLsI/AAAAAAAAADA/sOIcN7CCgQA/yellow_thumb%5B2%5D.jpg?imgmax=800" width="100" height="100" /&gt;&lt;/a&gt; &lt;/td&gt;        &lt;td valign="top" width="66"&gt;&lt;a href="http://lh3.ggpht.com/_-4wV51cifeA/SejTk7BrYrI/AAAAAAAAADE/GqCubuHdV8I/s1600-h/red%5B4%5D.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="red" border="0" alt="red" src="http://lh3.ggpht.com/_-4wV51cifeA/SejTlf9VZMI/AAAAAAAAADI/Z-hh77uQ4AM/red_thumb%5B2%5D.jpg?imgmax=800" width="100" height="100" /&gt;&lt;/a&gt; &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="66"&gt;&lt;em&gt;blue.jpg&lt;/em&gt;&lt;/td&gt;        &lt;td valign="top" width="66"&gt;&lt;em&gt;yellow.jpg&lt;/em&gt;&lt;/td&gt;        &lt;td valign="top" width="66"&gt;&lt;em&gt;red.jpg&lt;/em&gt;&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Now, the traditional way to do this is just to set the background-image for each selector to target the correct image, something like:&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;div style="font-family: consolas; background: #282424; color: #f3f3f3; font-size: 10pt"&gt;   &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #fe9494"&gt;.blue&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #a2c4fd"&gt;background-image&lt;/span&gt;:&lt;span style="color: #fdf8b9"&gt;url('blue.jpg')&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #fe9494"&gt;.red&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #a2c4fd"&gt;background-image&lt;/span&gt;:&lt;span style="color: #fdf8b9"&gt;url('red.jpg')&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #fe9494"&gt;.yellow&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #a2c4fd"&gt;background-image&lt;/span&gt;:&lt;span style="color: #fdf8b9"&gt;url('yellow.jpg')&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;And effectively, it does work. But the problem is that you are hitting 3 times the server to retrieve those images. You can get the same result using CSS Sprites, first using your favorite image editing software (Photoshop) we are going to merge those images, the end result should be something like these:&lt;/p&gt;  &lt;table border="0" cellspacing="0" cellpadding="2" width="255"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="253"&gt;&lt;a href="http://lh6.ggpht.com/_-4wV51cifeA/SejTmIuZhbI/AAAAAAAAADM/7e6gs6N5Skk/s1600-h/sprite%5B4%5D.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="sprite" border="0" alt="sprite" src="http://lh6.ggpht.com/_-4wV51cifeA/SejTmlUfTkI/AAAAAAAAADQ/Q58hQCKD5G4/sprite_thumb%5B2%5D.jpg?imgmax=800" width="240" height="80" /&gt;&lt;/a&gt; &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="253"&gt;&lt;em&gt;sprite.jpg&lt;/em&gt;&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;And here the magic happens, lets change our selectors to use this big image and move the coordinates for each square until we get the desired result:&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;div style="font-family: consolas; background: #282424; color: #f3f3f3; font-size: 10pt"&gt;   &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #fe9494"&gt;.container&lt;/span&gt; &lt;span style="color: #fe9494"&gt;div&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #a2c4fd"&gt;border&lt;/span&gt;: &lt;span style="color: #fdf8b9"&gt;1px&lt;/span&gt; &lt;span style="color: #fdf8b9"&gt;solid&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #a2c4fd"&gt;float&lt;/span&gt;: &lt;span style="color: #fdf8b9"&gt;left&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #a2c4fd"&gt;height&lt;/span&gt;: &lt;span style="color: #fdf8b9"&gt;100px&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #a2c4fd"&gt;left&lt;/span&gt;: &lt;span style="color: #fdf8b9"&gt;20px&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #a2c4fd"&gt;margin-left&lt;/span&gt;: &lt;span style="color: #fdf8b9"&gt;12px&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #a2c4fd"&gt;margin-top&lt;/span&gt;: &lt;span style="color: #fdf8b9"&gt;50px&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #a2c4fd"&gt;position&lt;/span&gt;: &lt;span style="color: #fdf8b9"&gt;relative&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #a2c4fd"&gt;width&lt;/span&gt;: &lt;span style="color: #fdf8b9"&gt;100px&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #a2c4fd"&gt;background-image&lt;/span&gt;: &lt;span style="color: #fdf8b9"&gt;url('sprite.jpg')&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #fe9494"&gt;.blue&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #a2c4fd"&gt;background-position&lt;/span&gt;: &lt;span style="color: #fdf8b9"&gt;-100px&lt;/span&gt; &lt;span style="color: #fdf8b9"&gt;0px&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #fe9494"&gt;.red&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #a2c4fd"&gt;background-position&lt;/span&gt;: &lt;span style="color: #fdf8b9"&gt;-200px&lt;/span&gt; &lt;span style="color: #fdf8b9"&gt;0px&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #fe9494"&gt;.yellow&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #a2c4fd"&gt;background-position&lt;/span&gt;: &lt;span style="color: #fdf8b9"&gt;-0px&lt;/span&gt; &lt;span style="color: #fdf8b9"&gt;0px&lt;/span&gt;;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;And that is all, what I'm doing there is assigning the background-image attribute of all the div's inside the container to our sprite.jpg image, later, I'm assigning a background-position to display the correct portion of the whole image. Furthermore, you are getting the same result but saving some hits to your server, isn't that cool enough?&lt;/p&gt;  &lt;p&gt;Well, that is all folks, hope you like my first article.&lt;/p&gt;  &lt;p&gt;You can download the sample code from &lt;a href="http://emiajnetsamples.googlecode.com/files/Css%20Sprites%20Sample.zip" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; padding-top: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:d7636e50-3998-4114-a33a-ca72e817dabc" class="wlWriterEditableSmartContent"&gt;Etiquetas de Technorati: &lt;a href="http://technorati.com/tags/CSS" rel="tag"&gt;CSS&lt;/a&gt;,&lt;a href="http://technorati.com/tags/HTML" rel="tag"&gt;HTML&lt;/a&gt;&lt;/div&gt;  &lt;p&gt;Bye bye.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12895914-5323400880083880791?l=emiajnet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://emiajnet.blogspot.com/feeds/5323400880083880791/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12895914&amp;postID=5323400880083880791' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12895914/posts/default/5323400880083880791'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12895914/posts/default/5323400880083880791'/><link rel='alternate' type='text/html' href='http://emiajnet.blogspot.com/2008/12/optimize-your-pages-using-css-sprites.html' title='Optimize your Pages using CSS Sprites'/><author><name>jaime</name><uri>http://www.blogger.com/profile/05400435935764737984</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_-4wV51cifeA/SejTjDa9OvI/AAAAAAAAACw/Of3Wv6OYkws/s72-c/final_result_thumb%5B2%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-12895914.post-1011141550223977630</id><published>2008-12-05T17:58:00.001-05:00</published><updated>2009-02-03T11:21:56.963-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Thoughts'/><title type='text'>Lets start by something simple...</title><content type='html'>&lt;p&gt;Hi there to everyone,&lt;/p&gt;  &lt;p&gt;I have decide for once to start to write something in this dammed blog, I did setup this blog some years ago and frankly never found the time to write something that could be useful to someone.&lt;/p&gt;  &lt;p&gt;Please, bear with me if you find some typos on the articles that I may write, English is not my primary language and this is going to be a great experience in my learning process about this language.&lt;/p&gt;  &lt;p&gt;I am by no means an expert about anything, do not take this blog too serious, your feedback (good or bad) is always welcome.&lt;/p&gt;  &lt;p&gt;So, here we go, lets see how far it goes.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/12895914-1011141550223977630?l=emiajnet.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://emiajnet.blogspot.com/feeds/1011141550223977630/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=12895914&amp;postID=1011141550223977630' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/12895914/posts/default/1011141550223977630'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/12895914/posts/default/1011141550223977630'/><link rel='alternate' type='text/html' href='http://emiajnet.blogspot.com/2008/12/lets-start-by-something-simple.html' title='Lets start by something simple...'/><author><name>jaime</name><uri>http://www.blogger.com/profile/05400435935764737984</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
