<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://dotnet.lv/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"><channel><title>Valdis Iljuconoks : Design</title><link>http://dotnet.lv/blogs/vi/archive/tags/Design/default.aspx</link><description>Tagi: Design</description><dc:language>en</dc:language><generator>CommunityServer 2008 SP1 (Build: 30619.63)</generator><item><title>Calling a service from Windows Phone application reactively</title><link>http://dotnet.lv/blogs/vi/archive/2012/06/20/calling-a-service-from-windows-phone-application-reactively.aspx</link><pubDate>Wed, 20 Jun 2012 06:36:59 GMT</pubDate><guid isPermaLink="false">245d81fd-b543-41d7-a051-d8603c6e9e31:483446</guid><dc:creator>valdis.iljuconoks</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnet.lv/blogs/vi/rsscomments.aspx?PostID=483446</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnet.lv/blogs/vi/commentapi.aspx?PostID=483446</wfw:comment><comments>http://dotnet.lv/blogs/vi/archive/2012/06/20/calling-a-service-from-windows-phone-application-reactively.aspx#comments</comments><description>&lt;div id="post_content"&gt;&lt;p&gt;If you are creating connected Windows Phone application then most probably have noticed that mostly interface what Visual Studio (VS) generates for you in client proxy class is event-based async pattern.&lt;/p&gt;  &lt;p&gt;For instance we have defined service (usually this is WCF implementation) method:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="border-bottom:#000080 1px solid;border-left:#000080 1px solid;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;color:#000;font-size:10pt;border-top:#000080 1px solid;border-right:#000080 1px solid;"&gt;   &lt;div style="padding-bottom:2px;background-color:#f0f0f0;padding-left:5px;padding-right:5px;max-height:500px;overflow:auto;padding-top:2px;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;AtmFinderService&lt;/span&gt; : IAtmFinderService       &lt;br /&gt;{       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; ServiceResponse FindNearby(&lt;span style="color:#0000ff;"&gt;double&lt;/span&gt; latitude, &lt;span style="color:#0000ff;"&gt;double&lt;/span&gt; longitude)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#000000"&gt;...&lt;/font&gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Generating the client proxy class we can see that VS generated event based approach, when we do have an incredible opportunity to use &lt;font face="Courier New"&gt;DoSomethingAsync()&lt;/font&gt; method in our favor and then try to catch event which is raised immediately after operation has been completed.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vi/image_5F00_25D4B9EA.png" rel="lightbox"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:block;float:none;border-top-width:0px;border-bottom-width:0px;margin-left:auto;border-left-width:0px;margin-right:auto;padding-top:0px;" title="" border="0" alt="" src="http://www.dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vi/image_5F00_thumb_5F00_054D7A38.png" width="221" height="194" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Using this method and event code does look pretty much readable (we will touch body of the event handler later on as well).&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="border-bottom:#000080 1px solid;border-left:#000080 1px solid;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;color:#000;font-size:10pt;border-top:#000080 1px solid;border-right:#000080 1px solid;"&gt;   &lt;div style="padding-bottom:2px;background-color:#f0f0f0;padding-left:5px;padding-right:5px;max-height:500px;overflow:auto;padding-top:2px;"&gt;proxy.FindNearbyCompleted += (sender, args) =&amp;gt;      &lt;br /&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; {       &lt;br /&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;span style="color:#808080;"&gt;// do something&lt;/span&gt;       &lt;br /&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; };&lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Suppose if you are sharing the proxy class (for instance, as &lt;font face="Courier New"&gt;static &lt;/font&gt;member of your service façade). Then for sure you will need a mechanism how you can unsubscribe from the event after method has been executed successfully. More info on subscribing and unsubscribing to the events here - &lt;a title="http://msdn.microsoft.com/en-us/library/ms366768.aspx" href="http://msdn.microsoft.com/en-us/library/ms366768.aspx"&gt;http://msdn.microsoft.com/en-us/library/ms366768.aspx&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;So, what we can do is to define event handler and store the reference to the body in class field or member. We can define variable as delegate:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="border-bottom:#000080 1px solid;border-left:#000080 1px solid;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;color:#000;font-size:10pt;border-top:#000080 1px solid;border-right:#000080 1px solid;"&gt;   &lt;div style="padding-bottom:2px;background-color:#f0f0f0;padding-left:5px;padding-right:5px;max-height:500px;overflow:auto;padding-top:2px;"&gt;&lt;span style="color:#2b91af;"&gt;EventHandler&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;FindNearbyCompletedEventArgs&lt;/span&gt;&amp;gt; delg = &lt;span style="color:#0000ff;"&gt;delegate&lt;/span&gt;(&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; sender, &lt;span style="color:#2b91af;"&gt;FindNearbyCompletedEventArgs&lt;/span&gt; args)       &lt;br /&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; {       &lt;br /&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; &lt;span style="color:#808080;"&gt;// do something&lt;/span&gt;       &lt;br /&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; };&lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;or we can define to store as &lt;font face="Courier New"&gt;EventHandler&lt;/font&gt;:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="border-bottom:#000080 1px solid;border-left:#000080 1px solid;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;color:#000;font-size:10pt;border-top:#000080 1px solid;border-right:#000080 1px solid;"&gt;   &lt;div style="padding-bottom:2px;background-color:#f0f0f0;padding-left:5px;padding-right:5px;max-height:500px;overflow:auto;padding-top:2px;"&gt;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; delg = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;EventHandler&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;FindNearbyCompletedEventArgs&lt;/span&gt;&amp;gt;((sender, args) =&amp;gt;       &lt;br /&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;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&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;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#808080;"&gt;// do something&lt;/span&gt;       &lt;br /&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;&amp;#160;&amp;#160;&amp;#160; });&lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Then I figured out that the most easiest way to subscribe only once per call is to unsubscribe first and then subscribe:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="border-bottom:#000080 1px solid;border-left:#000080 1px solid;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;color:#000;font-size:10pt;border-top:#000080 1px solid;border-right:#000080 1px solid;"&gt;   &lt;div style="padding-bottom:2px;background-color:#f0f0f0;padding-left:5px;padding-right:5px;max-height:500px;overflow:auto;padding-top:2px;"&gt;proxy.FindNearbyCompleted -= delg;      &lt;br /&gt;proxy.FindNearbyCompleted += delg;&lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;When next time method will be executed event handler added from previous call will be removed first, and then added new one.&lt;/p&gt;  &lt;p&gt;Then we can proceed with the actual service method call. So the complete code is:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="border-bottom:#000080 1px solid;border-left:#000080 1px solid;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;color:#000;font-size:10pt;border-top:#000080 1px solid;border-right:#000080 1px solid;"&gt;   &lt;div style="padding-bottom:2px;background-color:#f0f0f0;padding-left:5px;padding-right:5px;max-height:500px;overflow:auto;padding-top:2px;"&gt;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; delg = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;EventHandler&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;FindNearbyCompletedEventArgs&lt;/span&gt;&amp;gt;((sender, args) =&amp;gt;       &lt;br /&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;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&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;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#808080;"&gt;// do something&lt;/span&gt;       &lt;br /&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;&amp;#160;&amp;#160;&amp;#160; });       &lt;br /&gt;      &lt;br /&gt;proxy.FindNearbyCompleted -= delg;       &lt;br /&gt;proxy.FindNearbyCompleted += delg;       &lt;br /&gt;      &lt;br /&gt;proxy.FindNearbyAsync(location.Latitude, location.Longitude);&lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;This is more or less everything you need to call service method from Windows Phone in async event-based pattern.&lt;/p&gt;  &lt;p&gt;One more note about event handler body. Usually there is requirement to execute event handler on the &lt;font face="Courier New"&gt;Dispatcher &lt;/font&gt;if that updates something in user interface from another thread (that may happen if event handler is called later on).&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="border-bottom:#000080 1px solid;border-left:#000080 1px solid;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;color:#000;font-size:10pt;border-top:#000080 1px solid;border-right:#000080 1px solid;"&gt;   &lt;div style="padding-bottom:2px;background-color:#f0f0f0;padding-left:5px;padding-right:5px;max-height:500px;overflow:auto;padding-top:2px;"&gt;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; delg = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;EventHandler&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;FindNearbyCompletedEventArgs&lt;/span&gt;&amp;gt;((sender, args) =&amp;gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&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:#0000ff;"&gt;if&lt;/span&gt; (&lt;span style="color:#2b91af;"&gt;Deployment&lt;/span&gt;.Current.Dispatcher.CheckAccess())       &lt;br /&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;br /&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:#2b91af;"&gt;Deployment&lt;/span&gt;.Current.Dispatcher.BeginInvoke(&lt;span style="color:#808080;"&gt;/* method */&lt;/span&gt;);       &lt;br /&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:#0000ff;"&gt;return&lt;/span&gt;;       &lt;br /&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;br /&gt;      &lt;br /&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:#808080;"&gt;// do something&lt;/span&gt;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; });&lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Here comes another problem that we need to call the same event handler body only within the &lt;font face="Courier New"&gt;Dispatcher &lt;/font&gt;context.&lt;/p&gt;  &lt;p&gt;Easiest way to implement this requirement would be to implement additional method as event handler and then perform dispatcher check there and if call requires dispatcher context, invoke the same method once more within dispatcher context.&lt;/p&gt;  &lt;p&gt;So we are implementing the event handler method first.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="border-bottom:#000080 1px solid;border-left:#000080 1px solid;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;color:#000;font-size:10pt;border-top:#000080 1px solid;border-right:#000080 1px solid;"&gt;   &lt;div style="padding-bottom:2px;background-color:#f0f0f0;padding-left:5px;padding-right:5px;max-height:500px;overflow:auto;padding-top:2px;"&gt;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; ProxyOnFindNearbyCompleted(&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; sender, &lt;span style="color:#2b91af;"&gt;FindNearbyCompletedEventArgs&lt;/span&gt; args)       &lt;br /&gt;{       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (!&lt;span style="color:#2b91af;"&gt;Deployment&lt;/span&gt;.Current.Dispatcher.CheckAccess())       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#2b91af;"&gt;Deployment&lt;/span&gt;.Current.Dispatcher.BeginInvoke(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Action&lt;/span&gt;&amp;lt;&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt;, &lt;span style="color:#2b91af;"&gt;FindNearbyCompletedEventArgs&lt;/span&gt;&amp;gt;(ProxyOnFindNearbyCompleted),       &lt;br /&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; sender,       &lt;br /&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; args);       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt;;       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }       &lt;br /&gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#808080;"&gt;// do something&lt;/span&gt;       &lt;br /&gt;}&lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;And then the original code that attaches the event handler and calls the method remains almost the same:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="border-bottom:#000080 1px solid;border-left:#000080 1px solid;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;color:#000;font-size:10pt;border-top:#000080 1px solid;border-right:#000080 1px solid;"&gt;   &lt;div style="padding-bottom:2px;background-color:#f0f0f0;padding-left:5px;padding-right:5px;max-height:500px;overflow:auto;padding-top:2px;"&gt;proxy.FindNearbyCompleted -= ProxyOnFindNearbyCompleted;      &lt;br /&gt;proxy.FindNearbyCompleted += ProxyOnFindNearbyCompleted;       &lt;br /&gt;      &lt;br /&gt;proxy.FindNearbyAsync(location.Latitude, location.Longitude);&lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;However for me this all seems already converting into unreadable spagetti-like code set.&lt;/p&gt;  &lt;p&gt;There is a more elegant way to accomplish this. I’m going to use Reactive Extensions for Windows Phone – &lt;font face="Courier New"&gt;Microsoft.Phone.Reactive&lt;/font&gt;. Library is coming with Windows Phone SDK.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vi/image_5F00_0475144E.png" rel="lightbox"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:block;float:none;border-top-width:0px;border-bottom-width:0px;margin-left:auto;border-left-width:0px;margin-right:auto;padding-top:0px;" title="" border="0" alt="" src="http://www.dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vi/image_5F00_thumb_5F00_08132F2B.png" width="800" height="438" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;At first we are defining observable from the event-based async pattern.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="border-bottom:#000080 1px solid;border-left:#000080 1px solid;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;color:#000;font-size:10pt;border-top:#000080 1px solid;border-right:#000080 1px solid;"&gt;   &lt;div style="padding-bottom:2px;background-color:#f0f0f0;padding-left:5px;padding-right:5px;max-height:500px;overflow:auto;padding-top:2px;"&gt;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; completedObservable = Microsoft.Phone.Reactive.&lt;span style="color:#2b91af;"&gt;Observable&lt;/span&gt;.FromEvent&amp;lt;&lt;span style="color:#2b91af;"&gt;FindNearbyCompletedEventArgs&lt;/span&gt;&amp;gt;(       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; ev =&amp;gt; proxy.FindNearbyCompleted += ev,       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; ev =&amp;gt; proxy.FindNearbyCompleted -= ev);&lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Those two arguments for &lt;font face="Courier New"&gt;FromEvent()&lt;/font&gt; method is used to add event handler and to remove event handler for &lt;font face="Courier New"&gt;FindNearbyCompleted&lt;/font&gt; event. This is also an elegant way how to write code that subscribes to the event only once.&lt;/p&gt;  &lt;p&gt;When observable has been created we are able to subscribe to to the event and provide handler to execute when event is raised.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="border-bottom:#000080 1px solid;border-left:#000080 1px solid;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;color:#000;font-size:10pt;border-top:#000080 1px solid;border-right:#000080 1px solid;"&gt;   &lt;div style="padding-bottom:2px;background-color:#f0f0f0;padding-left:5px;padding-right:5px;max-height:500px;overflow:auto;padding-top:2px;"&gt;completedObservable.Subscribe(result =&amp;gt;      &lt;br /&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; {       &lt;br /&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; &lt;span style="color:#808080;"&gt;// do something&lt;/span&gt;       &lt;br /&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; });&lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;The complete code looks like following:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="border-bottom:#000080 1px solid;border-left:#000080 1px solid;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;color:#000;font-size:10pt;border-top:#000080 1px solid;border-right:#000080 1px solid;"&gt;   &lt;div style="padding-bottom:2px;background-color:#f0f0f0;padding-left:5px;padding-right:5px;max-height:500px;overflow:auto;padding-top:2px;"&gt;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; completedObservable = &lt;span style="color:#2b91af;"&gt;Observable&lt;/span&gt;.FromEvent&amp;lt;&lt;span style="color:#2b91af;"&gt;FindNearbyCompletedEventArgs&lt;/span&gt;&amp;gt;(      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; ev =&amp;gt; proxy.FindNearbyCompleted += ev,      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; ev =&amp;gt; proxy.FindNearbyCompleted -= ev);      &lt;br /&gt;      &lt;br /&gt;completedObservable.Subscribe(result =&amp;gt;      &lt;br /&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; {      &lt;br /&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; &lt;span style="color:#808080;"&gt;// do something&lt;/span&gt;      &lt;br /&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; });      &lt;br /&gt;      &lt;br /&gt;proxy.FindNearbyAsync(location.Latitude, location.Longitude);&lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Pretty straight forward and what’s important – code is readable and understandable.&lt;/p&gt;  &lt;p&gt;One more thing, if you require to run event handler on &lt;font face="Courier New"&gt;Dispatcher&lt;/font&gt; thread, than that’s far more easier than previous implementation with direct checking dispatcher access. You just have to tell reactive extensions that you need to observe events on dispatcher thread rather than on current context.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;div style="border-bottom:#000080 1px solid;border-left:#000080 1px solid;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;color:#000;font-size:10pt;border-top:#000080 1px solid;border-right:#000080 1px solid;"&gt;   &lt;div style="padding-bottom:2px;background-color:#f0f0f0;padding-left:5px;padding-right:5px;max-height:500px;overflow:auto;padding-top:2px;"&gt;completedObservable.ObserveOnDispatcher().Subscribe(result =&amp;gt;      &lt;br /&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; {       &lt;br /&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;&amp;#160; &lt;span style="color:#808080;"&gt;// do something&lt;/span&gt;       &lt;br /&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; });&lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;In summary, code gets reduced, more readable and understandable.&lt;/p&gt;  &lt;p&gt;Hope this helps!&lt;/p&gt;&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnet.lv/aggbug.aspx?PostID=483446" width="1" height="1"&gt;</description><category domain="http://dotnet.lv/blogs/vi/archive/tags/Architecture/default.aspx">Architecture</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/Design/default.aspx">Design</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/Windows+Phone/default.aspx">Windows Phone</category></item><item><title>When you need something stronger..</title><link>http://dotnet.lv/blogs/vi/archive/2012/06/05/when-you-need-something-stronger.aspx</link><pubDate>Mon, 04 Jun 2012 22:22:51 GMT</pubDate><guid isPermaLink="false">245d81fd-b543-41d7-a051-d8603c6e9e31:457871</guid><dc:creator>valdis.iljuconoks</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnet.lv/blogs/vi/rsscomments.aspx?PostID=457871</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnet.lv/blogs/vi/commentapi.aspx?PostID=457871</wfw:comment><comments>http://dotnet.lv/blogs/vi/archive/2012/06/05/when-you-need-something-stronger.aspx#comments</comments><description>&lt;div id="post_content"&gt;   &lt;p&gt;Have you seen code fragment like this? I mean there are lot of interfaces that provide &lt;a href="http://www.globalnerdy.com/2010/05/09/new-programming-jargon/"&gt;&lt;strong&gt;stringly-typed&lt;/strong&gt;&lt;/a&gt; access to some of the internals of the entity. This particular code fragment could be seen a lot in EPiServer Relate+ product code samples.&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;div style="border-bottom:#000080 1px solid;border-left:#000080 1px solid;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;color:#000;font-size:10pt;border-top:#000080 1px solid;border-right:#000080 1px solid;"&gt;     &lt;div style="padding-bottom:2px;background-color:#f0f0f0;padding-left:5px;padding-right:5px;max-height:500px;overflow:auto;padding-top:2px;"&gt;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; instance = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;SampleType&lt;/span&gt;();         &lt;br /&gt;instance.SetAttributeValue(&lt;span style="color:#a31515;"&gt;&amp;quot;ThisIsTheAttribute&amp;quot;&lt;/span&gt;, value);&lt;/div&gt;   &lt;/div&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;Accessing something that’s not pretty strong enough could be very easy and fast. Not a big deal – just type in attribute name and value.&lt;/p&gt;    &lt;p&gt;Here goes why I don’t like interfaces like these:&lt;/p&gt;    &lt;ol&gt;     &lt;li&gt;When you will margin for a grammar error when typing attribute name – that could be discovered only during runtime. &lt;/li&gt;      &lt;li&gt;You cannot use static code analysis tools. Like to search for all attribute usages. &lt;/li&gt;      &lt;li&gt;You cannot use some of the refactoring tools –&amp;gt; like rename attribute name. &lt;/li&gt;      &lt;li&gt;You can easily change type of the attribute and forget about code that uses that, effect –&amp;gt; runtime error. &lt;/li&gt;      &lt;li&gt;Use cannot leverage all the power of Visual Studio (for instance to provide Intellisense over available attributes) &lt;/li&gt;   &lt;/ol&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;So as we see – there a lot more troubles around stringly-typed interfaces than benefit you gain.&lt;/p&gt;    &lt;p&gt;We are going to change this in this blog post.&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;First of all we would need to define client API – that’s how we are going to use our strongly-typed interface to talk to your stringly friend.&lt;/p&gt;    &lt;p&gt;I would like to see following things in client API:&lt;/p&gt;    &lt;ol&gt;     &lt;li&gt;There should be an object that would describe structure of the stringly-typed object. Like enumerating all the properties that we would like to have access to. I would call it – a metadata object. &lt;/li&gt;      &lt;li&gt;There should be an easy way to convert stringly-typed object into this metadata object. &lt;/li&gt;      &lt;li&gt;Metadata object will be used to talk to stringly-typed object via strongly-typed metadata object. &lt;/li&gt;   &lt;/ol&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;I would see client API and some code snippets as following:&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;div style="border-bottom:#000080 1px solid;border-left:#000080 1px solid;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;color:#000;font-size:10pt;border-top:#000080 1px solid;border-right:#000080 1px solid;"&gt;     &lt;div style="padding-bottom:2px;background-color:#f0f0f0;padding-left:5px;padding-right:5px;max-height:500px;overflow:auto;padding-top:2px;"&gt;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; instance = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;SampleType&lt;/span&gt;();         &lt;br /&gt;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; metadata = instance.AsAttributeExtendable&amp;lt;&lt;span style="color:#2b91af;"&gt;SampleAttributeMetadata&lt;/span&gt;&amp;gt;();         &lt;br /&gt;metadata.SampleAttribute = value;&lt;/div&gt;   &lt;/div&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;Metadata class could be described like this:&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;div style="border-bottom:#000080 1px solid;border-left:#000080 1px solid;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;color:#000;font-size:10pt;border-top:#000080 1px solid;border-right:#000080 1px solid;"&gt;     &lt;div style="padding-bottom:2px;background-color:#f0f0f0;padding-left:5px;padding-right:5px;max-height:500px;overflow:auto;padding-top:2px;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;SampleAttributeMetadata&lt;/span&gt;         &lt;br /&gt;{         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; SampleAttribute { &lt;span style="color:#0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color:#0000ff;"&gt;set&lt;/span&gt;; }         &lt;br /&gt;}&lt;/div&gt;   &lt;/div&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;This metadata object is just an object that will provide us strongly-typed access later on.&lt;/p&gt;    &lt;p&gt;First things first.&lt;/p&gt;    &lt;p&gt;To convert stringly-typed object into some more meaningful instance we would need something “attachable” to original object. Extension methods will come to rescue today.&lt;/p&gt;    &lt;p&gt;So we are able to write static method that will attach to original object and behave as instance method for that object. No matter which is your original object (for sake of integrity I’ll use EPiServer Relate+ ‘&lt;font face="Courier New"&gt;IAttributeExtendableEntity&lt;/font&gt;’ interface).&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;div style="border-bottom:#000080 1px solid;border-left:#000080 1px solid;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;color:#000;font-size:10pt;border-top:#000080 1px solid;border-right:#000080 1px solid;"&gt;     &lt;div style="padding-bottom:2px;background-color:#f0f0f0;padding-left:5px;padding-right:5px;max-height:500px;overflow:auto;padding-top:2px;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; T AsAttributeExtendable&amp;lt;T&amp;gt;(&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;IAttributeExtendableEntity&lt;/span&gt; entity) &lt;span style="color:#0000ff;"&gt;where&lt;/span&gt; T : &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt;, &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt;()&lt;/div&gt;   &lt;/div&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;This means that we are defining extension method for objects that implement ‘&lt;font face="Courier New"&gt;IAttributeExtendableEntity&lt;/font&gt;’ interface (those are almost all entities in EPiServer Relate+). This ‘&lt;font face="Courier New"&gt;IAttributeExtendableEntity&lt;/font&gt;’ interface provides stringly-typed access to attributes that you can set or get.&lt;/p&gt;    &lt;p&gt;Generic type parameter &lt;font face="Courier New"&gt;T&lt;/font&gt; – that will be our metadata object class.&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;Next –&amp;gt; we need to somehow take a control over the metadata object that as given away to the caller of the extension method defined earlier.&lt;/p&gt;    &lt;p&gt;For this reason one of the most easiest way to accomplish this is to use some sort of interceptor infrastructure. What interceptor does? Idea behind the interceptor is that client who got back the metadata object thinks (an result object really looks alike) that object that was given back is of defined metadata object type. And so do all code analysis tools (therefore Intellisense is available) and compiler as well.&lt;/p&gt;    &lt;p&gt;Actually using interceptors we are giving back fake metadata object that has lot of injections in it in order to for us to gain control over the further client’s interaction with the object.&lt;/p&gt;    &lt;p&gt;One of my favorite library to accomplish this is &lt;a href="http://nuget.org/packages/Castle.Core"&gt;&lt;strong&gt;‘Castle project’&lt;/strong&gt;&lt;/a&gt;. Pretty easy to use and straightforward.&lt;/p&gt;    &lt;p&gt;So what we need is to create a fake metadata object with our injections to control what’s going after we return the object. In order to get this done we need to define our interceptor and return a class proxy created using this interceptor.&lt;/p&gt;    &lt;p&gt;So the code for &lt;font face="Courier New"&gt;AsAttributeExtendable() &lt;/font&gt;method is like this:&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;div style="border-bottom:#000080 1px solid;border-left:#000080 1px solid;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;color:#000;font-size:10pt;border-top:#000080 1px solid;border-right:#000080 1px solid;"&gt;     &lt;div style="padding-bottom:2px;background-color:#f0f0f0;padding-left:5px;padding-right:5px;max-height:500px;overflow:auto;padding-top:2px;"&gt;&lt;strike&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; T AsAttributeExtendable&amp;lt;T&amp;gt;(&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;IAttributeExtendableEntity&lt;/span&gt; entity) &lt;span style="color:#0000ff;"&gt;where&lt;/span&gt; T : &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt;, &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt;()           &lt;br /&gt;{           &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (entity == &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;)           &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {           &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#0000ff;"&gt;throw&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ArgumentNullException&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;entity&amp;quot;&lt;/span&gt;);           &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }           &lt;br /&gt;          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; interceptor = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;DefaultInterceptor&lt;/span&gt;&amp;lt;T&amp;gt;(entity);           &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; gen = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ProxyGenerator&lt;/span&gt;();           &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; options = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ProxyGenerationOptions&lt;/span&gt;(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ProxyGenerationHook&lt;/span&gt;());           &lt;br /&gt;          &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; proxy = gen.CreateClassProxy&amp;lt;T&amp;gt;(options, interceptor);           &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; proxy;           &lt;br /&gt;}&lt;/strike&gt;&lt;/div&gt;   &lt;/div&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;UPDATE:&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;NB! &lt;/strong&gt;Lessons learned! Actually it’s not quite a good idea to create proxy generator, generation hook and class proxy on each request. Just got through support ticket on memory leak and huge memory consumption. Which ended-up with lot of dynamically generated assemblies loaded into application domain and lot other stuff.&lt;/p&gt;    &lt;p&gt;A better solution is reuse &lt;font face="Courier New"&gt;‘ProxyGenerator’&lt;/font&gt; class instance and cache generated class proxies for particular types.&lt;/p&gt;    &lt;p&gt;First of all need to define static instance of the proxy generator class and store where cached class proxy instances will be stored.&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;div style="border-bottom:#000080 1px solid;border-left:#000080 1px solid;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;color:#000;font-size:10pt;border-top:#000080 1px solid;border-right:#000080 1px solid;"&gt;     &lt;div style="padding-bottom:2px;background-color:#f0f0f0;padding-left:5px;padding-right:5px;max-height:500px;overflow:auto;padding-top:2px;"&gt;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;readonly&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ProxyGenerator&lt;/span&gt; gen = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ProxyGenerator&lt;/span&gt;();         &lt;br /&gt;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;readonly&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ProxyGenerationOptions&lt;/span&gt; options = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ProxyGenerationOptions&lt;/span&gt;(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ProxyGenerationHook&lt;/span&gt;());         &lt;br /&gt;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;readonly&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ConditionalWeakTable&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;IAttributeExtendableEntity&lt;/span&gt;, &lt;span style="color:#0000ff;"&gt;object&lt;/span&gt;&amp;gt; table =         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ConditionalWeakTable&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;IAttributeExtendableEntity&lt;/span&gt;, &lt;span style="color:#0000ff;"&gt;object&lt;/span&gt;&amp;gt;();&lt;/div&gt;   &lt;/div&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;Then we can implement updated method to generate class proxy for particular class of particular type:&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;div style="border-bottom:#000080 1px solid;border-left:#000080 1px solid;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;color:#000;font-size:10pt;border-top:#000080 1px solid;border-right:#000080 1px solid;"&gt;     &lt;div style="padding-bottom:2px;background-color:#f0f0f0;padding-left:5px;padding-right:5px;max-height:500px;overflow:auto;padding-top:2px;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; T AsAttributeExtendable&amp;lt;T&amp;gt;(&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;IAttributeExtendableEntity&lt;/span&gt; entity) &lt;span style="color:#0000ff;"&gt;where&lt;/span&gt; T : &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt;, &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt;()        &lt;br /&gt;{        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (entity == &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;)        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#0000ff;"&gt;throw&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ArgumentNullException&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;entity&amp;quot;&lt;/span&gt;);        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }        &lt;br /&gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; classProxyCached;        &lt;br /&gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#808080;"&gt;// try to find already created class proxy from the cache&lt;/span&gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#808080;"&gt;// this is required to increase speed a bit and not to create new class proxy for the same class more than once&lt;/span&gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; table.TryGetValue(entity, &lt;span style="color:#0000ff;"&gt;out&lt;/span&gt; classProxyCached);        &lt;br /&gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (classProxyCached == &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;)        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; classProxyCached = GenerateClassProxy&amp;lt;T&amp;gt;(entity);        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; table.Add(entity, classProxyCached);        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }        &lt;br /&gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; classProxyCached &lt;span style="color:#0000ff;"&gt;as&lt;/span&gt; T;        &lt;br /&gt;}&lt;/div&gt;   &lt;/div&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;And proxy generation method remains almost unchanged:&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;div style="border-bottom:#000080 1px solid;border-left:#000080 1px solid;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;color:#000;font-size:10pt;border-top:#000080 1px solid;border-right:#000080 1px solid;"&gt;     &lt;div style="padding-bottom:2px;background-color:#f0f0f0;padding-left:5px;padding-right:5px;max-height:500px;overflow:auto;padding-top:2px;"&gt;&lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; T GenerateClassProxy&amp;lt;T&amp;gt;(&lt;span style="color:#2b91af;"&gt;IAttributeExtendableEntity&lt;/span&gt; entity) &lt;span style="color:#0000ff;"&gt;where&lt;/span&gt; T : &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt;, &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt;()         &lt;br /&gt;{         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; interceptor = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;DefaultInterceptor&lt;/span&gt;&amp;lt;T&amp;gt;(entity);         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; options = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ProxyGenerationOptions&lt;/span&gt;(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ProxyGenerationHook&lt;/span&gt;());         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; proxy = gen.CreateClassProxy&amp;lt;T&amp;gt;(options, interceptor);         &lt;br /&gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; proxy;         &lt;br /&gt;}&lt;/div&gt;   &lt;/div&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;Let’s spilt them up into smaller pieces:&lt;/p&gt;    &lt;ol&gt;     &lt;li&gt;&lt;strong&gt;DefaultInterceptor&lt;/strong&gt; – this is the class that will contain the logic that will be called if client code will try to access something that we marked as interceptable in class &lt;strong&gt;ProxyGenerationHook&lt;/strong&gt; class. &lt;/li&gt;      &lt;li&gt;&lt;strong&gt;ProxyGenerationHook&lt;/strong&gt; – class that describes what is going to be intercepted and what should be passed to the underlying intercepted object. &lt;/li&gt;   &lt;/ol&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;Let’s look at hook class (it should implement &lt;font face="Courier New"&gt;‘IProxyGenerationHook’&lt;/font&gt; interface):&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;div style="border-bottom:#000080 1px solid;border-left:#000080 1px solid;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;color:#000;font-size:10pt;border-top:#000080 1px solid;border-right:#000080 1px solid;"&gt;     &lt;div style="padding-bottom:2px;background-color:#f0f0f0;padding-left:5px;padding-right:5px;max-height:500px;overflow:auto;padding-top:2px;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ProxyGenerationHook&lt;/span&gt; : &lt;span style="color:#2b91af;"&gt;IProxyGenerationHook&lt;/span&gt;         &lt;br /&gt;{         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; MethodsInspected()         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }         &lt;br /&gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; NonProxyableMemberNotification(&lt;span style="color:#2b91af;"&gt;Type&lt;/span&gt; type, &lt;span style="color:#2b91af;"&gt;MemberInfo&lt;/span&gt; memberInfo)         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#0000ff;"&gt;throw&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;InvalidOperationException&lt;/span&gt;(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;.Format(&lt;span style="color:#a31515;"&gt;&amp;quot;Property named &amp;#39;{&lt;/span&gt;&lt;span style="color:#3cb371;"&gt;0}&lt;/span&gt;&lt;span style="color:#a31515;"&gt;&amp;#39; for type &amp;#39;{&lt;/span&gt;&lt;span style="color:#3cb371;"&gt;1}&lt;/span&gt;&lt;span style="color:#a31515;"&gt;&amp;#39; is not marked as virtual.&amp;quot;&lt;/span&gt;,         &lt;br /&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; memberInfo.GetProperty().Name,         &lt;br /&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; type));         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }         &lt;br /&gt;        &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;bool&lt;/span&gt; ShouldInterceptMethod(&lt;span style="color:#2b91af;"&gt;Type&lt;/span&gt; type, &lt;span style="color:#2b91af;"&gt;MethodInfo&lt;/span&gt; methodInfo)         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#008000;"&gt;// we are interested only in properties for now&lt;/span&gt;         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; methodInfo.Name.StartsWith(&lt;span style="color:#a31515;"&gt;&amp;quot;get_&amp;quot;&lt;/span&gt;, &lt;span style="color:#2b91af;"&gt;StringComparison&lt;/span&gt;.Ordinal)         &lt;br /&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; || methodInfo.Name.StartsWith(&lt;span style="color:#a31515;"&gt;&amp;quot;set_&amp;quot;&lt;/span&gt;, &lt;span style="color:#2b91af;"&gt;StringComparison&lt;/span&gt;.Ordinal);         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }         &lt;br /&gt;}&lt;/div&gt;   &lt;/div&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;This hook is instructing Castle dynamic proxy generation engine that interceptor will intercept &lt;strong&gt;*only*&lt;/strong&gt; properties (setters and getters). Btw, properties are compiled into methods anyway. This particular hook logic of course can be modified and adjusted to meet precise requirements.&lt;/p&gt;    &lt;p&gt;Otherwise (method &lt;font face="Courier New"&gt;NonProxyableMemberNotification()&lt;/font&gt;) will be called if some of the metadata object members could not be intercepted. This is particular useful for error checking. &lt;strong&gt;NB! &lt;/strong&gt;What Castle actually does is that behind the scene another object is created that &lt;strong&gt;*inherits*&lt;/strong&gt; from our defined metadata object. Therefore members (in this case only properties) must be marked as virtual – because Castle tries to override those with its own logic. If that fails - &lt;font face="Courier New"&gt;NonProxyableMemberNotification()&lt;/font&gt; method is called.&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;Let’s look into &lt;font face="Courier New"&gt;DefaultInterceptor&lt;/font&gt; code (it must implement ‘&lt;font face="Courier New"&gt;IInterceptor&lt;/font&gt;’ interface):&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;div style="border-bottom:#000080 1px solid;border-left:#000080 1px solid;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;color:#000;font-size:10pt;border-top:#000080 1px solid;border-right:#000080 1px solid;"&gt;     &lt;div style="padding-bottom:2px;background-color:#f0f0f0;padding-left:5px;padding-right:5px;max-height:500px;overflow:auto;padding-top:2px;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;DefaultInterceptor&lt;/span&gt;&amp;lt;T&amp;gt; : &lt;span style="color:#2b91af;"&gt;IInterceptor&lt;/span&gt;         &lt;br /&gt;{         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; Intercept(&lt;span style="color:#2b91af;"&gt;IInvocation&lt;/span&gt; invocation)         &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/div&gt;   &lt;/div&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;It only has single method – &lt;font face="Courier New"&gt;Intercept()&lt;/font&gt;. The most interesting part of interception is parameter – &lt;font face="Courier New"&gt;invocation&lt;/font&gt;, that gives us lot of info about method client code is calling.&lt;/p&gt;    &lt;p&gt;Usually code within Intercept method starts with checking what kind of method client is calling, like:&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;div style="border-bottom:#000080 1px solid;border-left:#000080 1px solid;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;color:#000;font-size:10pt;border-top:#000080 1px solid;border-right:#000080 1px solid;"&gt;     &lt;div style="padding-bottom:2px;background-color:#f0f0f0;padding-left:5px;padding-right:5px;max-height:500px;overflow:auto;padding-top:2px;"&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (invocation.Method.Name.StartsWith(&lt;span style="color:#a31515;"&gt;&amp;quot;get_&amp;quot;&lt;/span&gt;, &lt;span style="color:#2b91af;"&gt;StringComparison&lt;/span&gt;.InvariantCultureIgnoreCase))         &lt;br /&gt;{&lt;/div&gt;   &lt;/div&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;or&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;div style="border-bottom:#000080 1px solid;border-left:#000080 1px solid;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;color:#000;font-size:10pt;border-top:#000080 1px solid;border-right:#000080 1px solid;"&gt;     &lt;div style="padding-bottom:2px;background-color:#f0f0f0;padding-left:5px;padding-right:5px;max-height:500px;overflow:auto;padding-top:2px;"&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (invocation.Method.Name.StartsWith(&lt;span style="color:#a31515;"&gt;&amp;quot;set_&amp;quot;&lt;/span&gt;, &lt;span style="color:#2b91af;"&gt;StringComparison&lt;/span&gt;.InvariantCultureIgnoreCase))         &lt;br /&gt;{&lt;/div&gt;   &lt;/div&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;Just to check either user is getting value from the property or setting value for the property.&lt;/p&gt;    &lt;p&gt;Actual interception code really depends on situation and requirements but usually some of the properties of &lt;font face="Courier New"&gt;IInvocation&lt;/font&gt; class are used:&lt;/p&gt;    &lt;ol&gt;     &lt;li&gt;&lt;font face="Courier New"&gt;invocation.Method&lt;/font&gt; – is the method that is going to be called. &lt;/li&gt;      &lt;li&gt;&lt;font face="Courier New"&gt;invocation.Arguments&lt;/font&gt; – is list of arguments passed the call of the method. &lt;/li&gt;      &lt;li&gt;&lt;font face="Courier New"&gt;invocation.ReturnValue &lt;/font&gt;– set the result of the interception. &lt;/li&gt;   &lt;/ol&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;Trick for interceptors – if you want to interrupt interception and return immediately to the caller – just return from the method. Otherwise you’ll need to call &lt;font face="Courier New"&gt;invocation.Proceed()&lt;/font&gt; method that will call next interception or ultimately will call target object’s method.&lt;/p&gt;    &lt;p&gt;And within the interception code you can convert called method (getter or setter for properties) into call to stringly-typed object (&lt;font face="Courier New"&gt;Substring(4)&lt;/font&gt; will remove ‘get_’ or ‘set_’ from the name of the called method):&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;div style="border-bottom:#000080 1px solid;border-left:#000080 1px solid;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;color:#000;font-size:10pt;border-top:#000080 1px solid;border-right:#000080 1px solid;"&gt;     &lt;div style="padding-bottom:2px;background-color:#f0f0f0;padding-left:5px;padding-right:5px;max-height:500px;overflow:auto;padding-top:2px;"&gt;Entity.SetAttributeValue(invocation.Method.Name.Substring(4), invocation.Arguments[0]);&lt;/div&gt;   &lt;/div&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;or for retrieving something and return that value to the caller’s code:&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;div style="border-bottom:#000080 1px solid;border-left:#000080 1px solid;font-family:&amp;#39;Courier New&amp;#39;, courier, monospace;color:#000;font-size:10pt;border-top:#000080 1px solid;border-right:#000080 1px solid;"&gt;     &lt;div style="padding-bottom:2px;background-color:#f0f0f0;padding-left:5px;padding-right:5px;max-height:500px;overflow:auto;padding-top:2px;"&gt;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; methodInfo = Entity.GetType().GetMethod(&lt;span style="color:#a31515;"&gt;&amp;quot;GetAttributeValue&amp;quot;&lt;/span&gt;);         &lt;br /&gt;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; genericMethod = methodInfo.MakeGenericMethod(invocation.Method.ReturnType);         &lt;br /&gt;invocation.ReturnValue = genericMethod.Invoke(Entity, &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;object&lt;/span&gt;[] { invocation.Method.Name.Substring(4) });&lt;/div&gt;   &lt;/div&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;Sequence diagram of final call stack could look something like this:&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&lt;a href="http://www.dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vi/image_5F00_5D58DBB0.png" rel="lightbox"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:block;float:none;border-top-width:0px;border-bottom-width:0px;margin-left:auto;border-left-width:0px;margin-right:auto;padding-top:0px;" title="image" border="0" alt="image" src="http://www.dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vi/image_5F00_thumb_5F00_1D22C236.png" width="827" height="752" /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;Sample project where Castle interceptors are used to provide strongly-typed access over EPiServer Relate+ entities can be found &lt;a href="https://github.com/Geta/opensource/tree/master/Geta.Community.EntityAttributeBuilder"&gt;&lt;strong&gt;there&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;Hope this helps!&lt;/p&gt; &lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnet.lv/aggbug.aspx?PostID=457871" width="1" height="1"&gt;</description><category domain="http://dotnet.lv/blogs/vi/archive/tags/Architecture/default.aspx">Architecture</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/Design/default.aspx">Design</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/Practices/default.aspx">Practices</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/Languages/default.aspx">Languages</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/Idioms/default.aspx">Idioms</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/C_2300_/default.aspx">C#</category></item><item><title>TPL (Task Parallel Library) prezentācijas source code.</title><link>http://dotnet.lv/blogs/vi/archive/2012/05/07/tpl-task-parallel-library-prezent-cijas-source-code.aspx</link><pubDate>Mon, 07 May 2012 19:54:36 GMT</pubDate><guid isPermaLink="false">245d81fd-b543-41d7-a051-d8603c6e9e31:399523</guid><dc:creator>valdis.iljuconoks</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnet.lv/blogs/vi/rsscomments.aspx?PostID=399523</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnet.lv/blogs/vi/commentapi.aspx?PostID=399523</wfw:comment><comments>http://dotnet.lv/blogs/vi/archive/2012/05/07/tpl-task-parallel-library-prezent-cijas-source-code.aspx#comments</comments><description>&lt;div id="post_content"&gt;   &lt;p&gt;Pēc Latvijas Universitātes auditorijas lūgumu izvietoju prezentācijas demo source code. Pieejams &lt;a href="https://skydrive.live.com/redir.aspx?cid=38746a08ebe72be7&amp;amp;resid=38746A08EBE72BE7!785&amp;amp;parid=38746A08EBE72BE7!521"&gt;&lt;strong&gt;šeit&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;    &lt;p&gt;Ja rodas kādi jautājumi, iebildumi vai filozofiskas pārdomas – noteikti gaidu jūsu feedback: valdis punkts iljuconoks at dotnet punkts lv.&lt;/p&gt;    &lt;p&gt;&lt;a href="http://www.dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vi/image_5F00_33C280F8.png" rel="lightbox"&gt;&lt;img style="background-image:none;border-right-width:0px;margin:20px;padding-left:0px;padding-right:0px;display:inline;float:right;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="" border="0" alt="" align="right" src="http://www.dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vi/image_5F00_thumb_5F00_738C677D.png" width="573" height="306" /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;Happy parallelisming!&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;   &lt;p&gt;&amp;#160;&lt;/p&gt;   &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnet.lv/aggbug.aspx?PostID=399523" width="1" height="1"&gt;</description><category domain="http://dotnet.lv/blogs/vi/archive/tags/Design/default.aspx">Design</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/Parallel+FX/default.aspx">Parallel FX</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/TPL/default.aspx">TPL</category></item><item><title>Schedule</title><link>http://dotnet.lv/blogs/vi/archive/2012/04/19/schedule.aspx</link><pubDate>Wed, 18 Apr 2012 21:09:00 GMT</pubDate><guid isPermaLink="false">245d81fd-b543-41d7-a051-d8603c6e9e31:355406</guid><dc:creator>valdis.iljuconoks</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnet.lv/blogs/vi/rsscomments.aspx?PostID=355406</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnet.lv/blogs/vi/commentapi.aspx?PostID=355406</wfw:comment><comments>http://dotnet.lv/blogs/vi/archive/2012/04/19/schedule.aspx#comments</comments><description>&lt;div id="post_content"&gt;
&lt;p&gt;Kā izrādās, tad aprīļa pa&amp;scaron;as beigas un maija mēnesis izvērties par diezgan aizņemtu laika posmu. Katrā ziņā, var noķert mani kaut kur tur&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img height="352" width="469" src="http://i.i.com.com/cnwk.1d/i/tim/2010/10/13/businessman-running-4x3_540x405.jpg" align="right" border="0" style="background-image:none;border-right-width:0px;margin:20px;padding-left:0px;padding-right:0px;display:inline;float:right;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span style="font-size:large;"&gt;Aprīlis 2012:&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span style="font-size:medium;"&gt;2012.04.26&lt;/span&gt;: Transporta un Sakaru Institūts:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;18:15 &amp;ndash; 19:15 &amp;ldquo;MSF &amp;amp; Agile&amp;rdquo; &lt;/p&gt;
&lt;p&gt;19:15 &amp;ndash; 19:45 &amp;ldquo;TFS 2012 Overview (Dev &amp;lsquo;11)&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span style="font-size:large;"&gt;Maijs 2012:&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span style="font-size:medium;"&gt;2012.05.07&lt;/span&gt;: Latvijas Universitāte:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;18:15&lt;/strong&gt; &amp;ndash; 19:15 &amp;ldquo;Parallel Computing in Visual Studio 2010&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span style="font-size:medium;"&gt;2012.05.08&lt;/span&gt;: Vidzemes Augstskola:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;10:00&lt;/strong&gt; &amp;ndash; 10:55 &amp;ldquo;Asp.Net MVC&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;11:00&lt;/strong&gt; &amp;ndash; 11:55 &amp;ldquo;Funkcionālā programmē&amp;scaron;ana - F#&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;12:00&lt;/strong&gt; &amp;ndash; 12:55 &amp;ldquo;Visual Studio 2012 - What&amp;#39;s new?&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;13:00&lt;/strong&gt; &amp;ndash; 13:55 &amp;ldquo;Requirements Management in TFS&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span style="font-size:medium;"&gt;2012.05.14&lt;/span&gt;: Latvijas Universitāte:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;18:15&lt;/strong&gt; &amp;ndash; 19:15 &amp;ldquo;Funkcionālā programmē&amp;scaron;ana - F#&amp;ldquo;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span style="font-size:medium;"&gt;2012.05.17&lt;/span&gt;: Ventspils Augstskola:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;11:00&lt;/strong&gt; &amp;ndash; 11:45 &amp;ldquo;Designing Software Architecture in VS 2010&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;12:45&lt;/strong&gt; &amp;ndash; 13:30 &amp;ldquo;C# 3.0 &amp;amp; C# 4.0&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;13:40&lt;/strong&gt; &amp;ndash; 14:25 &amp;ldquo;MSF &amp;amp; Agile&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;14:35&lt;/strong&gt; &amp;ndash; 15:20 &amp;ldquo;Requirements Management in TFS&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span style="font-size:medium;"&gt;2012.05.21&lt;/span&gt;: Latvijas Universitāte:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;18:15&lt;/strong&gt; &amp;ndash; 19:15 &amp;ldquo;C# 5.0 &amp;ndash; async&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span style="font-size:medium;"&gt;2012.05.28&lt;/span&gt;: Latvijas Universitāte:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;18:15&lt;/strong&gt; &amp;ndash; 19:15 &amp;ldquo;Ievads jQuery&amp;ldquo;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Cerams, ka noderēs!&lt;/p&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnet.lv/aggbug.aspx?PostID=355406" width="1" height="1"&gt;</description><category domain="http://dotnet.lv/blogs/vi/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/Tfs/default.aspx">Tfs</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/Other/default.aspx">Other</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/Architecture/default.aspx">Architecture</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/Design/default.aspx">Design</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/Parallel+FX/default.aspx">Parallel FX</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/F_2300_/default.aspx">F#</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/TFS+11/default.aspx">TFS 11</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/Visual+Studio+Dev+11/default.aspx">Visual Studio Dev 11</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/Visual+Studio+2012/default.aspx">Visual Studio 2012</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/jQuery/default.aspx">jQuery</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/Agile/default.aspx">Agile</category></item><item><title>Divi vienādi “Jāņi”</title><link>http://dotnet.lv/blogs/vi/archive/2011/09/12/divi-vien-di-j-i.aspx</link><pubDate>Mon, 12 Sep 2011 20:48:00 GMT</pubDate><guid isPermaLink="false">245d81fd-b543-41d7-a051-d8603c6e9e31:218056</guid><dc:creator>valdis.iljuconoks</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnet.lv/blogs/vi/rsscomments.aspx?PostID=218056</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnet.lv/blogs/vi/commentapi.aspx?PostID=218056</wfw:comment><comments>http://dotnet.lv/blogs/vi/archive/2011/09/12/divi-vien-di-j-i.aspx#comments</comments><description>&lt;div id="post_content"&gt;
&lt;p&gt;Hash kods ir interesanta padarī&amp;scaron;ana un parasti &amp;scaron;o metodi izmanto, lai aprēķinātu objekta hash kodu kādā no hash funkcijas balstītām datu struktūrām, piemēram, HashSet&amp;lt;T&amp;gt; vai Dictionary&amp;lt;K, V&amp;gt; vai tam līdzīgās struktūrās. Hash kods &amp;scaron;ajās datu struktūrās tiek izmantots, lai optimizētu meklē&amp;scaron;anas operāciju.&lt;/p&gt;
&lt;p&gt;However ar hash kodiem jābūt uzmanīgiem.&lt;/p&gt;
&lt;p&gt;Parasti kā rāda pieredze viens no code-smells ir struktūru (&lt;span style="font-family:&amp;#39;Courier New&amp;#39;;"&gt;struct&lt;/span&gt;) pielieto&amp;scaron;ana. Viss ir labi, bet ir jāsaprot tās side-effekti neskatoties uz to performances (struktūras parasti glabājas tur par stekā pretstatā references tipiem, kuri atrodas heap&amp;rsquo;ā) un kind-of maintainability (struktūras parasti pēc definīcijas ir immutable) benefitiem.&lt;/p&gt;
&lt;p&gt;Anyway, pieņemsim, ka ir sekojo&amp;scaron;a klase, kas implementēta kā struktūra:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style="border-bottom:1px dashed;border-left:1px dashed;padding-bottom:3px;padding-left:3px;padding-right:3px;font-family:courier new;background:#efefef;color:black;font-size:9pt;border-top:1px dashed;border-right:1px dashed;padding-top:3px;"&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;struct&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Client&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;{&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt; Name;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt; Surname;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt; Code;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;DateTime&lt;/span&gt; BirthDate;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Pieņemsim, ka ir definētas pilnīgi dažādas klienta entity instances:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style="border-bottom:1px dashed;border-left:1px dashed;padding-bottom:3px;padding-left:3px;padding-right:3px;font-family:courier new;background:#efefef;color:black;font-size:9pt;border-top:1px dashed;border-right:1px dashed;padding-top:3px;"&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;var&lt;/span&gt; client = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Client&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Name = &lt;span style="color:#a31515;"&gt;&amp;quot;Janis&amp;quot;&lt;/span&gt;,&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Surname = &lt;span style="color:#a31515;"&gt;&amp;quot;Berzins&amp;quot;&lt;/span&gt;,&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BirthDate = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;DateTime&lt;/span&gt;(1999, 1, 1),&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Code = &lt;span style="color:#a31515;"&gt;&amp;quot;1234567890&amp;quot;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; };&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;var&lt;/span&gt; client2 = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Client&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Name = &lt;span style="color:#a31515;"&gt;&amp;quot;Janis&amp;quot;&lt;/span&gt;,&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Surname = &lt;span style="color:#a31515;"&gt;&amp;quot;Kalnins&amp;quot;&lt;/span&gt;,&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BirthDate = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;DateTime&lt;/span&gt;(1978, 4, 1),&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Code = &lt;span style="color:#a31515;"&gt;&amp;quot;0987654321&amp;quot;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; };&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Pārbaudām hash kodu &amp;scaron;ī abām instancēm:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style="border-bottom:1px dashed;border-left:1px dashed;padding-bottom:3px;padding-left:3px;padding-right:3px;font-family:courier new;background:#efefef;color:black;font-size:9pt;border-top:1px dashed;border-right:1px dashed;padding-top:3px;"&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine(client.GetHashCode().ToString());&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;.WriteLine(client2.GetHashCode().ToString());&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Iznākums nav diez ko iepriecino&amp;scaron;s :)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img height="339" width="545" src="http://www.dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vi/image_5F00_2AF179AE.png" alt="image" border="0" title="image" style="background-image:none;border-right-width:0px;margin:0px auto;padding-left:0px;padding-right:0px;display:block;float:none;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Hash kodam ir jāapmierina pavisam tikai 3 noteikumi:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Ja divi objekti ir vienādi (== operators), tad tiem ir jāģenerē vienādi hash kodi. Pretējā gadījumā hash kods nevar tikt izmantots, lai tos meklētu dažādās datu kopās. &lt;/li&gt;
&lt;li&gt;X.GetHashCode() objektam X ir jābūt neatkarīgam no instances stāvokļa. Tas nozīmē, ka pēc X objekta izveides neskatoties kādas tik metodes nav izsauktas, objektam ir jāatgriež viens un tas pats hash kods. Tas arī nodro&amp;scaron;ina, ka objekts vienmēr tiek ievietots pareizajā vietā (bucket). &lt;/li&gt;
&lt;li&gt;Hash kodam jāģenerējas izmantojot visu pieejamo integer spektru. &amp;Scaron;āda veida algoritms nodro&amp;scaron;ina pietiekamu datu struktūras optimizē&amp;scaron;anu. &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Kas patiesībā notiek abu &amp;ldquo;Jāņu&amp;rdquo; hash koda ģenerācijas laikā var izlasīt Microsoft .Net Framework source koda anotācijā (reāls izvilkums no platformas source code):&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre&gt;&lt;span style="color:#008040;font-family:courier new;font-size:9pt;"&gt;/*=================================GetHashCode==================================
**Action: Our algorithm for returning the hashcode is a little bit complex.&amp;nbsp; We look
**&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for the first non-static field and get it&amp;#39;s hashcode.&amp;nbsp; If the type has no
**&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; non-static fields, we return the hashcode of the type.&amp;nbsp; We can&amp;#39;t take the
**&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; hashcode of a static member because if that member is of the same type as
**&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; the original type, we&amp;#39;ll end up in an infinite loop.
**Returns: The hashcode for the type.
**Arguments: None.
**Exceptions: None.
==============================================================================*/&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Tātad patiesībā hash koda ģenerācija &amp;ldquo;Jāņu&amp;rdquo; gadījumā notiek pēc pirmā non-static lauka &amp;scaron;ajā struktūrā &amp;ndash; &lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:9pt;"&gt;Name&lt;/span&gt;. Savukārt &amp;scaron;is uzstādījums apgalvo, ka visiem &amp;ldquo;Jāņiem&amp;rdquo; būs vienāds hash kods, kas arī apliecinās dzīvē.&lt;/p&gt;
&lt;p&gt;Kā jau visam &amp;scaron;ajā pasaulē cilvēks ir atradis skaidrojumu, tā arī &amp;scaron;ai Microsoft platformas parādībai. Platformas dizaineri ir System.ValueType objektā ieguldīju&amp;scaron;i visas zinā&amp;scaron;anas, kas viņiem bija un ir, lai uzģenerētu hash kodu tipam, par kuru viņiem nebija ne mazākās nojausmas.&lt;/p&gt;
&lt;p&gt;Ja jūsu definētais tips nepiedalās nekādās datu struktūrās, kur nepiecie&amp;scaron;ams definēt atslēgas, tad hash koda ģenerācija parasti nav nepiecie&amp;scaron;ama vispār. Hash koda ģenerācijas pārrakstī&amp;scaron;ana retāk ir nepiecie&amp;scaron;ama references tipa objektiem, kur hash koda ģenerācijai tiek izmantots iek&amp;scaron;ējais objekta instances identifikators.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Cerams, ka noderēs!&lt;/p&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnet.lv/aggbug.aspx?PostID=218056" width="1" height="1"&gt;</description><category domain="http://dotnet.lv/blogs/vi/archive/tags/Design/default.aspx">Design</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/Languages/default.aspx">Languages</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/Idioms/default.aspx">Idioms</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/C_2300_/default.aspx">C#</category></item><item><title>“Konstantīns” mēdz būt tricky</title><link>http://dotnet.lv/blogs/vi/archive/2011/08/20/konstant-ns-m-dz-b-t-tricky.aspx</link><pubDate>Sat, 20 Aug 2011 20:53:00 GMT</pubDate><guid isPermaLink="false">245d81fd-b543-41d7-a051-d8603c6e9e31:201904</guid><dc:creator>valdis.iljuconoks</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnet.lv/blogs/vi/rsscomments.aspx?PostID=201904</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnet.lv/blogs/vi/commentapi.aspx?PostID=201904</wfw:comment><comments>http://dotnet.lv/blogs/vi/archive/2011/08/20/konstant-ns-m-dz-b-t-tricky.aspx#comments</comments><description>&lt;div id="post_content"&gt;
&lt;p&gt;Kā jau mēs visi zinām, labā prakse ir visādas konstantes, nemainīgas vērtības un citu lietderīgu informāciju sistēmās definēt vienreiz un izmantot atkārtoti. Tomēr daudzās vietās mēs redzam apmēram &amp;scaron;ādu kodu:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style="border-bottom:1px dashed;border-left:1px dashed;padding-bottom:3px;padding-left:3px;padding-right:3px;font-family:courier new;background:#efefef;color:black;font-size:9pt;border-top:1px dashed;border-right:1px dashed;padding-top:3px;"&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="color:gray;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt; &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="color:gray;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt; Service for policy related operations.&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="color:gray;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt; &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;[ServiceBehavior(Namespace = &lt;span style="color:#000000;"&gt;&lt;span style="color:#c0504d;"&gt;&amp;ldquo;http://service-provider.com/project/service/&amp;rdquo;&lt;/span&gt;)]&lt;/span&gt;&lt;/pre&gt;
&lt;pre 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;PolicyService&lt;/span&gt; : IPolicyService&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;{&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;vai arī teiksim kaut kādu aptuveni &amp;scaron;ādu koda fragmentu:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style="border-bottom:1px dashed;border-left:1px dashed;padding-bottom:3px;padding-left:3px;padding-right:3px;font-family:courier new;background:#efefef;color:black;font-size:9pt;border-top:1px dashed;border-right:1px dashed;padding-top:3px;"&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;if&lt;/span&gt; (customer.Age &amp;gt; 78)&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;{&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; RaiseError(&lt;span style="color:#a31515;"&gt;&amp;quot;MaximumCustomerAge&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Trūkums &amp;scaron;ādai konstantes &amp;ldquo;ie&amp;scaron;ū&amp;scaron;anai&amp;rdquo; kodā ir izmaiņu process. Nekad nevar zināt, kurās vietās un kādos nosacījumos tiek pielietotas &amp;scaron;īs maģiskās vērtības. &amp;Scaron;ādu vērtība nomaiņa dažreiz prasa full-text search, ir nestabila un negarantē viennozīmīgus rezultātus &amp;ndash; ka visās vietās, kodā maģiskā vērtība ir nomainīta sekmīgi.&lt;/p&gt;
&lt;p&gt;&amp;Scaron;īs problēmas risinājums ir izmantot konstantes. Galvenais ieguvums &amp;scaron;ādai pieejai, protams, ir izmaiņu lokalizācija un sava veida garantija, ka veicot izmaiņas tikai konstantes vērtībā, tā tiek ņemta vērā visās sistēmas sadaļās, kur tā tiek pielietota.&lt;/p&gt;
&lt;p&gt;Bet&amp;hellip; &amp;scaron;eit ir viens catch&amp;hellip;&lt;/p&gt;
&lt;p&gt;.Net platformā eksistē divu veidu konstantes:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Kompilācijas&lt;/strong&gt; laika konstantes. &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Runtime&lt;/strong&gt; laika konstantes. &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Kompilācijas laika konstantes tiek definētas ar keyword &lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#0000ff;font-size:x-small;"&gt;const&lt;/span&gt; un tiek izmantotas kompilācijas laikā. Savukārt, runtime konstantes tiek definētas ar keyword &lt;span style="font-family:&amp;#39;Courier New&amp;#39;;color:#0000ff;font-size:x-small;"&gt;readonly&lt;/span&gt;, tās tiek inicializētas klases konstruktora laikā un tās nav iespējams mainīt pēc klases uzkonstruē&amp;scaron;anas jeb instances izveido&amp;scaron;anas.&lt;/p&gt;
&lt;p&gt;Galvenais catch konstantes pielieto&amp;scaron;anā ir kompilācijas laika konstantes nepareiza pielieto&amp;scaron;ana. Kompilācijas laika konstantes vērtība performances nolūkos tiek ievietota izsaukuma vietā. Savukārt runtime laika konstantes tiek inicializētas klases konstruktora laikā un vietas, kurās tā tiek izmantota, uztur referenci uz &amp;scaron;o vērtību.&lt;/p&gt;
&lt;p&gt;Piemēram, augstāk redzamo koda fragmentu, kas pārbauda klienta vecumu aizvietosim ar kompilācijas laika konstanti:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style="border-bottom:1px dashed;border-left:1px dashed;padding-bottom:3px;padding-left:3px;padding-right:3px;font-family:courier new;background:#efefef;color:black;font-size:9pt;border-top:1px dashed;border-right:1px dashed;padding-top:3px;"&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:blue;"&gt;const&lt;/span&gt; &lt;span style="color:blue;"&gt;int&lt;/span&gt; MaxAge = 78;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; Main(&lt;span style="color:blue;"&gt;string&lt;/span&gt;[] args)&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;{&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;var&lt;/span&gt; customer = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Customer&lt;/span&gt; { Age = 55 };&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;if&lt;/span&gt; (customer.Age &amp;gt; MaxAge)&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RaiseError(&lt;span style="color:#a31515;"&gt;&amp;quot;MaximumCustomerAge&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Aplūkojot kompilēto kodu redzams, ka if() pārbaudē nav vairs reference uz MaxAge mainīgo, bet ir jau iekompilēta konkrēta vērtība &amp;ndash; 78.&lt;/p&gt;
&lt;p&gt;IL:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style="border-bottom:1px dashed;border-left:1px dashed;padding-bottom:3px;padding-left:3px;padding-right:3px;font-family:courier new;background:#efefef;color:black;font-size:9pt;border-top:1px dashed;border-right:1px dashed;padding-top:3px;"&gt;L_0018: &lt;a&gt;ldc.i4.s&lt;/a&gt; 0x4e&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Dekompilēts C#:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style="border-bottom:1px dashed;border-left:1px dashed;padding-bottom:3px;padding-left:3px;padding-right:3px;font-family:courier new;background:#efefef;color:black;font-size:9pt;border-top:1px dashed;border-right:1px dashed;padding-top:3px;"&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (customer.Age &amp;gt; &lt;span style="color:#c0504d;"&gt;0x4e&lt;/span&gt;) 
  &lt;br /&gt;{ 
  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; RaiseError(&lt;span style="color:#c0504d;"&gt;&amp;quot;MaximumCustomerAge&amp;quot;&lt;/span&gt;); 
  &lt;br /&gt;}&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Savukārt pārveidojot kompilācijas laika konstanti par runtime laika konstanti:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style="border-bottom:1px dashed;border-left:1px dashed;padding-bottom:3px;padding-left:3px;padding-right:3px;font-family:courier new;background:#efefef;color:black;font-size:9pt;border-top:1px dashed;border-right:1px dashed;padding-top:3px;"&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; &lt;span style="color:blue;"&gt;&lt;span style="text-decoration:line-through;"&gt;const&lt;/span&gt;&lt;/span&gt; &lt;span style="color:blue;"&gt;readonly&lt;/span&gt; &lt;span style="color:blue;"&gt;int&lt;/span&gt; MaxAge = 78;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; Main(&lt;span style="color:blue;"&gt;string&lt;/span&gt;[] args)&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;{&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;var&lt;/span&gt; customer = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Customer&lt;/span&gt; { Age = 55 };&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;if&lt;/span&gt; (customer.Age &amp;gt; MaxAge)&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RaiseError(&lt;span style="color:#a31515;"&gt;&amp;quot;MaximumCustomerAge&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Redzams, ka kompilators liek referenci uz mainīgo nevis tā vērtību:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style="border-bottom:1px dashed;border-left:1px dashed;padding-bottom:3px;padding-left:3px;padding-right:3px;font-family:courier new;background:#efefef;color:black;font-size:9pt;border-top:1px dashed;border-right:1px dashed;padding-top:3px;"&gt;L_0018: &lt;a&gt;ldsfld&lt;/a&gt; &lt;a&gt;int32&lt;/a&gt; &lt;a&gt;ConstantsDemo.Program&lt;/a&gt;::MaxAge&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Kāds tad varētu būt potenciālais risks kompilācijas laika konstantes pielietojumos?&lt;/p&gt;
&lt;p&gt;Patiesībā interesantākās problēmas sākas software patch un citu ielāpu deployment un smoke testing laikā, kad atklājas, ka vecās bibliotēkas, kuras tomēr izmantoja konstantes no moduļa, kas atjaunots kopā ar patch, nez kāpēc izmanto vēl vecās konstantes vērtības un par nelaimi vēl piedalās kaut kādos matemātiskos vai finansiālos aprēķinos.&lt;/p&gt;
&lt;p&gt;Iemesls kāpēc varētu vajadzēt izmantot kompilācijas laika konstantes nevis runtime laika konstantes &amp;ndash; ir to pielietojums atribūtu izmanto&amp;scaron;anā. Diemžēl jeb par laimi atribūti var saturēt tikai kompilācijas laikā zināmas konstantes, kā atribūtu īpa&amp;scaron;ību vērtības.&lt;/p&gt;
&lt;p&gt;Nav iespējams dekorēt target site ar atribūtu, kur&amp;scaron; definēts izmantojot runtime laika konstanti (notiks kompilatora kļūda &amp;ndash; &amp;ldquo;An attribute argument must be a constant expression, typeof expression or array creation expression of an attribute parameter type&amp;rdquo;):&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style="border-bottom:1px dashed;border-left:1px dashed;padding-bottom:3px;padding-left:3px;padding-right:3px;font-family:courier new;background:#efefef;color:black;font-size:9pt;border-top:1px dashed;border-right:1px dashed;padding-top:3px;"&gt;
&lt;pre style="margin:0px;"&gt;[&lt;span style="color:#2b91af;"&gt;CustomAttribute&lt;/span&gt;(ThisIsMagicString)]&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;internal&lt;/span&gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Program&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;{&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:blue;"&gt;static&lt;/span&gt; &lt;span style="color:blue;"&gt;readonly&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt; ThisIsMagicString = &lt;span style="color:#a31515;"&gt;&amp;quot;magic-string&amp;quot;&lt;/span&gt;;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Pēdējā laikā secinājām, ka konstantes ĻOTI ērti ir definēt WCF servera servisa pusē, regulējot visu servisu root vārdu telpu:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style="border-bottom:1px dashed;border-left:1px dashed;padding-bottom:3px;padding-left:3px;padding-right:3px;font-family:courier new;background:#efefef;color:black;font-size:9pt;border-top:1px dashed;border-right:1px dashed;padding-top:3px;"&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="color:gray;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt; &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="color:gray;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt; Service for policy related operations.&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="color:gray;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt; &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;[ServiceBehavior(Namespace = Constants.Root&lt;span style="color:#000000;"&gt;Namespace + &lt;span style="color:#c0504d;"&gt;&amp;ldquo;/PolicyService&amp;rdquo;&lt;/span&gt;)]&lt;/span&gt;&lt;/pre&gt;
&lt;pre 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;PolicyService&lt;/span&gt; : IPolicyService&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;{&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Abiem konstantes veidiem ir savi pielietojumi, tikai jāzina side-effekti katram no tiem.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Cerams, ka noderēs!&lt;/p&gt;
&lt;p&gt;Happy coding&amp;hellip;&lt;/p&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnet.lv/aggbug.aspx?PostID=201904" width="1" height="1"&gt;</description><category domain="http://dotnet.lv/blogs/vi/archive/tags/Design/default.aspx">Design</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/Languages/default.aspx">Languages</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/Idioms/default.aspx">Idioms</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/C_2300_/default.aspx">C#</category></item><item><title>Code review classics</title><link>http://dotnet.lv/blogs/vi/archive/2011/08/14/code-review-classics.aspx</link><pubDate>Sat, 13 Aug 2011 21:09:49 GMT</pubDate><guid isPermaLink="false">245d81fd-b543-41d7-a051-d8603c6e9e31:192272</guid><dc:creator>valdis.iljuconoks</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnet.lv/blogs/vi/rsscomments.aspx?PostID=192272</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnet.lv/blogs/vi/commentapi.aspx?PostID=192272</wfw:comment><comments>http://dotnet.lv/blogs/vi/archive/2011/08/14/code-review-classics.aspx#comments</comments><description>&lt;div id="post_content"&gt;   &lt;p&gt;Ir pagājis jau krietns laiciņš kopš veicu code-review laiku pa laikam. Sākumā bija doma pierakstīt katru atrasto lietu un apskatīt to sīkāk, bet ar laiku entuziasms noplaka nedaudz, bet nu gala rezultātā esmu tomēr apkopojis septiņas visizplatītākās kļūdas vai nianses, kas atkārtojas no code-review uz code-review.&lt;/p&gt;    &lt;p&gt;Lielākā daļa ir neatkarīgi no cilvēkiem, projektiem un pat tehnoloģijām, kuras pielieto kādā konkrētajā projektā vai sistēmā. Šeit ir saraksts ir izplatītākajām issues, kas tik atrastas kārtējā code review procesā:&lt;/p&gt;    &lt;ol&gt;     &lt;li&gt;Naming convention &lt;/li&gt;      &lt;li&gt;Unused namespaces &lt;/li&gt;      &lt;li&gt;this qualifier &lt;/li&gt;      &lt;li&gt;StyleCop un FxCop violations &lt;/li&gt;      &lt;li&gt;Complex conditional statements &lt;/li&gt;      &lt;li&gt;File name does not match type name &lt;/li&gt;      &lt;li&gt;Unused local scope variables &lt;/li&gt;   &lt;/ol&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;Naming convention&lt;/strong&gt;. Šis ir viens no visizplatītākajiem pārkāpumiem vai issues, kas tiek atrasts kārtējā izejas koda pārskata procedūrā. Lai arī kāda būtu konkrētā projekta norunātā naming konvencija, tā vienmēr tiek pārkāpta. Vai nu tie ir nepareizi izvēlēti klases nosaukumi (piemēram, ir projekti, kas mēģina izvairīties no “*Manager.cs” vai “*Manager.vb” failiem, kas savukārt var norādīt uz &lt;a href="http://dotnet.lv/blogs/vi/archive/2010/10/31/odien-pirmais-no-s-o-l-i-d-grupas-quot-s-quot.aspx"&gt;SRP&lt;/a&gt; principa pārkāpumu).&lt;/p&gt;    &lt;p&gt;Nav nozīmes, kurā līmenī ir pārkāpums: vai tas tiek darīts kodā, vai HTML’ā vai pat datubāzē. Jebkura pārkāpuma detektēšanai ir nepieciešams ieviest kādus automātiskos rīkus un paņēmienus. Pāris idejas:&lt;/p&gt;    &lt;ol&gt;     &lt;li&gt;Koda re-formatēšanas operācija notiek katru nakti – būvējuma laikā. Tādā veidā izstrādātājiem nav iespējas veikt tīšu/netīšu nosacījumu un norunu pārkāpumu. Tās visas tiek “salabotas” būvējuma laikā. &lt;/li&gt;      &lt;li&gt;Izmantot kādu koda analīzes rīku, kas meklē naming convetion pārkāpumus (piemēram, FxCop var pastāstīt, ka projektā nav pieņemts, ka metodes nosaukumus satur apakšvītru simbolu “_”). &lt;/li&gt;      &lt;li&gt;Interesants piegājiens bija &lt;a href="http://dotnet.lv/blogs/ia/default.aspx"&gt;vienam&lt;/a&gt; no maniem kolēģiem. Datu bāzes objektu naming convention () pārbaude notiek ar speciālu šim nolūkam izveidot vaicājumu, kas apstaigā SQL servera sistēmas viewus un tabulas un apskatās vai, piemēram, visi primary atslēgas objekti sākas ar “Pk_” simbolu virkni. Ja kāds no noteikumiem tiek pārkāpts šo vaicājumi ātri var iedarbināt būvējuma laikā un jebkurš pārkāpums tiks fiksēts ar būvējumu, kas izgāžas. &lt;/li&gt;   &lt;/ol&gt;    &lt;p&gt;     &lt;br /&gt;&lt;strong&gt;Unused namespaces&lt;/strong&gt;. It kā jau nekas traģisks un kādu nenormālo impaktu tas nerada, bet tomēr šķiet ka te kaut kas nav īsti pareizi un pārskatāmi.&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&lt;img style="background-image:none;border-right-width:0px;margin:0px auto;padding-left:0px;padding-right:0px;display:block;float:none;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://www.dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vi/image_5F00_7720C6CB.png" width="429" height="217" /&gt;&lt;/p&gt;    &lt;p&gt;     &lt;br /&gt;&lt;strong&gt;this qualifier&lt;/strong&gt;. Arī šis pārkāpums īsti neko ļaunu nenodara, bet ļoti bieži kodā ir redzams, ka “this.” tiek over-pielietots. tas nozīmē, ka jebkurā vietā klases pirmkodā, kur notiek griešanās pie&amp;#160; pašreizējās klases vērtībām, mainīgajiem vai kādiem citiem klases slotiem, izsaukums tiek&amp;#160; uzsākts ar “this.”. Viss ir forši un uzreiz pēc punkta “.” parādās IntelliSense ar visām iespējamajām kombinācijām un izvēlēm pašreizējās klases kontekstā, bet IntelliSense izvēlnei var izmantot arī citus paņēmienus.&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;StyleCop un FxCop violations&lt;/strong&gt;. Tas protams ir atkarīgs no projekta, bet ir projekti, kuros mēģina ievērot gan StyleCop, gan arī Code Analysis (a.k.a FxCop) ietikumus un nosacījumus. Ļoti bieži saskaros ar problēmu, ka code-review laikā daudzi no ieteikumiem tiek pārkāpti. Izrādās, ka šie noteikumi ir tikai uz papīra un to ievērošana ir tikai formāls pasākums. Lai tā nebūtu, ieteicams šos noteikumus “ieforsēt” jeb padarīt neiespējamu tos pārkāpt. Viens no klasiskajiem variantiem ir ieslēgt TFS checkin politikas, ja tiek izmantots Team Foundation Server platforma, kur uzglabāt izejas kodu sistēmai vai projektam. Otrs variants ir vēl visas Code Analysis pārbaudes pārslēgt uz “Error” režīmu, kas kļūst par būvējuma grāvējiem situācijās, kad kāds ir pārkāpis šos noteikumus. Ļoti palīdz :)      &lt;br /&gt;&lt;/p&gt;   &lt;strong&gt;&lt;/strong&gt;    &lt;p&gt;&lt;strong&gt;Complex conditional statements&lt;/strong&gt;. Šis bija viens no &lt;a href="http://www.planetgeek.ch/wp-content/uploads/2011/02/Clean-Code-Cheat-Sheet-V1.3.pdf"&gt;Clean Code Cheat Sheet&lt;/a&gt; norādījumiem, kas parāda, ka visticamāk šis nosacījums, kas ietverts “if” statement iekavās nav pārāk saprotams un uztverams, kur nu vēl modificējams vai refaktorējams bez kļūdām.&lt;/p&gt;    &lt;p&gt;Šāda veida issues viens no variantiem, ka varētu noķert ar koda metrikām, bet visātrāk tos ievērot un salabot laikam jau ir manuālajos code-review procesos.     &lt;br /&gt;&lt;/p&gt;    &lt;div style="border-bottom:1px dashed;border-left:1px dashed;padding-bottom:3px;padding-left:3px;padding-right:3px;font-family:courier new;background:#efefef;color:black;font-size:9pt;border-top:1px dashed;border-right:1px dashed;padding-top:3px;"&gt;     &lt;pre style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;if&lt;/span&gt; (&lt;span style="color:red;"&gt;&lt;font color="#000000"&gt;parameter&lt;/font&gt;&lt;/span&gt;.Count &amp;gt; 0 &amp;amp;&amp;amp; &lt;span style="color:red;"&gt;&lt;font color="#000000"&gt;Client&lt;/font&gt;&lt;/span&gt;.MustApply &amp;amp;&amp;amp;&lt;/pre&gt;

    &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; (&lt;span style="color:red;"&gt;&lt;font color="#000000"&gt;Client&lt;/font&gt;&lt;/span&gt;.Gender == &lt;span style="color:red;"&gt;&lt;font color="#008080"&gt;HumanGender&lt;/font&gt;&lt;/span&gt;.Male || &lt;span style="color:red;"&gt;&lt;font color="#000000"&gt;Client&lt;/font&gt;&lt;/span&gt;.Age &amp;gt; 50) &amp;amp;&amp;amp; &lt;/pre&gt;

    &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; ((&lt;span style="color:red;"&gt;&lt;font color="#000000"&gt;selectedProgram&lt;/font&gt;&lt;/span&gt;.Id == 45 &amp;amp;&amp;amp; &lt;span style="color:red;"&gt;&lt;font color="#000000"&gt;chosedRisk&lt;/font&gt;&lt;/span&gt;.Id == 1945) || &lt;span style="color:red;"&gt;&lt;font color="#000000"&gt;IsFreeProgram&lt;/font&gt;&lt;/span&gt;.Checked))&lt;/pre&gt;

    &lt;pre style="margin:0px;"&gt;{&lt;/pre&gt;

    &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:green;"&gt;// do some magic...&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="margin:0px;"&gt;}&lt;/pre&gt;
  &lt;/div&gt;

  &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;

  &lt;p&gt;&lt;strong&gt;File name does not match type name&lt;/strong&gt;. Arī nav baigās problēmas dēļ šī, bet ļoti izplatība problēma. Zināmas grūtības varētu rasties, kad sistēmas izejas kods tiek pētīts un analizēts bez VS object browser vai kādu citu sakarīgu programmu, kas skatās uz loģisko sistēmas saturu nevis fizisko. Piemēram, bieži rodas situācijas, kad ražošanas vides serverī, kuram pieeja iedota tikai uz 30 minūtēm, jo redziet kāds sistēmas administrators iedomājies, ka vairāk laika programmatūras piegādātājiem reāli kritiskā situācijās problēmas risinājumam vairāk laika nebūs nepieciešams, ir jāpārlūko failu sistēmas saturs un tikai vadoties pēc failu nosaukumiem ir jāsaprot kurā klasē ir jāveic izmaiņas. Pēc tam var izrādīties, ka klase izejas kodā nav tāda pati, kāds bijis faila nosaukums, kas bijis cēlos kādai problēmai.&lt;/p&gt;

  &lt;p&gt;Šīs problēmas risinājums pieejams vienā no VS papildinājumiem – Resharper:&lt;/p&gt;

  &lt;p&gt;&amp;#160;&lt;/p&gt;

  &lt;p&gt;&lt;img style="background-image:none;border-bottom:0px;border-left:0px;margin:0px auto;padding-left:0px;padding-right:0px;display:block;float:none;border-top:0px;border-right:0px;padding-top:0px;" title="image" border="0" alt="image" src="http://www.dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vi/image_5F00_16CFA094.png" width="363" height="149" /&gt;&lt;/p&gt;

  &lt;p&gt;&amp;#160;&lt;/p&gt;

  &lt;p&gt;
    &lt;br /&gt;&lt;strong&gt;Unused local scope variables&lt;/strong&gt;. Šis arī neko ļaunu pārāk nevar nodarīt klasiskajās situācijās, kad klase satur pa kādam liekam mainīgajam. Problēmas varētu sākties situācijās, kad klase satur kādu sen nelietotu mainīgo, kas degradē objekta veidošanas vai inicializēšanas procesam nepieciešamo laika sprīdi, ja izrādās, ka šis “nelietotais” mainīgais ir palicis pāri no kāda code-review/code-refactoring sesijas un aizņem patiešām ievērojami laika sprīdi, jo iespējams, ka inicializē vai izmanto kādu sen aizmirstu time-consuming operāciju.&lt;/p&gt;

  &lt;p&gt;Šādā veidā mēs uz ražošanas vides atklājām vienu interesantu memory-leak problēmu.&lt;/p&gt;

  &lt;p&gt;Arī par šādam lietām vienu no populārākajiem VS paplašinājumiem – Resharper – var iemācīt bļaustīties pamatīgāk nekā pēc noklusējuma uzstādījumiem tas drīkst darīt.&lt;/p&gt;

  &lt;p&gt;&amp;#160;&lt;/p&gt;

  &lt;p&gt;&amp;#160;&lt;/p&gt;

  &lt;p&gt;&amp;#160;&lt;/p&gt;

  &lt;p&gt;Happy coding!&lt;/p&gt;

  &lt;p&gt;Cerams, ka noderēs!&lt;/p&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnet.lv/aggbug.aspx?PostID=192272" width="1" height="1"&gt;</description><category domain="http://dotnet.lv/blogs/vi/archive/tags/Other/default.aspx">Other</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/Design/default.aspx">Design</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/Source+Analysis/default.aspx">Source Analysis</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/Code+Analysis/default.aspx">Code Analysis</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/Practices/default.aspx">Practices</category></item><item><title>Dependency Inversion - pēdējais on S.O.L.I.D.</title><link>http://dotnet.lv/blogs/vi/archive/2011/07/11/dependency-inversion.aspx</link><pubDate>Sun, 10 Jul 2011 21:49:00 GMT</pubDate><guid isPermaLink="false">245d81fd-b543-41d7-a051-d8603c6e9e31:169846</guid><dc:creator>valdis.iljuconoks</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnet.lv/blogs/vi/rsscomments.aspx?PostID=169846</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnet.lv/blogs/vi/commentapi.aspx?PostID=169846</wfw:comment><comments>http://dotnet.lv/blogs/vi/archive/2011/07/11/dependency-inversion.aspx#comments</comments><description>&lt;div id="post_content"&gt;
&lt;p&gt;Oriģinālliteratūra: &amp;ldquo;&lt;em&gt;Principle refers to a specific form of &lt;/em&gt;&lt;em&gt;decoupling&lt;/em&gt;&lt;em&gt; where conventional &lt;/em&gt;&lt;em&gt;dependency&lt;/em&gt;&lt;em&gt; relationships established from high-level, policy-setting modules to low-level, dependency modules are inverted (i.e. reversed) for the purpose of rendering high-level modules independent of the low-level module implementation details&lt;/em&gt;&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;&amp;Scaron;is princips definē sekojo&amp;scaron;us noteikumus jeb likumus, kas būtu jāievēro:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Augstākā līmeņa moduļiem nevajadzētu būt atkarīgiem no zemāka līmeņa moduļiem. Abiem moduļiem jābūt atkarīgiem no zināmām abstrakcijām. &lt;/li&gt;
&lt;li&gt;Abstrakcijām nav jābūt atkarīgām no detaļām. Detaļām jāzina par abstrakcijām. &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Modernās sistēmās arhitektūra un kla&amp;scaron;u dizains ir veidots tā, lai augstāka līmeņa komponentes izmantotu zemāka līmeņa komponentes sava darba jeb problēmu apgabala risinā&amp;scaron;anai. Tas nodro&amp;scaron;ina zemāka līmeņa komponentēm ļauj būt atkārtoti izmantojamām, kas nozīmē, ka zemāka līmeņa komponentes jāveido tā, lai tām nebūtu informācijas un atkarība no augstāka līmeņa komponentēm jeb komponentes piedāvātās funkcionalitātes klientiem.&lt;/p&gt;
&lt;p&gt;Savukārt &amp;scaron;eit saskaramies ar nākamo problēmu, proti, kur&amp;scaron; rūpēsies par augstākā līmeņa komponen&amp;scaron;u atkārtotas izmanto&amp;scaron;anas iespējām? Ja augstākā līmeņa komponente ir tie&amp;scaron;ā veidā atkarīga no zemākā līmeņa komponentēs, tad ievērojami samazina augstākā līmeņa komponentes pielieto&amp;scaron;anu citās vietas un citās situācijās.&lt;/p&gt;
&lt;p&gt;&amp;Scaron;ī principa galvenais mērķis ir atdalīt augstāka līmeņa komponenti no zinā&amp;scaron;anām par zemāka līmeņa komponentes detaļām un uzbūvi &amp;ndash; tādā veidā radot labvēlīgus apstākļus augstākā līmeņa komponenti izmantot citās vietās vai situācijās.&lt;/p&gt;
&lt;p&gt;Reālā dzīvē &amp;scaron;ī veida atdalī&amp;scaron;ana izskatās ļoti vienkār&amp;scaron;i un apmēram tiek realizēta sekojo&amp;scaron;ā veidā:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;pirmkārt &amp;scaron;āda veida atdalī&amp;scaron;ana sistēmās notiek fiziski &amp;ndash; augstākā un zemākā līmeņa komponentes tiek novietotas dažādos moduļos vai bibliotēkās &lt;/li&gt;
&lt;li&gt;zemākā līmeņa komponentes uzvedība vai piedāvātā funkcionalitāte tiek reprezentēta kā interfeiss un parasti atrodas vai nu tajā pa&amp;scaron;ā bibliotēkā, kur atrodas augstākā līmeņa komponente vai arī tiek izdalīta speciāla bibliotēka speciāli paredzēta &amp;scaron;āda veida abstrakciju uzglabā&amp;scaron;anai &lt;/li&gt;
&lt;li&gt;lai zemākā līmeņa komponente piedāvātu augstākā līmeņa komponentei nepiecie&amp;scaron;amo funkcionalitāti, tai ir jābūt atkarīgai no augstākā līmeņa komponentes, ja interfeiss ir definēts tajā modulī vai arī uz kādu speciāli izdalītu bibliotēku &lt;/li&gt;
&lt;li&gt;tādā veida atkarības saites tiek pagrieztas otrādāk jeb invertētas &amp;ndash; augstākā līmeņa komponente vairs nav atkarīga no zemākā līmeņa komponentes. &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Vēlāk jau runtime laikā tiek izmantoti daudzi dažādi patterni (Plugin, Dependency Injection, Service Locator), kādā veidā platforma vai sistēma piemeklē zemāka līmeņa komponentes nepiecie&amp;scaron;amajām augstākā līmeņa komponentēm.&lt;/p&gt;
&lt;p&gt;&amp;Scaron;im nolūkam, protams, var rakstīt savu ietvaru (angl. &lt;em&gt;framework&lt;/em&gt;), bet .Net pasaulē jau eksistē daudz dažādas sistēmas un bibliotēkas, kas piedāvā izstrādātājiem jau gatavus risinājumus. Populārākās no dažām tikai: SpringFramework.Net, Microsoft Extensibility Framework (MEF), Enterprise Library Unity Block, StructureMap.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Citiem vārdiem sakot, Dependency Inversion Prnciple dažkārt jauc ar Inverse of Control principu, kas arī nav nejau&amp;scaron;ība. Abi &amp;scaron;ie principi eksistē un runā gandrīz par vienu un to pa&amp;scaron;u &amp;ndash; kādā veidā efektīvāk atdalīt komponentes savā starpā, lai mazinātos nepiecie&amp;scaron;amās neatkarības saites un vienkār&amp;scaron;otu kopējo sistēmas arhitektūru.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img height="450" width="562" src="http://lostechies.com/derickbailey/files/2011/03/DependencyInversionPrinciple_0278F9E2.jpg" style="display:block;float:none;margin-left:auto;margin-right:auto;" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;Scaron;oreiz iztiksim bez nevienas koda rindiņas :)&lt;/p&gt;
&lt;p&gt;Bet vispārīgi, ceru, ka princips tapa skaidrāks. Ja mēs redzam, ka lietām būtu jābūt nesaistītām, savstarpēji neatkarīgākām, tad &amp;scaron;ādos gadījumos starp abām komponentēm, starp kurām ir izcēlies kariņ&amp;scaron; un notiek vainīgo galvas skalo&amp;scaron;ana, tiek definēts interfeiss, kas regulē abas puses: to, ko augstākā līmeņa komponente sagaida no zemākā līmeņa komponentes un ko zemākā līmeņa komponente var piedāvāt augstākā līmeņa komponentei.&lt;/p&gt;
&lt;p&gt;Kā jau to pieminēju &amp;ldquo;&lt;a href="http://dotnet.lv/blogs/vi/archive/2011/07/10/interface-segregation.aspx"&gt;Interface Segragation Principle&lt;/a&gt;&amp;rdquo; rakstā, interfeiss &amp;scaron;eit nav domāts tikai ar kla&amp;scaron;u interfeisu. Interfeiss var būt arī cita klase, kas dod iespēju saviem klientiem iegūt vajadzīgo joy, piedāvājot tie&amp;scaron;i to funkcionalitāti, kas nepiecie&amp;scaron;ama augstākā līmeņa darbībai.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Cerams, ka noderēs!&lt;/p&gt;
&lt;p&gt;Pārējie raksti SOLID sērijā:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;ldquo;&lt;a href="http://dotnet.lv/blogs/vi/archive/2010/10/31/odien-pirmais-no-s-o-l-i-d-grupas-quot-s-quot.aspx"&gt;Single Responsibility Principle&lt;/a&gt;&amp;rdquo; &lt;/li&gt;
&lt;li&gt;&amp;ldquo;&lt;a href="http://dotnet.lv/blogs/vi/archive/2010/11/21/odienas-gavi-nieks-o-no-s-o-l-i-d-apvien-bas.aspx"&gt;Open-Closed Principle&lt;/a&gt;&amp;rdquo; &lt;/li&gt;
&lt;li&gt;&amp;ldquo;&lt;a href="http://dotnet.lv/blogs/vi/archive/2011/07/08/odien-n-kamais-rind-ir-l-no-apvien-bas-s-o-l-i-d.aspx"&gt;Liskov Substitution Principle&lt;/a&gt;&amp;rdquo; &lt;/li&gt;
&lt;li&gt;&amp;ldquo;&lt;a href="http://dotnet.lv/blogs/vi/archive/2011/07/10/interface-segregation.aspx"&gt;Interface Segregation Principle&lt;/a&gt;&amp;rdquo; &lt;/li&gt;
&lt;li&gt;&amp;ldquo;Dependency Inversion Principle&amp;rdquo; &lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnet.lv/aggbug.aspx?PostID=169846" width="1" height="1"&gt;</description><category domain="http://dotnet.lv/blogs/vi/archive/tags/Patterns+_2600_amp_3B00_+Practices/default.aspx">Patterns &amp;amp; Practices</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/Architecture/default.aspx">Architecture</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/Design/default.aspx">Design</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/Practices/default.aspx">Practices</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/SOLID/default.aspx">SOLID</category></item><item><title>Liekam pinktu uz “I” no apvienības S.O.L.I.D.</title><link>http://dotnet.lv/blogs/vi/archive/2011/07/10/interface-segregation.aspx</link><pubDate>Sat, 09 Jul 2011 21:18:00 GMT</pubDate><guid isPermaLink="false">245d81fd-b543-41d7-a051-d8603c6e9e31:147822</guid><dc:creator>valdis.iljuconoks</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnet.lv/blogs/vi/rsscomments.aspx?PostID=147822</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnet.lv/blogs/vi/commentapi.aspx?PostID=147822</wfw:comment><comments>http://dotnet.lv/blogs/vi/archive/2011/07/10/interface-segregation.aspx#comments</comments><description>&lt;div id="post_content"&gt;
&lt;p&gt;Oriģinālliteratūra: &amp;ldquo;&lt;em&gt;The Interface Segregation Principle (ISP) states that clients should not be forced to depend on methods they do not use.&lt;/em&gt;&amp;rdquo;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;Scaron;o principu ir pavisam vienkār&amp;scaron;i interpretēt un viegli ievērot: klientam, kas lieto komponenti, kuras autori esam mēs, nedrīkstam jeb nebūtu vēlams &amp;ldquo;uzspiest&amp;rdquo; vairāk informācijas nekā viņam (komponentes klientam) tas būtu nepiecie&amp;scaron;ams.&lt;/p&gt;
&lt;p&gt;&amp;Scaron;ī principa kontekstā &amp;ndash; interfeiss nav domāts tikai kla&amp;scaron;u interfeiss (keyword &lt;em&gt;interface&lt;/em&gt;), ko kāds implementē vai realizē. &amp;Scaron;ajā principā runa ir arī par klasēm, kurām ir klienti jeb lietotāji.&lt;/p&gt;
&lt;p&gt;Uzskatāmākais piemērs nāk no &amp;ldquo;System&amp;rdquo; vārdu telpas &amp;ndash; &lt;span style="font-family:&amp;#39;Courier New&amp;#39;;font-size:x-small;"&gt;System.Web.Security.MembershipProvider&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style="border-bottom:1px dashed;border-left:1px dashed;padding-bottom:3px;padding-left:3px;padding-right:3px;font-family:courier new;background:#efefef;color:black;font-size:9pt;border-top:1px dashed;border-right:1px dashed;padding-top:3px;"&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;namespace&lt;/span&gt; System.Web.Security&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;{&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;abstract&lt;/span&gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;MembershipProvider&lt;/span&gt; : &lt;span style="color:#2b91af;"&gt;ProviderBase&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;abstract&lt;/span&gt; &lt;span style="color:blue;"&gt;bool&lt;/span&gt; EnablePasswordRetrieval { &lt;span style="color:blue;"&gt;get&lt;/span&gt;; }&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;abstract&lt;/span&gt; &lt;span style="color:blue;"&gt;bool&lt;/span&gt; EnablePasswordReset { &lt;span style="color:blue;"&gt;get&lt;/span&gt;; }&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;abstract&lt;/span&gt; &lt;span style="color:blue;"&gt;bool&lt;/span&gt; RequiresQuestionAndAnswer { &lt;span style="color:blue;"&gt;get&lt;/span&gt;; }&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;abstract&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt; ApplicationName { &lt;span style="color:blue;"&gt;get&lt;/span&gt;; &lt;span style="color:blue;"&gt;set&lt;/span&gt;; }&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;abstract&lt;/span&gt; &lt;span style="color:blue;"&gt;int&lt;/span&gt; MaxInvalidPasswordAttempts { &lt;span style="color:blue;"&gt;get&lt;/span&gt;; }&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;abstract&lt;/span&gt; &lt;span style="color:blue;"&gt;int&lt;/span&gt; PasswordAttemptWindow { &lt;span style="color:blue;"&gt;get&lt;/span&gt;; }&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;abstract&lt;/span&gt; &lt;span style="color:blue;"&gt;bool&lt;/span&gt; RequiresUniqueEmail { &lt;span style="color:blue;"&gt;get&lt;/span&gt;; }&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;abstract&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;MembershipPasswordFormat&lt;/span&gt; PasswordFormat { &lt;span style="color:blue;"&gt;get&lt;/span&gt;; }&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;abstract&lt;/span&gt; &lt;span style="color:blue;"&gt;int&lt;/span&gt; MinRequiredPasswordLength { &lt;span style="color:blue;"&gt;get&lt;/span&gt;; }&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;abstract&lt;/span&gt; &lt;span style="color:blue;"&gt;int&lt;/span&gt; MinRequiredNonAlphanumericCharacters { &lt;span style="color:blue;"&gt;get&lt;/span&gt;; }&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;abstract&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt; PasswordStrengthRegularExpression { &lt;span style="color:blue;"&gt;get&lt;/span&gt;; }&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;abstract&lt;/span&gt; &lt;span style="color:blue;"&gt;bool&lt;/span&gt; ChangePassword(&lt;span style="color:blue;"&gt;string&lt;/span&gt; username, &lt;span style="color:blue;"&gt;string&lt;/span&gt; oldPassword, &lt;span style="color:blue;"&gt;string&lt;/span&gt; newPassword);&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;abstract&lt;/span&gt; &lt;span style="color:blue;"&gt;bool&lt;/span&gt; ChangePasswordQuestionAndAnswer(&lt;span style="color:blue;"&gt;string&lt;/span&gt; username,&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;string&lt;/span&gt; password,&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;string&lt;/span&gt; newPasswordQuestion,&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;string&lt;/span&gt; newPasswordAnswer);&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;abstract&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;MembershipUser&lt;/span&gt; CreateUser(&lt;span style="color:blue;"&gt;string&lt;/span&gt; username,&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;string&lt;/span&gt; password,&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;string&lt;/span&gt; email,&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;string&lt;/span&gt; passwordQuestion,&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;string&lt;/span&gt; passwordAnswer,&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;bool&lt;/span&gt; isApproved,&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;object&lt;/span&gt; providerUserKey,&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;out&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;MembershipCreateStatus&lt;/span&gt; status);&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;abstract&lt;/span&gt; &lt;span style="color:blue;"&gt;bool&lt;/span&gt; DeleteUser(&lt;span style="color:blue;"&gt;string&lt;/span&gt; username, &lt;span style="color:blue;"&gt;bool&lt;/span&gt; deleteAllRelatedData);&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;abstract&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;MembershipUserCollection&lt;/span&gt; FindUsersByEmail(&lt;span style="color:blue;"&gt;string&lt;/span&gt; emailToMatch,&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;int&lt;/span&gt; pageIndex,&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;int&lt;/span&gt; pageSize,&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;out&lt;/span&gt; &lt;span style="color:blue;"&gt;int&lt;/span&gt; totalRecords);&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;abstract&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;MembershipUserCollection&lt;/span&gt; FindUsersByName(&lt;span style="color:blue;"&gt;string&lt;/span&gt; usernameToMatch,&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;int&lt;/span&gt; pageIndex,&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;int&lt;/span&gt; pageSize,&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;out&lt;/span&gt; &lt;span style="color:blue;"&gt;int&lt;/span&gt; totalRecords);&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;abstract&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;MembershipUserCollection&lt;/span&gt; GetAllUsers(&lt;span style="color:blue;"&gt;int&lt;/span&gt; pageIndex,&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;int&lt;/span&gt; pageSize,&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;out&lt;/span&gt; &lt;span style="color:blue;"&gt;int&lt;/span&gt; totalRecords);&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;abstract&lt;/span&gt; &lt;span style="color:blue;"&gt;int&lt;/span&gt; GetNumberOfUsersOnline();&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;abstract&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt; GetPassword(&lt;span style="color:blue;"&gt;string&lt;/span&gt; username, &lt;span style="color:blue;"&gt;string&lt;/span&gt; answer);&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;abstract&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;MembershipUser&lt;/span&gt; GetUser(&lt;span style="color:blue;"&gt;object&lt;/span&gt; providerUserKey, &lt;span style="color:blue;"&gt;bool&lt;/span&gt; userIsOnline);&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;abstract&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;MembershipUser&lt;/span&gt; GetUser(&lt;span style="color:blue;"&gt;string&lt;/span&gt; username, &lt;span style="color:blue;"&gt;bool&lt;/span&gt; userIsOnline);&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;abstract&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt; GetUserNameByEmail(&lt;span style="color:blue;"&gt;string&lt;/span&gt; email);&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;abstract&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt; ResetPassword(&lt;span style="color:blue;"&gt;string&lt;/span&gt; username, &lt;span style="color:blue;"&gt;string&lt;/span&gt; answer);&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;abstract&lt;/span&gt; &lt;span style="color:blue;"&gt;bool&lt;/span&gt; UnlockUser(&lt;span style="color:blue;"&gt;string&lt;/span&gt; userName);&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;abstract&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; UpdateUser(&lt;span style="color:#2b91af;"&gt;MembershipUser&lt;/span&gt; user);&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;abstract&lt;/span&gt; &lt;span style="color:blue;"&gt;bool&lt;/span&gt; ValidateUser(&lt;span style="color:blue;"&gt;string&lt;/span&gt; username, &lt;span style="color:blue;"&gt;string&lt;/span&gt; password);&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;protected&lt;/span&gt; &lt;span style="color:blue;"&gt;virtual&lt;/span&gt; &lt;span style="color:blue;"&gt;byte&lt;/span&gt;[] DecryptPassword(&lt;span style="color:blue;"&gt;byte&lt;/span&gt;[] encodedPassword);&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;protected&lt;/span&gt; &lt;span style="color:blue;"&gt;virtual&lt;/span&gt; &lt;span style="color:blue;"&gt;byte&lt;/span&gt;[] EncryptPassword(&lt;span style="color:blue;"&gt;byte&lt;/span&gt;[] password);&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;protected&lt;/span&gt; &lt;span style="color:blue;"&gt;virtual&lt;/span&gt; &lt;span style="color:blue;"&gt;byte&lt;/span&gt;[] EncryptPassword(&lt;span style="color:blue;"&gt;byte&lt;/span&gt;[] password,&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#2b91af;"&gt;MembershipPasswordCompatibilityMode&lt;/span&gt; legacyPasswordCompatibilityMode);&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;protected&lt;/span&gt; &lt;span style="color:blue;"&gt;virtual&lt;/span&gt; &lt;span style="color:blue;"&gt;void&lt;/span&gt; OnValidatingPassword(&lt;span style="color:#2b91af;"&gt;ValidatePasswordEventArgs&lt;/span&gt; e);&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;event&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;MembershipValidatePasswordEventHandler&lt;/span&gt; ValidatingPassword;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;}&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Jau aplūkojot &amp;scaron;o abstraktās klases saturu un nosaukumu, skaidrs, ka &amp;scaron;is interfeiss ir nedaudz pa &amp;ldquo;resnu&amp;rdquo; un prasās uz dizaina sesiju, kurā visticamāk, ka tiktu radīti citi &amp;ndash; mazāki interfeisi, kas piedāvātu konkrētu funkcionalitāti, kas fokusēts un kādu konkrētu problēmu domeinu. Piemēram, vai paroles kriptē&amp;scaron;ana un atkriptē&amp;scaron;ana tie&amp;scaron;ām ir MembershipProvider atbildība?&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Vēl pēc kā var mēģināt identificēt ISP pārkāpumu ir #region apgabali kodā. Princips ir: ja kodā tiek pielietots reģions, tas visticamāk nozīmē, ka konkrētais koda fragments visticamāk, ka jāpārbīda uz kādu citu vietu (parasti tā ir jauna metode vai pat jauna komponente).&lt;/p&gt;
&lt;p&gt;Pāris ieteikumi, kā var mēģināt ievērot ISP ikdienas API dizainē&amp;scaron;anas darba procesā:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;veidojiet mazus interfeisus, paturiet tikai nepiecie&amp;scaron;amo &lt;/li&gt;
&lt;li&gt;ļaujiet savas komponentes klientiem nodefinēt vēlamo un nepiecie&amp;scaron;amo interfeisu &lt;/li&gt;
&lt;li&gt;pārveidojiet lielus interfeisus mazākos interfeisos, no kuriem katrs piedāvā kādu &amp;scaron;auru fokusētu funkcionalitāti. &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Internetā uzgāju interesantu bildi, kas ļoti precīzi raksturo ISP pārkāpumu:&lt;/p&gt;
&lt;p&gt;&lt;img height="423" width="528" src="http://lostechies.com/derickbailey/files/2011/03/InterfaceSegregationPrinciple_60216468.jpg" style="display:block;float:none;margin-left:auto;margin-right:auto;" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Cerams, ka noderēs!&lt;/p&gt;
&lt;p&gt;Pārējie raksti SOLID sērijā:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;ldquo;&lt;a href="http://dotnet.lv/blogs/vi/archive/2010/10/31/odien-pirmais-no-s-o-l-i-d-grupas-quot-s-quot.aspx"&gt;Single Responsibility Principle&lt;/a&gt;&amp;rdquo; &lt;/li&gt;
&lt;li&gt;&amp;ldquo;&lt;a href="http://dotnet.lv/blogs/vi/archive/2010/11/21/odienas-gavi-nieks-o-no-s-o-l-i-d-apvien-bas.aspx"&gt;Open-Closed Principle&lt;/a&gt;&amp;rdquo; &lt;/li&gt;
&lt;li&gt;&amp;ldquo;&lt;a href="http://dotnet.lv/blogs/vi/archive/2011/07/08/odien-n-kamais-rind-ir-l-no-apvien-bas-s-o-l-i-d.aspx"&gt;Liskov Substitution Principle&lt;/a&gt;&amp;rdquo; &lt;/li&gt;
&lt;li&gt;&amp;ldquo;Interface Segregation Principle&amp;rdquo; &lt;/li&gt;
&lt;li&gt;&amp;ldquo;&lt;a href="http://dotnet.lv/blogs/vi/archive/2011/07/11/dependency-inversion.aspx"&gt;Dependency Inversion Principle&lt;/a&gt;&amp;rdquo; &lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnet.lv/aggbug.aspx?PostID=147822" width="1" height="1"&gt;</description><category domain="http://dotnet.lv/blogs/vi/archive/tags/Patterns+_2600_amp_3B00_+Practices/default.aspx">Patterns &amp;amp; Practices</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/Architecture/default.aspx">Architecture</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/Design/default.aspx">Design</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/Practices/default.aspx">Practices</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/SOLID/default.aspx">SOLID</category></item><item><title>Šodien nākamais darba kārtībā ir “L” no apvienības S.O.L.I.D.</title><link>http://dotnet.lv/blogs/vi/archive/2011/07/08/odien-n-kamais-rind-ir-l-no-apvien-bas-s-o-l-i-d.aspx</link><pubDate>Thu, 07 Jul 2011 22:16:00 GMT</pubDate><guid isPermaLink="false">245d81fd-b543-41d7-a051-d8603c6e9e31:147821</guid><dc:creator>valdis.iljuconoks</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnet.lv/blogs/vi/rsscomments.aspx?PostID=147821</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnet.lv/blogs/vi/commentapi.aspx?PostID=147821</wfw:comment><comments>http://dotnet.lv/blogs/vi/archive/2011/07/08/odien-n-kamais-rind-ir-l-no-apvien-bas-s-o-l-i-d.aspx#comments</comments><description>&lt;div id="post_content"&gt;
&lt;p&gt;Orģinālliteratūra: &lt;i&gt;Liskov Substitution Principle (LSP) states that subtypes must be substitutable for their base types.&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;ldquo;L&amp;rdquo; burts patiesībā nāk no &amp;scaron;ī programmatūras dizaina principa autores &amp;ndash; Barbara Liskov! Nez kāpēc, bet man pēc nosaukuma &amp;scaron;ķiet, ka autoram bija jābūt vīrietim :) Varbūt vienkār&amp;scaron;i pieradums, ka parasti visādas teorijas IT industrijā izdomā un pieraksta stiprā dzimuma pārstāvji.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Barbas oriģinālais teksts: &amp;ldquo;&lt;i&gt;What is wanted here is something like the following substitution property: If for each object o&lt;sub&gt;1&lt;/sub&gt; of type S there is an object o&lt;sub&gt;2&lt;/sub&gt; of type T such that for all programs P deﬁned in terms of T, the behavior of P is unchanged when o&lt;sub&gt;1&lt;/sub&gt; is substituted for o&lt;sub&gt;2&lt;/sub&gt; then S is a subtype of T.&amp;rdquo;&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Pirmajā piegājienā nedaudz grūti aptvert &amp;scaron;o principu un izprast, bet tas kļūst skaidrs iedomājoties un saprotot &amp;scaron;ī principa pārkāpumu un sekas, kas izriet no &amp;scaron;ī pārkāpuma. &lt;/p&gt;
&lt;p&gt;Klasiskais dizaina pieejas pārkāpums: ja kāda metode izmanto kādu bāzes klasi, lai ar to operētu, un &amp;scaron;ai metodei ir nepiecie&amp;scaron;ams zināt arī par visiem bāzes klases bērniem jeb mantotajām klasēm, tad &amp;scaron;ī metode pārkāpj LSP principu.&lt;/p&gt;
&lt;p&gt;Piemēram, ja mums ir &amp;scaron;āda veida kla&amp;scaron;u hierarhija:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img width="379" height="213" border="0" src="http://www.dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vi/image_5F00_7B7F3849.png" alt="image" title="image" style="background-image:none;border-right-width:0px;margin:0px auto;padding-left:0px;padding-right:0px;display:block;float:none;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px;" /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Un neliela metode, kas piedalās kaut kādā lielākā procesā, lai konkrētā momentā piedāvātu reitingu konkrētam personu tipam:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style="border-bottom:1px dashed;border-left:1px dashed;padding-bottom:3px;padding-left:3px;padding-right:3px;font-family:courier new;background:#efefef;color:black;font-size:9pt;border-top:1px dashed;border-right:1px dashed;padding-top:3px;"&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;decimal&lt;/span&gt; GetRatio(&lt;span style="color:#2b91af;"&gt;Person&lt;/span&gt; person)&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;{&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;if&lt;/span&gt; (person &lt;span style="color:blue;"&gt;is&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Customer&lt;/span&gt;)&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;return&lt;/span&gt; 1.2M;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;if&lt;/span&gt; (person &lt;span style="color:blue;"&gt;is&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Employee&lt;/span&gt;)&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;return&lt;/span&gt; 0.9M;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;return&lt;/span&gt; 1.0M;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Principiāli &amp;scaron;ī metode pārkāpj Open-Closed principu, par ko &lt;a href="http://dotnet.lv/blogs/vi/archive/2010/11/21/odienas-gavi-nieks-o-no-s-o-l-i-d-apvien-bas.aspx"&gt;rakstīju iepriek&amp;scaron;&lt;/a&gt;, t.i., ja sistēmā parādās jauna tipa persona vai arī kāds personas tips tiek pasludināts par &lt;i&gt;obsolete&lt;/i&gt;, jāmaina ir eksistējo&amp;scaron;s / strādājo&amp;scaron;s kods nevis jāpievieno jauns koda fragments vai jādzē&amp;scaron; eksistējo&amp;scaron;s, kas nodro&amp;scaron;ina nepiecie&amp;scaron;amo funkcionalitāti.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Bieži &amp;scaron;ī principa ietvaros runā par ISA veida attiecībām starp bāzes un bērna (mantoto) klasi. ISA tulkojams kā IS-SUBSTITUTABLE-FOR. Balstoties uz &amp;scaron;o attiecību modeli starp bāzes un bērna klasēm, pārējā pasaule (citi koda fragmenti, kas izmanto &amp;scaron;īs klases) pieņem lēmumu, ka operējot ar bāzes klasi metodei nav jāzina, ka iespējams patiesībā operē ar kādu no bērna klasēm un līdz ar to arī zarojas metodes loģika vai pat pilnībā loģika mainās.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Vēl klasisks piemērs LSP pārkāpumam ir &amp;scaron;āds koda fragments:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style="border-bottom:1px dashed;border-left:1px dashed;padding-bottom:3px;padding-left:3px;padding-right:3px;font-family:courier new;background:#efefef;color:black;font-size:9pt;border-top:1px dashed;border-right:1px dashed;padding-top:3px;"&gt;
&lt;pre 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;Person&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;{&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;virtual&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt; GetAffiliationName()&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;return&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt;.Empty;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;}&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre 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;Customer&lt;/span&gt; : &lt;span style="color:#2b91af;"&gt;Person&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;{&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &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;string&lt;/span&gt; GetAffiliationName()&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;return&lt;/span&gt; &lt;span style="color:#a31515;"&gt;&amp;quot;Nordea Client&amp;quot;&lt;/span&gt;;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;}&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre 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;Employee&lt;/span&gt; : &lt;span style="color:#2b91af;"&gt;Person&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;{&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &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;string&lt;/span&gt; GetAffiliationName()&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:blue;"&gt;throw&lt;/span&gt; &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="font-weight:bold;color:#00008b;"&gt;NotImplementedException&lt;/span&gt;();&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Ja sistēmā eksistēs kāda metode, kas darbojas ar Person klasi un visticamāk, ka saņem to kā metodes argumentu, tad kādā momentā saņemt patiesībā Employee objektu jeb klases instanci, metodes izsaukums beigsies ar kļūdas situāciju.&lt;/p&gt;
&lt;p&gt;&amp;Scaron;īs metodes autors pieņēmis lēmumu, ka jebkurai personai sistēmā ir iespējams iegūt atlaižu piederības grupas nosaukumu un autoram nav bijusi informācija par to, ka sistēmā persona, kas patiesībā ir kādas firmas darbinieks, piederības grupas nosaukuma iegū&amp;scaron;anu neatbalsta principiāli, jo darbiniekiem netiek atbalstītās atlaižu piederības grupas.&lt;/p&gt;
&lt;p&gt;No &amp;scaron;ī principa var mācīties vienu pamatnosacījumu par programmatūras modeļa modelē&amp;scaron;anu &amp;ndash; modelis nekad nevar būt pareizs, ja tiek aplūkots un verificēts izolācijā no reāliem &amp;scaron;ī modeļa klientiem jeb lietotājiem &amp;ndash; citām komponentēm vai koda fragmentiem.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;In genral Liskov princips ir papla&amp;scaron;inājums Open-Closed principam, kas pievēr&amp;scaron;as programmatūras dizaina problēmām tie&amp;scaron;i kla&amp;scaron;u manto&amp;scaron;anas scenārijos, un stāsta par to, ka bērna klasei jeb klasei, kas mantojas no kādas bāzes klases, jāspēj pilnvērtīgi aizvietot bāzes klasi nemainot tās uzvedību.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Un vēl atradu internetā pietiekami sakarīgu motivējo&amp;scaron;u bildi, kas apraksta &amp;scaron;o principu. Diez vai pielietosim Pekinas pīles recepti dzeltenajai pīlei, tikai tāpēc, ka tā peld un pēk&amp;scaron;ķ kā pīle :)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img width="478" height="382" border="0" src="http://lostechies.com/derickbailey/files/2011/03/LiskovSubtitutionPrinciple_52BB5162.jpg" style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:block;float:none;border-top-width:0px;border-bottom-width:0px;margin-left:auto;border-left-width:0px;margin-right:auto;padding-top:0px;" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Cerams, ka noderēs!&lt;/p&gt;
&lt;p&gt;Pārējie raksti SOLID sērijā:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;ldquo;&lt;a href="http://dotnet.lv/blogs/vi/archive/2010/10/31/odien-pirmais-no-s-o-l-i-d-grupas-quot-s-quot.aspx"&gt;Single Responsibility Principle&lt;/a&gt;&amp;rdquo; &lt;/li&gt;
&lt;li&gt;&amp;ldquo;&lt;a href="http://dotnet.lv/blogs/vi/archive/2010/11/21/odienas-gavi-nieks-o-no-s-o-l-i-d-apvien-bas.aspx"&gt;Open-Closed Principle&lt;/a&gt;&amp;rdquo; &lt;/li&gt;
&lt;li&gt;&amp;ldquo;Liskov Substitution Principle&amp;rdquo; &lt;/li&gt;
&lt;li&gt;&amp;ldquo;&lt;a href="http://dotnet.lv/blogs/vi/archive/2011/07/10/interface-segregation.aspx"&gt;Interface Segregation Principle&lt;/a&gt;&amp;rdquo; &lt;/li&gt;
&lt;li&gt;&amp;ldquo;&lt;a href="http://dotnet.lv/blogs/vi/archive/2011/07/11/dependency-inversion.aspx"&gt;Dependency Inversion Principle&lt;/a&gt;&amp;rdquo; &lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnet.lv/aggbug.aspx?PostID=147821" width="1" height="1"&gt;</description><category domain="http://dotnet.lv/blogs/vi/archive/tags/Patterns+_2600_amp_3B00_+Practices/default.aspx">Patterns &amp;amp; Practices</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/Architecture/default.aspx">Architecture</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/Design/default.aspx">Design</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/Practices/default.aspx">Practices</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/SOLID/default.aspx">SOLID</category></item><item><title>EF .Include(“..”)</title><link>http://dotnet.lv/blogs/vi/archive/2011/07/06/ef-include.aspx</link><pubDate>Tue, 05 Jul 2011 22:43:30 GMT</pubDate><guid isPermaLink="false">245d81fd-b543-41d7-a051-d8603c6e9e31:167290</guid><dc:creator>valdis.iljuconoks</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnet.lv/blogs/vi/rsscomments.aspx?PostID=167290</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnet.lv/blogs/vi/commentapi.aspx?PostID=167290</wfw:comment><comments>http://dotnet.lv/blogs/vi/archive/2011/07/06/ef-include.aspx#comments</comments><description>&lt;div id="post_content"&gt;   &lt;p&gt;Labas vakaras,&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;Kāds laiciņš nav nekas šeit rakstīts, jo vasara kā izrādās vienmēr ir viens no karstākajiem periodiem, kad pēkšņi daudzi ir atmodušies no ziemas un pavasara noguruma un sāk plānot darbus un bīdīt lielos plānus, kuri ir jāpabeidz līdz gada beigām, jo nez kāpēc izrādās, ka daudzu programmatūras izstrādes plānu ārējo “jūdžakmens” datumu vadībai parasti nenotrīc roka ielikt datumu, kas sākas ar “01.01.XXXX”. Gadu parasti piedomā klāt pēc tam ;)&lt;/p&gt;    &lt;p&gt;Bet ne par to stāsts šoreiz. Raksts tapis saistībā ar nelielu datu bāzes struktūras izmaiņu veikšanu un Entity Framework datu modeļa tālākas piefrizēšanas, par cik datu piekļuve aplikācijā notiek ar EF palīdzību.&lt;/p&gt;    &lt;p&gt;Daudzās vietās kodā, ja tas patiešām ir nepieciešams, redzam konstrukciju:&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;div style="border-bottom:1px dashed;border-left:1px dashed;padding-bottom:3px;padding-left:3px;padding-right:3px;font-family:courier new;background:#efefef;color:black;font-size:9pt;border-top:1px dashed;border-right:1px dashed;padding-top:3px;"&gt;     &lt;pre style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;using&lt;/span&gt; (&lt;span style="color:blue;"&gt;var&lt;/span&gt; ctx = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Entities&lt;/span&gt;())&lt;/pre&gt;

    &lt;pre style="margin:0px;"&gt;{&lt;/pre&gt;

    &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;return&lt;/span&gt; ctx.Addresses.Include(&lt;span style="color:#a31515;"&gt;&amp;quot;Client&amp;quot;&lt;/span&gt;).Select(e =&amp;gt; e).ToList();&lt;/pre&gt;

    &lt;pre style="margin:0px;"&gt;}&lt;/pre&gt;
  &lt;/div&gt;

  &lt;p&gt;&amp;#160;&lt;/p&gt;

  &lt;p&gt;Vienkāršības labad pieņemsim, ka EF modelis mums ir pavisam vienkāršs:&lt;/p&gt;

  &lt;p&gt;&amp;#160;&lt;/p&gt;

  &lt;p&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:block;float:none;border-top-width:0px;border-bottom-width:0px;margin-left:auto;border-left-width:0px;margin-right:auto;padding-top:0px;" title="" border="0" alt="" src="http://www.dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vi/image_5F00_3D027FD2.png" width="570" height="551" /&gt;&lt;/p&gt;

  &lt;p&gt;&amp;#160;&lt;/p&gt;

  &lt;p&gt;LINQ izteiksme augstāk piemērota situācijās, kad EF konteksts vairs nav pieejams vai arī LazyLoading ir izslēgts, bet vēlāk pēc rezultātu iegūšanas ir nepieciešama kāda informācija no saistošās entītijas – piemēram, šajā gadījumā: meklējam adreses un katrai no adresēm pielādējam klāt arī informāciju par pašu klientu, kam šī adrese pieder, lai vēlāk kādā skatā vai citā vietā izmantotu klienta informāciju.&lt;/p&gt;

  &lt;p&gt;Kas notiek gadījumos, kad veicam pamatīgu DB refaktoringu un izdomājam, ka beigu beigās “Client” entītiju nesauc vairs par klientu, bet, piemēram, par “Customer” :)&lt;/p&gt;

  &lt;p&gt;Ok, veicam izmaiņas datu bāzē –&amp;gt; pārsaucam tabulas, visas references un saišu nosaukumus, etc. Pēc tam varam ķerties pie EF modeļa jeb loģiskā aplikācijas slāņa un veikt izmaiņas tur. Pārsaucam entītiju un protams arī visas saites uz citām entītijām.&lt;/p&gt;

  &lt;p&gt;Daudzas vietas kodā pēc izmaiņām noteikti nekompilēsies, jo, protams, tāds vai šāds tips netiks atrasts. Bet skatoties uz dažādām LINQ izteiksmēm ar .Include(“”) kompilācija norisināsies veiksmīgi, jo viss ir non-typed piegājienā.&lt;/p&gt;

  &lt;p&gt;Es labprāt pasapņotu par strongly-typed access dažādām metodēm un viena no tām ir ObjectSet&amp;lt;T&amp;gt;.Include(“”). Cik forši būtu, ja varētu uzrakstīt:&lt;/p&gt;

  &lt;p&gt;&amp;#160;&lt;/p&gt;

  &lt;div style="border-bottom:1px dashed;border-left:1px dashed;padding-bottom:3px;padding-left:3px;padding-right:3px;font-family:courier new;background:#efefef;color:black;font-size:9pt;border-top:1px dashed;border-right:1px dashed;padding-top:3px;"&gt;
    &lt;pre style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;return&lt;/span&gt; ctx.Addresses.Include(e =&amp;gt; e.Client).Select(e =&amp;gt; e).ToList();&lt;/pre&gt;
  &lt;/div&gt;

  &lt;p&gt;&amp;#160;&lt;/p&gt;

  &lt;p&gt;Vienā momentā apnika refaktorēt un pārdizainēt un nolēmu uzrakstīt paša spēkiem šādu metodi. Un šeit tā arī ir:&lt;/p&gt;

  &lt;p&gt;&amp;#160;&lt;/p&gt;

  &lt;div style="border-bottom:1px dashed;border-left:1px dashed;padding-bottom:3px;padding-left:3px;padding-right:3px;font-family:courier new;background:#efefef;color:black;font-size:9pt;border-top:1px dashed;border-right:1px dashed;padding-top:3px;"&gt;
    &lt;pre 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:#2b91af;"&gt;ObjectQuery&lt;/span&gt;&amp;lt;TEntity&amp;gt; Include&amp;lt;TEntity&amp;gt;(&lt;span style="color:blue;"&gt;this&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ObjectSet&lt;/span&gt;&amp;lt;TEntity&amp;gt; objectSet,&lt;/pre&gt;

    &lt;pre 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;&amp;#160;&amp;#160; &lt;span style="color:#2b91af;"&gt;Expression&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;Func&lt;/span&gt;&amp;lt;TEntity, &lt;span style="color:blue;"&gt;object&lt;/span&gt;&amp;gt;&amp;gt; expression)&lt;/pre&gt;

    &lt;pre 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;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;where&lt;/span&gt; TEntity : &lt;span style="color:blue;"&gt;class&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="margin:0px;"&gt;{&lt;/pre&gt;

    &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;if&lt;/span&gt; (expression == &lt;span style="color:blue;"&gt;null&lt;/span&gt;)&lt;/pre&gt;

    &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

    &lt;pre style="margin:0px;"&gt;&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;ArgumentNullException&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;expression&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

    &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

    &lt;pre style="margin:0px;"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;var&lt;/span&gt; expressionBody = expression.Body;&lt;/pre&gt;

    &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;if&lt;/span&gt; (expressionBody.NodeType != &lt;span style="color:#2b91af;"&gt;ExpressionType&lt;/span&gt;.MemberAccess)&lt;/pre&gt;

    &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/pre&gt;

    &lt;pre style="margin:0px;"&gt;&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;InvalidOperationException&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;Expression is not of `MemberAccess&amp;#39; type.&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

    &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

    &lt;pre style="margin:0px;"&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;var&lt;/span&gt; memberExpression = (&lt;span style="color:#2b91af;"&gt;MemberExpression&lt;/span&gt;)expressionBody;&lt;/pre&gt;

    &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;return&lt;/span&gt; objectSet.Include(memberExpression.Member.Name);&lt;/pre&gt;

    &lt;pre style="margin:0px;"&gt;}&lt;/pre&gt;
  &lt;/div&gt;

  &lt;p&gt;&amp;#160;&lt;/p&gt;

  &lt;p&gt;Metode ir veidota kā paplašinājuma metode ObjectSet&amp;lt;T&amp;gt; objektam, kas nozīmē, ka vienīgā izmaiņa ir pašā Include() metodes argumentā (nu un, protams, arī using pievienošana, ja izmantošana ir citā vārdu telpā nekā paplašinājuma metode).&lt;/p&gt;

  &lt;p&gt;Protams, šī jaunā metode nepārliecinās, ka tas kas tiek padots argumentā tiešām ir navigācijas property kādai no entītijām un šāda veida izsaukums arī kompilēsies:&lt;/p&gt;

  &lt;p&gt;&amp;#160;&lt;/p&gt;

  &lt;div style="border-bottom:1px dashed;border-left:1px dashed;padding-bottom:3px;padding-left:3px;padding-right:3px;font-family:courier new;background:#efefef;color:black;font-size:9pt;border-top:1px dashed;border-right:1px dashed;padding-top:3px;"&gt;
    &lt;pre style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;return&lt;/span&gt; ctx.Addresses.Include(e =&amp;gt; e.Client.Name).Select(e =&amp;gt; e).ToList();&lt;/pre&gt;
  &lt;/div&gt;

  &lt;p&gt;&amp;#160;&lt;/p&gt;

  &lt;p&gt;Kaut gan runtime laikā saņemsim sejā paziņojumu par to, ka paši esam dumji :)&lt;/p&gt;

  &lt;p&gt;&amp;#160;&lt;/p&gt;

  &lt;p&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:block;float:none;border-top-width:0px;border-bottom-width:0px;margin-left:auto;border-left-width:0px;margin-right:auto;padding-top:0px;" title="image" border="0" alt="image" src="http://www.dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vi/image_5F00_2AB9B910.png" width="544" height="334" /&gt;&lt;/p&gt;

  &lt;p&gt;&amp;#160;&lt;/p&gt;

  &lt;p&gt;&amp;#160;&lt;/p&gt;

  &lt;p&gt;Cerams, ka noderēs!&lt;/p&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnet.lv/aggbug.aspx?PostID=167290" width="1" height="1"&gt;</description><category domain="http://dotnet.lv/blogs/vi/archive/tags/LINQ/default.aspx">LINQ</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/Architecture/default.aspx">Architecture</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/Design/default.aspx">Design</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/Generics/default.aspx">Generics</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/Entity+Framework/default.aspx">Entity Framework</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/.NET4.0/default.aspx">.NET4.0</category></item><item><title>Arhitektūras šablons</title><link>http://dotnet.lv/blogs/vi/archive/2010/12/04/arhitekt-ras-ablons.aspx</link><pubDate>Sat, 04 Dec 2010 21:01:36 GMT</pubDate><guid isPermaLink="false">245d81fd-b543-41d7-a051-d8603c6e9e31:32622</guid><dc:creator>valdis.iljuconoks</dc:creator><slash:comments>5</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnet.lv/blogs/vi/rsscomments.aspx?PostID=32622</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnet.lv/blogs/vi/commentapi.aspx?PostID=32622</wfw:comment><comments>http://dotnet.lv/blogs/vi/archive/2010/12/04/arhitekt-ras-ablons.aspx#comments</comments><description>&lt;div id="post_content"&gt;   &lt;p&gt;Pēc klasikas jebkura sistēmai var izdalīt vismaz trīs slāņus. However vairāk vai mazāk ir iespējams izdalīt sekojošus apgabalus jeb slāņus:&lt;/p&gt;    &lt;ol&gt;     &lt;li&gt;Prezentācijas slānis. &lt;/li&gt;      &lt;li&gt;Biznesa loģikas slānis. &lt;/li&gt;      &lt;li&gt;Datu piekļuves slānis. &lt;/li&gt;      &lt;li&gt;Platforma jeb Cross-Cutting. &lt;/li&gt;   &lt;/ol&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;Īpaši ar mākslinieciskām dotībām neesmu apveltīts, bet šāda bilde man pastāvīgi redzama pie sienas :)&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&lt;a href="http://dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vi/image_5F00_1F777F98.png"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:block;float:none;border-top-width:0px;border-bottom-width:0px;margin-left:auto;border-left-width:0px;margin-right:auto;padding-top:0px;" title="image" border="0" alt="image" src="http://dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vi/image_5F00_thumb_5F00_26F2C938.png" width="361" height="370" /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;Prezentācijas slānī parasti atrodas:&lt;/p&gt;    &lt;ol&gt;     &lt;li&gt;Web interfeiss. Lietotāja interfeisa tīmekļa aplikācijas izskatā. Šis punkts protams ļoti atkarīgs no sistēmas un produkta, bet jebkurā gadījumā vairums modernajām sistēmām ir vismaz viens lietotāja interfeiss balstīts uz tīmekļa tehnoloģijām. &lt;/li&gt;      &lt;li&gt;Desktop interfeiss. Iespējams, ka eksistē arī kāds lietotāja interfeiss, kas ir balstīts uz Windows Formām vai WPF. &lt;/li&gt;      &lt;li&gt;Publiskie servisi (web servisi). Pārsvarā eksistē sistēmā arī kaut kādi servisi, kas tiek izmantoti no ārpuses. Piemēram, dažāda veida servisu piegāde ārējām sistēmām jeb ārējiem biznesa loģikas patērētājiem. &lt;/li&gt;      &lt;li&gt;Background (fona) servisi. Fonā parasti notiek arī kaut kādas aktivitātes, kur nav nepieciešams cilvēka pirksta pieskāriens. Ir dažāda veida servisi jeb procesi, kas notiek vai nu regulāri vai arī reaktīvi reaģējot uz kādu no notikumiem, kas notiek sistēmā. Notikumi parasti notiek biznesa objekta modelī (piemēram, apdrošināšanas polise beidzas – fona process ir atbildīgs par atbilstošā statusa uzstādīšanu). &lt;/li&gt;      &lt;li&gt;Administrācijas vide. Caur kaut kādu UI sistēmas administratoriem jādod iespēju arī administrēt to biznesa sistēma un pārējos dažādos artefaktus, kas figurē sistēmā (piemēram, lietotājus vai klasifikatorus, etc.). &lt;/li&gt;      &lt;li&gt;Kaut kas vēl custom specifisks konkrētajai sistēmai vai produktam. Dažāda veida tooļi, scripti vai kādi helper apgabali, kas bagātina un papildina kopējo sistēmas funkcionalitāti. &lt;/li&gt;   &lt;/ol&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;Par biznesa loģiku nav daudz ko stāstīt. Tur parasti atrodas biznesa loģika, dažādi “manageri” (kaut dzīvē bieži esmu redzējis, ka cilvēki ražo biznesa slānī tieši menedžerus, kas prot daudz ko un atbild par daudz ko, tomēr man uzskats ir ka, ka kopsummā ir sistēma jākonstruē tā, ka ir strikti nodalītas atbildības, katra klase atbild par kādu konkrētu biznesa procesa daļu, operāciju, funkcionalitāti vai atbildību), pārvaldnieki, biznesa procesu draiveri, servisu fasādes un kas vēl ne cits.&lt;/p&gt;    &lt;p&gt;Savukārt ar datu piekļuves slāni parasti ir interesantas diskusijas. Un diskusijas parasti ir par to, vai speciāli ir nepieciešams izdalīt datu piekļuves slāni kā atsevišķu bibliotēku vai assembliju. Cik no pieredzes es varu spriest, izdalīt atsevišķu datu piekļuves slāni ir izdevīgi un nepieciešams gadījumos, kad sistēmai vai produktam ir jāatbalsta vairākas datu bāzes vadības sistēmas. Un izdevīgi to ir veidot tā, ka pārējā sistēmas daļa ir neatkarīga no datu bāzes vadības sistēmas izvēles un viss notiek noteiktā abstrakcijas līmenī.      &lt;br /&gt;Parasti, pielietojot modernās datu piekļuves tehnoloģijas ērti un organiski sanāk nedaudz sapludināt biznesa slāni ar datu piekļuves slāni un kontraktiem no platformas jeb cross-cutting slāņa, tādā veidā izdalot jaunu slāni – Data Contracts, kurš tāpat kā Cross-Cutting ir pieejams visiem slāņiem un komponentēm. Vienības no Data Contracts slāņa parasti kalpo kā saziņas līdzeklis un interfeiss komunikācijās starp dažādiem slāņiem un sistēmas komponentēm.&lt;/p&gt;    &lt;p&gt;Platformā cilvēki parasti saliek visu pārējo, kas ir palicis pāri nesadalīts starp iepriekšējiem slāņiem. Tas gan ir stipri atkarīgs no sistēmas vai produkta, bet vairums situācijās jebkurā no sistēmām var izdalīt sekojošas sadaļas jeb komponentes, kas atrodas platformas slānī:&lt;/p&gt;    &lt;ol&gt;     &lt;li&gt;Logging. Žurnalizēšana un viss ar to saistītais (gan tehniskais žurnāls, gan arī biznesa), API, etc. &lt;/li&gt;      &lt;li&gt;Caching. Kešatmiņas tehnoloģijas un pieejas izvēle arī brīžiem var radīt nelielas galvas sāpēs arhitektiem un inženieriem. &lt;/li&gt;      &lt;li&gt;Configuration. Noteikti sistēmās ir kāda sadaļa, kurā uzglabājas dažāda veida konfigurācijas parametri un uzstādījumi. Brīžiem arī interesants jautājums, kā to visu saglabāt un padarīt pieejamu dažādiem slāņiem un komponentēm, kā rīkoties situācijās, kad mainās konfigurācijas uzstādījuma vērtība, vai vienmēr pārlasīt vērtību pie katras tās pieprasīšanas vai tomēr izvēlēties kādu no kešatmiņas risinājumiem? Arī šie jautājumi mēdz nomākt arhitektus. &lt;/li&gt;      &lt;li&gt;Error Handling. Reti kura sistēma ir uzrakstīta bez nevienas kļūdas. Pareizi tā noķert un apstrādāt ir šī apakšmoduļa uzdevums. &lt;/li&gt;      &lt;li&gt;Authentication un Authorization. Noteikti sistēmā būs nepieciešama dažāda veida drošības risinājumi. Diezgan bieži jaunieši jauc vietām šīs divas smalkās lietas. &lt;/li&gt;      &lt;li&gt;Monitoring. Šī apakšmoduļa uzdevums ir sekot sistēmas veselības stāvoklim, aplūkojot un ziņojot par dažādiem problēmapgabaliem vai situācijām. Parasti šīs lietas tiek atstātas novārtā, bet patiesībā, ja jums iznāk strādāt pie kāda produkta, mēģiniet sev iestāstīt, ka jebkurai sistēmai ir jānodrošina kaut kāda veida diagnostikas iespējas un jālaiž ražošanā ar iestrādātiem speciāliem diagnostikas portiem vai interfeisiem, atvērtām iespējām noskaidrot, kas notiek sistēmā un vai nevajadzētu pievērst kāda sistēmadministratora uzmanību. &lt;/li&gt;      &lt;li&gt;Localization. Parasti mūsdienās attālumam vairs nav nozīmes un nereti ir situācijas, kad indieši raksta kodu amerikāņiem, vai norvēģi ievieš savu sistēmu Zviedrijā, etc. Tā kā ar vien biežāk nākas domāt par lokalizāciju un sistēmas daudzvalodību. Šīs problēmas risināšanai tiek veidoti moduļi, kas ietilpst šajā komponentē. &lt;/li&gt;      &lt;li&gt;Validation. Datu kontraktu satura pareizīguma pārbaude un verifikācija notiek parasti šajā komponentē. Tas, protams, ir stipri atkarīgs no sistēmas un produkta, bet parasti vairums sistēmas eksistē kāda veida datu validācija pirms tie nokļūst datu glabātuvē (parasti datu bāzē). &lt;/li&gt;   &lt;/ol&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;Šīs ir lietas un aspekti, kurus esmu saskatījis vairākās sistēmās, kurās man bijis tas gods piedalīties un palīdzēt cilvēkiem tikt galā ar uzdevumiem (parasti tos sauc par &lt;em&gt;challanges &lt;/em&gt;:)).&lt;/p&gt;    &lt;p&gt;Ja nu kādam sanāk darboties pie kādas sistēmas vai arī, ja kāds palūdz jums uzzīmēt kādu smuku bildi, kurai pēc biznesa īpašnieku domām būtu jāapraksta un uzskatāmi jārunā par kādas konkrētas sistēmas arhitektūru, tad iespējams, ka varētu noderēt &lt;a href="http://viiar-consulting.lv/files/dotnet/LayerDiagram.zip" target="_blank"&gt;šī layer diagramma&lt;/a&gt;, kas tika veidota pārzīmējot diagrammu, kas redzama nedaudz augstāk.&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&lt;a href="http://dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vi/image_5F00_18481D53.png"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:block;float:none;border-top-width:0px;border-bottom-width:0px;margin-left:auto;border-left-width:0px;margin-right:auto;padding-top:0px;" title="image" border="0" alt="image" src="http://dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vi/image_5F00_thumb_5F00_50F2C760.png" width="470" height="288" /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;Kā jau mēs zinām, slāņu diagrammu var arī validēt un pārbaudīt pret reālo situāciju, kas ir risinājumā. Tā kā atliek tikai salikt pareizos projektus pareizajos slāņos un viens solis tuvāk nefiltrētajai gaišajai nākotnei ir sperts! :)&lt;/p&gt;    &lt;p&gt;Nākamreiz mēģināsim ieskicēt, kāds ir modernais tehnoloģiju stack, kuras var pielietot šādas arhitektūras sistēmās.&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;Cerams, ka noderēs!&lt;/p&gt; &lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnet.lv/aggbug.aspx?PostID=32622" width="1" height="1"&gt;</description><category domain="http://dotnet.lv/blogs/vi/archive/tags/Localization/default.aspx">Localization</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/Enterprise+Library/default.aspx">Enterprise Library</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/Validation/default.aspx">Validation</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/Configuration/default.aspx">Configuration</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/MVC/default.aspx">MVC</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/Caching/default.aspx">Caching</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/Architecture/default.aspx">Architecture</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/Design/default.aspx">Design</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/Entity+Framework/default.aspx">Entity Framework</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/Deployment/default.aspx">Deployment</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/WCF/default.aspx">WCF</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/WF/default.aspx">WF</category></item><item><title>Šodienas gaviļnieks - “O” no S.O.L.I.D. apvienības</title><link>http://dotnet.lv/blogs/vi/archive/2010/11/21/odienas-gavi-nieks-o-no-s-o-l-i-d-apvien-bas.aspx</link><pubDate>Sun, 21 Nov 2010 06:52:00 GMT</pubDate><guid isPermaLink="false">245d81fd-b543-41d7-a051-d8603c6e9e31:30774</guid><dc:creator>valdis.iljuconoks</dc:creator><slash:comments>7</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnet.lv/blogs/vi/rsscomments.aspx?PostID=30774</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnet.lv/blogs/vi/commentapi.aspx?PostID=30774</wfw:comment><comments>http://dotnet.lv/blogs/vi/archive/2010/11/21/odienas-gavi-nieks-o-no-s-o-l-i-d-apvien-bas.aspx#comments</comments><description>&lt;div id="post_content"&gt;
&lt;p&gt;Zinātniskā literatūra &lt;strong&gt;Open/Closed Principle &lt;/strong&gt;raksturo &amp;scaron;ādi:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;i&gt;The Open/Closed Principle states that software entities (classes, modules, functions, etc.) should be open for extensions, but closed for modification.&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Tātad par ko &amp;scaron;is princips mums liek domāt? Sistēmas uzbūve un koda konstrukcijas ir jāveido tā, lai papildinājumus sistēmā varētu ērti ieviest un pielikt nemainot eksistējo&amp;scaron;o kodu, tādā veidā samazinot potenciālās kļūdas, kas varētu rasties pārējās sistēmas daļās vai komponentēs, kurās tiek izmantots kods, kuru nepiecie&amp;scaron;ams būtu mainīt, ja sistēmai ir jānodro&amp;scaron;ina kāda papildus funkcionalitāte.&lt;/p&gt;
&lt;p&gt;&amp;Scaron;āda veida koda konstrukcijas var veidot balstoties uz abstrakcijām jeb nodalot bāzes funkcionalitāti jeb biznesa procesu no mainīgajām daļām, kurās potenciāli būtu jāievie&amp;scaron; papildinājumi. Microsoft .Net platformā abstrakciju var realizēt ar pāris metodēm:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Kla&amp;scaron;u interfeisiem (&lt;i&gt;class interface&lt;/i&gt;). &lt;/li&gt;
&lt;li&gt;Bāzes abstraktajām klasēm (&lt;i&gt;base abstract class&lt;/i&gt;). &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Lai realizētu Open/Closed principu, var ņemt palīgā kādu no realizācijas metodēm:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Manto&amp;scaron;ana (&lt;i&gt;inheritance&lt;/i&gt;) un vai &amp;scaron;ablona metodes (&lt;i&gt;template method pattern&lt;/i&gt;). &amp;Scaron;ajā realizācijas metodē tiek veidota bāzes klase, kas apraksta metodes parametrus, nosaukumu un atgriežamo vērtību tipu. Jaunas uzvedības vai loģikas gadījumā ir jāveido jauna klase, kas mantojas no &amp;scaron;īs bāzes klases un attiecīgi pārraksta konkrēto metodi ar jauno loģiku. &lt;/li&gt;
&lt;li&gt;Parametri (&lt;i&gt;parameters&lt;/i&gt;). &amp;Scaron;is ir visvienkār&amp;scaron;ākais veids, kā nodro&amp;scaron;ināt O/C principu. Konkrētā loģika vai algoritms tiek papildināts un tā uzvedību regulē konkrēti parametri, kurus iespējams nodot algoritmam. &lt;/li&gt;
&lt;li&gt;Stratēģijas (&lt;i&gt;composition/strategy pattern&lt;/i&gt;). Stratēģijas metode dod iespēju veidot koda abstrakcijas tādā veidā, ka bāzes algoritms zina tikai sadarbības interfeisu ar kādu no komponentēm vai klasēm, kurā tiek realizēta nepiecie&amp;scaron;amā loģika. Bāzes algoritms neko nezin par konkrētās klases vai komponentes iek&amp;scaron;ējo uzbūvi un dizainu, tādā veidā panākot abstrakcijas līmeni, ka izmaiņas loģikā neievie&amp;scaron; potenciālas jaunas problēmas vai kļūdas pārējās sistēmas daļās. &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Risinājums, kādā veidā sistēmā notiek jaunas uzvedības pievieno&amp;scaron;ana ir veidojot vienu vai vairāk klases, kas implementē nepiecie&amp;scaron;amo uzvedību vai loģiku. Ieguvums, ko sniedz Open/Closed princips ir, ka līdz &amp;scaron;im par jaunām klasēm neviens sistēmas modulis nezin un potenciāli arī iespēja ieviest kādas jaunas kļūdas ir zemāka. &amp;Scaron;īs mazās klases, kas sistēmai pienes jauno funkcionalitāti, realizē tikai nepiecie&amp;scaron;amo loģiku, kā rezultātā sistēmas veido&amp;scaron;ana seko arī Single Responsibility principam, ka klase ir paredzēta kāda konkrēta mērķa vai loģikas realizē&amp;scaron;anai. O/C princips arī samazina &lt;span style="font-size:x-small;font-family:courier new;"&gt;if&lt;/span&gt; un &lt;span style="font-size:x-small;font-family:courier new;"&gt;switch&lt;/span&gt; valodas konstrukcijas, kas savukārt samazina koda uzbūves sarežģītību, testi paliek plakanāki, saprotamāki un pārskatāmāki.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Zemāk ir dots neliels triviāls piemērs, lai nodemonstrētu O/C principa ievie&amp;scaron;anas mērķi. Piemērs ir balstīts uz ceļojuma apdro&amp;scaron;inā&amp;scaron;anas polises klases bāzes. Pieņemsim, ka ceļojuma polises cena ir atkarīga no katra ceļotāja vecuma, nodarbo&amp;scaron;anās veida, kas plānots ir gala mērķī un dienu skaita, cik ilgi ir plānots būt uzrādītajā gala mērķī. Vienkār&amp;scaron;ības pēc cena nav atkarīga no valsts vai reģiona, uz kuru ir plānots doties. Klienta kods, kas veido ceļojuma polisi, pievieno personas un aprēķina prēmiju ir &amp;scaron;āds:&lt;/p&gt;
&lt;div style="border-bottom:1px dashed;border-left:1px dashed;padding-bottom:3px;padding-left:3px;padding-right:3px;background:#efefef;border-top:1px dashed;border-right:1px dashed;padding-top:3px;"&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span&gt;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt;&lt;/span&gt; policy = &lt;span&gt;&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span style="color:#2b91af;"&gt;TravelPolicy&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CoverDays = 10&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; };&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;policy.Persons.AddRange(&lt;span&gt;&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt;&lt;/span&gt;[]&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span style="color:#2b91af;"&gt;Person&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Name = &lt;span&gt;&lt;span style="color:#a31515;"&gt;&amp;quot;Jānis&amp;quot;&lt;/span&gt;&lt;/span&gt;,&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Surname = &lt;span&gt;&lt;span style="color:#a31515;"&gt;&amp;quot;Bērziņ&amp;scaron;&amp;quot;&lt;/span&gt;&lt;/span&gt;,&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Age = 41,&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ActivityType = &lt;span&gt;&lt;span style="color:#2b91af;"&gt;ActivityType&lt;/span&gt;&lt;/span&gt;.Leisure&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; },&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span style="color:#2b91af;"&gt;Person&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Name = &lt;span&gt;&lt;span style="color:#a31515;"&gt;&amp;quot;Marija&amp;quot;&lt;/span&gt;&lt;/span&gt;,&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Surname = &lt;span&gt;&lt;span style="color:#a31515;"&gt;&amp;quot;Bērziņa&amp;quot;&lt;/span&gt;&lt;/span&gt;,&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Age = 43,&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ActivityType = &lt;span&gt;&lt;span style="color:#2b91af;"&gt;ActivityType&lt;/span&gt;&lt;/span&gt;.Leisure&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; },&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span style="color:#2b91af;"&gt;Person&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Name = &lt;span&gt;&lt;span style="color:#a31515;"&gt;&amp;quot;Ansis&amp;quot;&lt;/span&gt;&lt;/span&gt;,&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Surname = &lt;span&gt;&lt;span style="color:#a31515;"&gt;&amp;quot;Bērziņ&amp;scaron;&amp;quot;&lt;/span&gt;&lt;/span&gt;,&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Age = 14,&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ActivityType = &lt;span&gt;&lt;span style="color:#2b91af;"&gt;ActivityType&lt;/span&gt;&lt;/span&gt;.Sport&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; },&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span style="color:#2b91af;"&gt;Person&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Name = &lt;span&gt;&lt;span style="color:#a31515;"&gt;&amp;quot;Brigita&amp;quot;&lt;/span&gt;&lt;/span&gt;,&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Surname = &lt;span&gt;&lt;span style="color:#a31515;"&gt;&amp;quot;Bērziņa&amp;quot;&lt;/span&gt;&lt;/span&gt;,&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Age = 82,&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ActivityType = &lt;span&gt;&lt;span style="color:#2b91af;"&gt;ActivityType&lt;/span&gt;&lt;/span&gt;.Leisure&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span&gt;&lt;span style="color:#2b91af;"&gt;Console&lt;/span&gt;&lt;/span&gt;.WriteLine(policy.CalculateTotalPremium());&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Kods, kas rēķina prēmiju ceļojuma apdro&amp;scaron;inā&amp;scaron;anas polisei:&lt;/p&gt;
&lt;div style="border-bottom:1px dashed;border-left:1px dashed;padding-bottom:3px;padding-left:3px;padding-right:3px;background:#efefef;border-top:1px dashed;border-right:1px dashed;padding-top:3px;"&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span&gt;&lt;span style="color:#0000ff;"&gt;&lt;span style="font-size:10pt;"&gt;public&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:10pt;"&gt; &lt;span&gt;&lt;span style="color:#0000ff;"&gt;decimal&lt;/span&gt;&lt;/span&gt; CalculateTotalPremium()&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;&lt;span style="color:#0000ff;"&gt;foreach&lt;/span&gt;&lt;/span&gt; (&lt;span&gt;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt;&lt;/span&gt; person &lt;span&gt;&lt;span style="color:#0000ff;"&gt;in&lt;/span&gt;&lt;/span&gt; Persons)&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;&lt;/span&gt; (person.Age &amp;lt;= 21 &amp;amp;&amp;amp; person.ActivityType == &lt;span&gt;&lt;span style="color:#2b91af;"&gt;ActivityType&lt;/span&gt;&lt;/span&gt;.Leisure)&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;&lt;/span&gt;.totalPremium += 2.5m * CoverDays;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;&lt;span style="color:#0000ff;"&gt;else&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;&lt;/span&gt; (person.Age &amp;lt;= 21 &amp;amp;&amp;amp; person.ActivityType == &lt;span&gt;&lt;span style="color:#2b91af;"&gt;ActivityType&lt;/span&gt;&lt;/span&gt;.Sport)&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;&lt;/span&gt;.totalPremium += 3.5m * CoverDays;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;&lt;span style="color:#0000ff;"&gt;else&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;&lt;/span&gt; (person.Age &amp;gt; 21 &amp;amp;&amp;amp; person.Age &amp;lt;= 80&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;                 &amp;amp;&amp;amp; person.ActivityType == &lt;span&gt;&lt;span style="color:#2b91af;"&gt;ActivityType&lt;/span&gt;&lt;/span&gt;.Leisure)&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;&lt;/span&gt;.totalPremium += 5.5m * CoverDays;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;&lt;span style="color:#0000ff;"&gt;else&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;&lt;/span&gt; (person.Age &amp;gt; 21 &amp;amp;&amp;amp; person.Age &amp;lt;= 80&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;                 &amp;amp;&amp;amp; person.ActivityType == &lt;span&gt;&lt;span style="color:#2b91af;"&gt;ActivityType&lt;/span&gt;&lt;/span&gt;.Sport)&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;&lt;/span&gt;.totalPremium += 7.5m * CoverDays;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;&lt;span style="color:#0000ff;"&gt;else&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;&lt;/span&gt; (person.Age &amp;gt; 80 &amp;amp;&amp;amp; person.ActivityType == &lt;span&gt;&lt;span style="color:#2b91af;"&gt;ActivityType&lt;/span&gt;&lt;/span&gt;.Leisure)&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;&lt;/span&gt;.totalPremium += 6.5m * CoverDays;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;&lt;span style="color:#0000ff;"&gt;else&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;&lt;/span&gt; (person.Age &amp;gt; 80 &amp;amp;&amp;amp; person.ActivityType == &lt;span&gt;&lt;span style="color:#2b91af;"&gt;ActivityType&lt;/span&gt;&lt;/span&gt;.Sport)&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;&lt;/span&gt;.totalPremium += 9.5m * CoverDays;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span&gt;&lt;span style="font-size:10pt;color:#808080;"&gt;// more rules to come!&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;&lt;/span&gt;.totalPremium;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Kā redzams no koda, tad polises prēmijas aprēķinam nav izvēlēta pati elegantākā un smukākā konstrukcija, kādā veidā tiek rēķināta prēmija konkrētajai polisei.&lt;/p&gt;
&lt;p&gt;Ja bizness izdomās jaunus likumus vai prasības, kādā veidā tiek rēķināta prēmija, tad nepiecie&amp;scaron;ams būs veikt izmaiņas &lt;span style="font-size:x-small;font-family:courier new;"&gt;TravelPolicy&lt;/span&gt; klasē, kas savukārt var izraisīt kļūdas kādos citos sistēmas apgabalos, tādā veidā padarot sistēmu kopsummā nestabilu.&lt;/p&gt;
&lt;p&gt;Lai ievērotu O/C principu, jāpanāk, ka jauna prēmijas aprēķinā&amp;scaron;anas loģika neprasītu izmaiņas &lt;span style="font-size:x-small;font-family:courier new;"&gt;TravelPolicy&lt;/span&gt; klasē, bet gan to būtu ērti un eleganti ieviest sistēmā papildinot tikai noteiktu apgabalu, kas atbild par prēmijas aprēķinu.&lt;/p&gt;
&lt;p&gt;Viens no variantiem, kā to var realizēt, ir ieviest prēmijas kalkulatora elementu, kur&amp;scaron; savukārt tiktu realizēts ar dažādu mazo rēķinātāju implementācijām, kuras tiktu pielietotas katrā no situācijām, kurā konkrētā rēķinā&amp;scaron;anas loģika var tikt pielietota.&lt;/p&gt;
&lt;p&gt;Pirms &amp;scaron;āda veida refaktoringa noteikti ir nepiecie&amp;scaron;ams konkrēto vietu apaudzēt ar vienumu testiem, kas pārbaude eksistējo&amp;scaron;o loģiku un sistēmas uzvedību, tādā veidā iegūstot pārliecību, ka kods un loģika atbilst vismaz tai loģikai, kas bija realizēta iepriek&amp;scaron;.&lt;/p&gt;
&lt;p&gt;Tātad sekojo&amp;scaron;i refaktoringa soļi ir nepiecie&amp;scaron;ami:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Iznest prēmijas aprēķinu ārpus polises klases. &lt;/li&gt;
&lt;li&gt;Pārveidot rēķinā&amp;scaron;anas loģiku un mazākām realizācijām, kuras aprēķina prēmiju pasažieriem pēc nepiecie&amp;scaron;amajiem biznesa nosacījumiem. &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Pirmais refaktoring solis &amp;ndash; iznesam rēķinā&amp;scaron;anas loģiku ārpus polises klases:&lt;/p&gt;
&lt;div style="border-bottom:1px dashed;border-left:1px dashed;padding-bottom:3px;padding-left:3px;padding-right:3px;background:#efefef;border-top:1px dashed;border-right:1px dashed;padding-top:3px;"&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span&gt;&lt;span style="color:#0000ff;"&gt;&lt;span style="font-size:10pt;"&gt;private&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:10pt;"&gt; &lt;span&gt;&lt;span style="color:#0000ff;"&gt;readonly&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span style="color:#2b91af;"&gt;IPremiumCalculator&lt;/span&gt;&lt;/span&gt; calculator;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span&gt;&lt;span style="color:#0000ff;"&gt;&lt;span style="font-size:10pt;"&gt;public&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:10pt;"&gt; TravelPolicy()&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Persons = &lt;span&gt;&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span style="color:#2b91af;"&gt;List&lt;/span&gt;&lt;/span&gt;&amp;lt;&lt;span&gt;&lt;span style="color:#2b91af;"&gt;Person&lt;/span&gt;&lt;/span&gt;&amp;gt;();&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span&gt;&lt;span style="font-size:10pt;color:#808080;"&gt;// use strategy pattern to get instance to calculator&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; calculator = &lt;span&gt;&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span style="color:#2b91af;"&gt;TravelPolicyPremiumCalculator&lt;/span&gt;&lt;/span&gt;();&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Jaunā prēmijas aprēķina metode:&lt;/p&gt;
&lt;div style="border-bottom:1px dashed;border-left:1px dashed;padding-bottom:3px;padding-left:3px;padding-right:3px;background:#efefef;border-top:1px dashed;border-right:1px dashed;padding-top:3px;"&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span&gt;&lt;span style="color:#0000ff;"&gt;&lt;span style="font-size:10pt;"&gt;public&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:10pt;"&gt; &lt;span&gt;&lt;span style="color:#0000ff;"&gt;decimal&lt;/span&gt;&lt;/span&gt; CalculateTotalPremium()&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; totalPremium = calculator.Calculate(&lt;span&gt;&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;&lt;/span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt;&lt;/span&gt; totalPremium;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Prēmijas aprēķinātājs:&lt;/p&gt;
&lt;div style="border-bottom:1px dashed;border-left:1px dashed;padding-bottom:3px;padding-left:3px;padding-right:3px;background:#efefef;border-top:1px dashed;border-right:1px dashed;padding-top:3px;"&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span&gt;&lt;span style="color:#0000ff;"&gt;&lt;span style="font-size:10pt;"&gt;public&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:10pt;"&gt; &lt;span&gt;&lt;span style="color:#0000ff;"&gt;class&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span style="color:#2b91af;"&gt;TravelPolicyPremiumCalculator&lt;/span&gt;&lt;/span&gt; : &lt;/span&gt;&lt;span&gt;&lt;span style="font-size:10pt;color:#2b91af;"&gt;IPremiumCalculator&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span&gt;&lt;span style="color:#0000ff;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #region&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:10pt;"&gt; IPremiumCalculator Members&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span style="color:#0000ff;"&gt;decimal&lt;/span&gt;&lt;/span&gt; Calculate(&lt;span&gt;&lt;span style="color:#2b91af;"&gt;TravelPolicy&lt;/span&gt;&lt;/span&gt; policy)&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;&lt;span style="color:#0000ff;"&gt;decimal&lt;/span&gt;&lt;/span&gt; premium = 0m;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;&lt;span style="color:#0000ff;"&gt;foreach&lt;/span&gt;&lt;/span&gt; (&lt;span&gt;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt;&lt;/span&gt; person &lt;span&gt;&lt;span style="color:#0000ff;"&gt;in&lt;/span&gt;&lt;/span&gt; policy.Persons)&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;&lt;/span&gt; (person.Age &amp;lt;= 21 &amp;amp;&amp;amp; person.ActivityType == &lt;span&gt;&lt;span style="color:#2b91af;"&gt;ActivityType&lt;/span&gt;&lt;/span&gt;.Leisure)&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; premium += 2.5m * policy.CoverDays;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;&lt;span style="color:#0000ff;"&gt;else&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;&lt;/span&gt; (..)&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;        }&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt;&lt;/span&gt; premium;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span&gt;&lt;span style="font-size:10pt;color:#0000ff;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #endregion&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Kā redzams no koda, tad pēc refaktoringa ir sadalītas atbildības: nav vairs polises klase, kas nodarbojas arī ar prēmijas aprēķinu, kā arī ir atsevi&amp;scaron;ķi izdalīts prēmijas aprēķinātājs, ar kuru polises sazinās caur kla&amp;scaron;u interfeisu, tādā veidā paslēpjot implementācijas detaļas prēmijas iegū&amp;scaron;anai, kas savukārt dod iespēju nākotnē aizvietot prēmijas aprēķina loģiku ar kādu pavisam citu realizāciju.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Otrais solis, lai uzlabotu ceļojuma polises prēmijas aprēķina loģiku un vēl vairāk ievērotu O/C principu (jaunas biznesa prasības ievie&amp;scaron;ana neprasītu praktiski nekādu eso&amp;scaron;ā koda pārrakstī&amp;scaron;anu vai modificē&amp;scaron;anu), ir ieviest prēmijas aprēķina noteikumus, kas tiek piemēroti katram no ceļotājiem pēc konkrētām biznesa prasībām.&lt;/p&gt;
&lt;p&gt;Izveidosim noteikumu interfeisu, kas tiks piemērots konkrētā rēķinā&amp;scaron;anas solī:&lt;/p&gt;
&lt;div style="border-bottom:1px dashed;border-left:1px dashed;padding-bottom:3px;padding-left:3px;padding-right:3px;background:#efefef;border-top:1px dashed;border-right:1px dashed;padding-top:3px;"&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span&gt;&lt;span style="color:#0000ff;"&gt;&lt;span style="font-size:10pt;"&gt;public&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:10pt;"&gt; &lt;span&gt;&lt;span style="color:#0000ff;"&gt;interface&lt;/span&gt;&lt;/span&gt; &lt;/span&gt;&lt;span&gt;&lt;span style="font-size:10pt;color:#2b91af;"&gt;ICalculationRule&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;&lt;span style="color:#0000ff;"&gt;bool&lt;/span&gt;&lt;/span&gt; IsMatch(&lt;span&gt;&lt;span style="color:#2b91af;"&gt;Person&lt;/span&gt;&lt;/span&gt; person);&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;&lt;span style="color:#0000ff;"&gt;decimal&lt;/span&gt;&lt;/span&gt; Calculate(&lt;span&gt;&lt;span style="color:#2b91af;"&gt;TravelPolicy&lt;/span&gt;&lt;/span&gt; policy, &lt;span&gt;&lt;span style="color:#2b91af;"&gt;Person&lt;/span&gt;&lt;/span&gt; person);&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Pēc tam izveidojam visus nepiecie&amp;scaron;amos rēķinā&amp;scaron;anas nosacījumus kā kopu.&lt;/p&gt;
&lt;div style="border-bottom:1px dashed;border-left:1px dashed;padding-bottom:3px;padding-left:3px;padding-right:3px;background:#efefef;border-top:1px dashed;border-right:1px dashed;padding-top:3px;"&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span&gt;&lt;span style="color:#0000ff;"&gt;&lt;span style="font-size:10pt;"&gt;private&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:10pt;"&gt; &lt;span&gt;&lt;span style="color:#0000ff;"&gt;readonly&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span style="color:#2b91af;"&gt;List&lt;/span&gt;&lt;/span&gt;&amp;lt;&lt;span&gt;&lt;span style="color:#2b91af;"&gt;ICalculationRule&lt;/span&gt;&lt;/span&gt;&amp;gt; rules;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span&gt;&lt;span style="color:#0000ff;"&gt;&lt;span style="font-size:10pt;"&gt;public&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:10pt;"&gt; TravelPolicyPremiumCalculator()&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;&lt;/span&gt;.rules = &lt;span&gt;&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span style="color:#2b91af;"&gt;List&lt;/span&gt;&lt;/span&gt;&amp;lt;&lt;span&gt;&lt;span style="color:#2b91af;"&gt;ICalculationRule&lt;/span&gt;&lt;/span&gt;&amp;gt;(&lt;span&gt;&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span style="color:#2b91af;"&gt;ICalculationRule&lt;/span&gt;&lt;/span&gt;[]&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span style="color:#2b91af;"&gt;JuniorLeisureRule&lt;/span&gt;&lt;/span&gt;(),&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span style="color:#2b91af;"&gt;JuniorSportRule&lt;/span&gt;&lt;/span&gt;(),&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span style="color:#2b91af;"&gt;AdultLeisureRule&lt;/span&gt;&lt;/span&gt;(),&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span style="color:#2b91af;"&gt;AdultSportRule&lt;/span&gt;&lt;/span&gt;(),&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span style="color:#2b91af;"&gt;OldLeisureRule&lt;/span&gt;&lt;/span&gt;(),&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span style="color:#2b91af;"&gt;OldSportRule&lt;/span&gt;&lt;/span&gt;()&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; });&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Piemērs no viena rēķinā&amp;scaron;anas noteikuma:&lt;/p&gt;
&lt;div style="border-bottom:1px dashed;border-left:1px dashed;padding-bottom:3px;padding-left:3px;padding-right:3px;background:#efefef;border-top:1px dashed;border-right:1px dashed;padding-top:3px;"&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span&gt;&lt;span style="color:#0000ff;"&gt;&lt;span style="font-size:10pt;"&gt;public&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:10pt;"&gt; &lt;span&gt;&lt;span style="color:#0000ff;"&gt;class&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span style="color:#2b91af;"&gt;JuniorLeisureRule&lt;/span&gt;&lt;/span&gt; : &lt;/span&gt;&lt;span&gt;&lt;span style="font-size:10pt;color:#2b91af;"&gt;ICalculationRule&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span style="color:#0000ff;"&gt;bool&lt;/span&gt;&lt;/span&gt; IsMatch(&lt;span&gt;&lt;span style="color:#2b91af;"&gt;Person&lt;/span&gt;&lt;/span&gt; person)&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt;&lt;/span&gt; (person.Age &amp;lt;= 21 &amp;amp;&amp;amp; person.ActivityType == &lt;span&gt;&lt;span style="color:#2b91af;"&gt;ActivityType&lt;/span&gt;&lt;/span&gt;.Leisure);&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span style="color:#0000ff;"&gt;decimal&lt;/span&gt;&lt;/span&gt; Calculate(&lt;span&gt;&lt;span style="color:#2b91af;"&gt;TravelPolicy&lt;/span&gt;&lt;/span&gt; policy, &lt;span&gt;&lt;span style="color:#2b91af;"&gt;Person&lt;/span&gt;&lt;/span&gt; person)&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt;&lt;/span&gt; 2.5m * policy.CoverDays;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Metode &lt;span style="font-size:x-small;font-family:courier new;"&gt;IsMatch()&lt;/span&gt; tiks izmantota, lai katrai personai no saraksta tiktu atrasta konkrēta rēķinā&amp;scaron;anas loģika (vienkār&amp;scaron;ības pēc &amp;scaron;eit netiek risinātas konfliktu situācijas, kad vienai personai tika piemeklētas vairākas rēķinā&amp;scaron;anas loģikas).&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Jaunā uzlabotā prēmijas aprēķinā&amp;scaron;anas metode prēmijas kalkulatorā:&lt;/p&gt;
&lt;div style="border-bottom:1px dashed;border-left:1px dashed;padding-bottom:3px;padding-left:3px;padding-right:3px;background:#efefef;border-top:1px dashed;border-right:1px dashed;padding-top:3px;"&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span&gt;&lt;span style="color:#0000ff;"&gt;&lt;span style="font-size:10pt;"&gt;public&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:10pt;"&gt; &lt;span&gt;&lt;span style="color:#0000ff;"&gt;decimal&lt;/span&gt;&lt;/span&gt; Calculate(&lt;span&gt;&lt;span style="color:#2b91af;"&gt;TravelPolicy&lt;/span&gt;&lt;/span&gt; policy)&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;&lt;span style="color:#0000ff;"&gt;decimal&lt;/span&gt;&lt;/span&gt; premium = 0m;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;&lt;span style="color:#0000ff;"&gt;foreach&lt;/span&gt;&lt;/span&gt; (&lt;span&gt;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt;&lt;/span&gt; person &lt;span&gt;&lt;span style="color:#0000ff;"&gt;in&lt;/span&gt;&lt;/span&gt; policy.Persons)&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt;&lt;/span&gt; rule = &lt;span&gt;&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt;&lt;/span&gt;.rules.FirstOrDefault(r =&amp;gt; r.IsMatch(person));&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;&lt;/span&gt; (rule == &lt;span&gt;&lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;&lt;span style="color:#0000ff;"&gt;throw&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span style="color:#2b91af;"&gt;InvalidOperationException&lt;/span&gt;&lt;/span&gt;(&lt;span&gt;&lt;span style="color:#a31515;"&gt;&amp;quot;No rule found.&amp;quot;&lt;/span&gt;&lt;/span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; premium += rule.Calculate(policy, person);&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt;&lt;/span&gt; premium;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:x-small;"&gt;&lt;span style="font-size:10pt;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Kā redzams, tad pēc refaktoringa kods izskatās pavisam savādāk &amp;ndash; īsāks, sistematizētāks un saprotamāks. Ir izdalītas visas nepiecie&amp;scaron;amās atbildības un katra klase sistēmā ir ar kādu vienu konkrētu mērķi.&lt;/p&gt;
&lt;p&gt;Ja bizness nāks klajā ar jaunu rēķinā&amp;scaron;anas prasību, tad sistēmā atliks:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;izveidot &amp;scaron;o jauno noteikumu &lt;/li&gt;
&lt;li&gt;pievienot to visai noteikumu kopai &lt;/li&gt;
&lt;li&gt;pievienot vienumu testus, kas pārbauda konkrētās prasības realizācijas atbilstību prasītajam. &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Noteikti nevajadzētu aizrauties ar O/C principu jau pa&amp;scaron;ā sākumā un darīt to up-front. Ja klase/komponente ir jāmaina pirmo reizi, to iespējams, ka labāk izdarīt tajā momentā. Ja klase vai komponente jāmaina jau otro reizi, tad iespējams, ka ir piemērotākais moments pārveidot programmas struktūru tā, lai O/C princips tiktu ievērots. &lt;/p&gt;
&lt;p&gt;Jebkurā gadījumā jārēķinās ar to, ka ka O/C principa ievēro&amp;scaron;ana sarežģī koda uzbūvi.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Pirms principa pielieto&amp;scaron;anas ir patiesībā jāapzinās, vai konkrētā izmaiņa pieprasa principa ievēro&amp;scaron;anu un jāizvairās no liekas abstrakcijas ievie&amp;scaron;anas savās sistēmās.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Cerams, ka noderēs!&lt;/p&gt;
&lt;p&gt;Pārējie raksti SOLID sērijā:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;ldquo;&lt;a href="http://dotnet.lv/blogs/vi/archive/2010/10/31/odien-pirmais-no-s-o-l-i-d-grupas-quot-s-quot.aspx"&gt;Single Responsibility Principle&lt;/a&gt;&amp;rdquo; &lt;/li&gt;
&lt;li&gt;&amp;ldquo;Open-Closed Principle&amp;rdquo; &lt;/li&gt;
&lt;li&gt;&amp;ldquo;&lt;a href="http://dotnet.lv/blogs/vi/archive/2011/07/08/odien-n-kamais-rind-ir-l-no-apvien-bas-s-o-l-i-d.aspx"&gt;Liskov Substitution Principle&lt;/a&gt;&amp;rdquo; &lt;/li&gt;
&lt;li&gt;&amp;ldquo;&lt;a href="http://dotnet.lv/blogs/vi/archive/2011/07/10/interface-segregation.aspx"&gt;Interface Segregation Principle&lt;/a&gt;&amp;rdquo; &lt;/li&gt;
&lt;li&gt;&amp;ldquo;&lt;a href="http://dotnet.lv/blogs/vi/archive/2011/07/11/dependency-inversion.aspx"&gt;Dependency Inversion Principle&lt;/a&gt;&amp;rdquo; &lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnet.lv/aggbug.aspx?PostID=30774" width="1" height="1"&gt;</description><category domain="http://dotnet.lv/blogs/vi/archive/tags/Architecture/default.aspx">Architecture</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/Design/default.aspx">Design</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/Practices/default.aspx">Practices</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/SOLID/default.aspx">SOLID</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/Patterns+_2600_amp_3B00_amp/default.aspx">Patterns &amp;amp;amp</category></item><item><title>Šodien pirmais no S.O.L.I.D. grupas - "S"</title><link>http://dotnet.lv/blogs/vi/archive/2010/10/31/odien-pirmais-no-s-o-l-i-d-grupas-quot-s-quot.aspx</link><pubDate>Sun, 31 Oct 2010 20:12:00 GMT</pubDate><guid isPermaLink="false">245d81fd-b543-41d7-a051-d8603c6e9e31:26468</guid><dc:creator>valdis.iljuconoks</dc:creator><slash:comments>6</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnet.lv/blogs/vi/rsscomments.aspx?PostID=26468</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnet.lv/blogs/vi/commentapi.aspx?PostID=26468</wfw:comment><comments>http://dotnet.lv/blogs/vi/archive/2010/10/31/odien-pirmais-no-s-o-l-i-d-grupas-quot-s-quot.aspx#comments</comments><description>&lt;div id="post_content"&gt;
&lt;p&gt;&amp;ldquo;S&amp;rdquo; apzīmē - &lt;strong&gt;The Single Responsibility Principle (SRP)&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;i&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;i&gt;The &lt;strong&gt;S&lt;/strong&gt;ingle Responsibility Principle states that every object should have a single responsibility, and that responsibility should be entirely encapsulated by the class.&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;i&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Tātad &amp;scaron;is pagalvojums definē to, ka klasei ir ieteicams nodarboties un risināt tikai kādu konkrētu noteiktu problēmu. Jo vairāk atbildības uzņemas klase, jo lielāka varbūtība, ka pie izmaiņām, tiks ieviestas un izstrādātas jaunas kļūdas.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Zemāk ir dots pavisam triviāls piemērs, lai uzskatamāk nodemonstrētu &lt;strong&gt;Single Responsibility&lt;/strong&gt; principu. Piemērs ir no apdro&amp;scaron;inā&amp;scaron;anas biznesa, bet tas nekas :)&lt;/p&gt;
&lt;p&gt;Piemēram, ir sistēmā definēts apdro&amp;scaron;inā&amp;scaron;anas pieteikums (InsuranceApplication). Klase pēc savas būtības risina daudzas problēmas, piemēram:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;apdro&amp;scaron;inā&amp;scaron;anas pieteikums ir spējīgs sevi novalidēt jeb pārbaudīt datu pareizīgumu; &lt;/li&gt;
&lt;li&gt;māk izdot polisi; &lt;/li&gt;
&lt;li&gt;un attiecīgi māk arī pabrīdināt klientu par to, ka polise ir sekmīgi izdota. &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Pieņemsim, ka klienta pabrīdinā&amp;scaron;ana nepiecie&amp;scaron;ama tikai internetā (sistēmas komponente &amp;ndash; Web Sales) izdotajām polisēm. Kla&amp;scaron;u diagramma attēlota zemāk.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a rel="lightbox" href="http://dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vi/image_5F00_159FE035.png"&gt;&lt;img width="412" height="247" border="0" src="http://dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vi/image_5F00_thumb_5F00_0CCFD7E9.png" alt="image" title="image" style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:block;float:none;border-top-width:0px;border-bottom-width:0px;margin-left:auto;border-left-width:0px;margin-right:auto;padding-top:0px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Tradicionālajā veidā mēs definētu izdo&amp;scaron;anas metodi (&lt;i&gt;Issue&lt;/i&gt;), kurā savukārt būtu iestrādāta loģika, kas pārbauda, no kuras sistēmas tiek izdota polise, un attiecīgi iekļautu klienta pabrīdinā&amp;scaron;anas (&lt;i&gt;NotifyClient&lt;/i&gt;) metodes izsaukumu savā ķēdītē vai arī gluži pretēji - nē. Zemāk dotais piemērs ir tikai ar placeholderiem, lai lieki nepiesārņotu ēteru..&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style="border-bottom:1px dashed;border-left:1px dashed;padding-bottom:3px;padding-left:3px;padding-right:3px;background:#efefef;border-top:1px dashed;border-right:1px dashed;padding-top:3px;"&gt;
&lt;pre style="margin:0px;"&gt;&lt;span&gt;&lt;span style="color:#0000ff;"&gt;&lt;span style="font-size:10pt;"&gt;public&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:10pt;"&gt; &lt;span&gt;&lt;span style="color:#0000ff;"&gt;class&lt;/span&gt;&lt;/span&gt; &lt;/span&gt;&lt;span&gt;&lt;span style="font-size:10pt;color:#2b91af;"&gt;InsuranceApplication&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:10pt;"&gt;{&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;&lt;/span&gt; SourceSystem { &lt;span&gt;&lt;span style="color:#0000ff;"&gt;get&lt;/span&gt;&lt;/span&gt;; &lt;span&gt;&lt;span style="color:#0000ff;"&gt;set&lt;/span&gt;&lt;/span&gt;; }&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span style="color:#0000ff;"&gt;void&lt;/span&gt;&lt;/span&gt; Issue()&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Validate();&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span&gt;&lt;span style="font-size:10pt;color:#808080;"&gt;// issue logic here&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt;&lt;/span&gt; (SourceSystem == 1)&amp;nbsp; &lt;/span&gt;&lt;span&gt;&lt;span style="font-size:10pt;color:#808080;"&gt;// 1 - web sales&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NotifyClient();&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span style="color:#0000ff;"&gt;void&lt;/span&gt;&lt;/span&gt; NotifyClient()&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt;&lt;/span&gt; &lt;span&gt;&lt;span style="color:#0000ff;"&gt;void&lt;/span&gt;&lt;/span&gt; Validate()&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:10pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="margin:0px;"&gt;&lt;span style="font-size:10pt;"&gt;}&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Viena no pamat kļūdām, kas pieļauta &amp;scaron;ajā koda uzbūvē, ir, &lt;span style="font-family:Courier New;font-size:x-small;"&gt;InsuranceApplication&lt;/span&gt; klase zina pārāk daudz jeb klasei ir jāatbild par pārāk daudzām lietām &amp;ndash; apdro&amp;scaron;inā&amp;scaron;anas pieteikums zina, no kādas sistēmas &amp;scaron;ī konkrētā polise ir bijusi pieteikta un attiecīgi arī reaģē uz to izdo&amp;scaron;anas brīdī &amp;ndash; informējot klientu par jauno polisi tikai un vienīgi interneta polises gadījumā.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Jaunā kla&amp;scaron;u diagramma ievērojot SRP principu būtu apmēram &amp;scaron;āda:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;a rel="lightbox" href="http://dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vi/image_5F00_35F77027.png"&gt;&lt;img width="448" height="348" border="0" src="http://dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vi/image_5F00_thumb_5F00_53894B26.png" alt="image" title="image" style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:block;float:none;border-top-width:0px;border-bottom-width:0px;margin-left:auto;border-left-width:0px;margin-right:auto;padding-top:0px;" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Tātad:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Izveidojam vienu bāzes (abstraktu vai arī virtuālu) klasi, kas reglamentē kopējo jeb generic izskatu apdro&amp;scaron;inā&amp;scaron;anas polises pieteikuma klasei, kas sastāv no validācijas un izdo&amp;scaron;anas metodēm. &lt;/li&gt;
&lt;li&gt;Būtu jānodefinē divas apdro&amp;scaron;inā&amp;scaron;anas pieteikuma apak&amp;scaron;klases, kuras realizētu katrai no sistēmām nepiecie&amp;scaron;amo funkcionalitāti. &lt;/li&gt;
&lt;li&gt;Tikai polises interneta pieteikuma apak&amp;scaron;klasē, būtu realizēta klienta pabrīdinā&amp;scaron;anas funkcionalitāte, jo tā nav nepiecie&amp;scaron;ama BackOffice sistēmā. &lt;/li&gt;
&lt;li&gt;&lt;i&gt;&lt;strong&gt;TODO:&lt;/strong&gt;&lt;/i&gt; nepiecie&amp;scaron;ams būtu arī atdalīt klienta pabrīdinā&amp;scaron;anas komponenti no tie&amp;scaron;as izmanto&amp;scaron;anas interneta polises pieteikuma klasē (gaidi burtu &amp;ldquo;I&amp;rdquo; no S.O.L.I.D. grupas), bet to mēs izdarīsim vēlāk. &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;NB! &lt;/strong&gt;Jāpiemin, ka SRP princips ļoti noder gadījumos, kad mainot kādu no funkcionalitātēm jeb atbildībām, ko uzņemas realizēt klase, nav nepiecie&amp;scaron;ams pārkompilēt arī visas tie&amp;scaron;i saisto&amp;scaron;ās sistēmas. Piemēram, pirmajā variantā, kad netika ievērots vēl SRP princips, mainot klienta pabrīdinā&amp;scaron;anas mehānismu (piemēram, no elektroniskā pasta uz SMS) nāktos pārkompilēt arī backoffice sistēmas komponentes, kurām loģiski nav nekāda sakara ar klienta pabrīdinā&amp;scaron;anas jeb notifikācijas sistēmas komponenti, kas tiek izmantota tikai interneta polisēm.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Ko tad patie&amp;scaron;ām dod &amp;scaron;ī principa ievēro&amp;scaron;ana:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Zemākas pakāpes atkarību (angl. &lt;i&gt;coupling&lt;/i&gt;) starp sistēmas komponentēm un augstākas pakāpes &lt;span style="color:#000000;"&gt;saistība&lt;/span&gt; (angl. &lt;i&gt;cohesion&lt;/i&gt;) sistēmas moduļa vai komponentes iek&amp;scaron;ienē. &lt;/li&gt;
&lt;li&gt;Samazinās &lt;span style="font-family:Courier New;font-size:x-small;"&gt;if&lt;/span&gt; un &lt;span style="font-family:Courier New;font-size:x-small;"&gt;switch&lt;/span&gt; nosacījumu skaitu izejas kodā, jo katra no atbildībām tiek veikta un risināta attiecīgi citā vietā. &lt;/li&gt;
&lt;li&gt;prasību izmaiņas ietekmē pēc iespējas mazāku apgabalu sistēmā, kā rezultātā samazināsies potenciālo problēmu skaits, kas var tikt saražots labojot kādu no problēmām, ko klase risina. &lt;/li&gt;
&lt;li&gt;Vairākas mazas klases ar mazāku jeb specifiskāku atbildību nodro&amp;scaron;ina elastīgāku sistēmas uzbūvi. &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;Scaron;is OO dizainē&amp;scaron;anas princips ir pavisam vienkār&amp;scaron;s un saprotams un nav nekāda raķe&amp;scaron;u zinātne, tomēr, jāsaka, ka esmu secinājis, ka arī cilvēkiem ar &amp;scaron;o dizainu visvairāk problēmas sagādā to atpazīt kodā un pareizajās vietās pielietot.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Cerams, ka noderēs!&lt;/p&gt;
&lt;p&gt;Pārējie raksti SOLID sērijā:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;ldquo;Single Responsibility Principle&amp;rdquo; &lt;/li&gt;
&lt;li&gt;&amp;ldquo;&lt;a href="http://dotnet.lv/blogs/vi/archive/2010/11/21/odienas-gavi-nieks-o-no-s-o-l-i-d-apvien-bas.aspx"&gt;Open-Closed Principle&lt;/a&gt;&amp;rdquo; &lt;/li&gt;
&lt;li&gt;&amp;ldquo;&lt;a href="http://dotnet.lv/blogs/vi/archive/2011/07/08/odien-n-kamais-rind-ir-l-no-apvien-bas-s-o-l-i-d.aspx"&gt;Liskov Substitution Principle&lt;/a&gt;&amp;rdquo; &lt;/li&gt;
&lt;li&gt;&amp;ldquo;&lt;a href="http://dotnet.lv/blogs/vi/archive/2011/07/10/interface-segregation.aspx"&gt;Interface Segregation Principle&lt;/a&gt;&amp;rdquo; &lt;/li&gt;
&lt;li&gt;&amp;ldquo;&lt;a href="http://dotnet.lv/blogs/vi/archive/2011/07/11/dependency-inversion.aspx"&gt;Dependency Inversion Principle&lt;/a&gt;&amp;rdquo; &lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnet.lv/aggbug.aspx?PostID=26468" width="1" height="1"&gt;</description><category domain="http://dotnet.lv/blogs/vi/archive/tags/Patterns+_2600_amp_3B00_+Practices/default.aspx">Patterns &amp;amp; Practices</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/Architecture/default.aspx">Architecture</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/Design/default.aspx">Design</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/Practices/default.aspx">Practices</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/SOLID/default.aspx">SOLID</category></item><item><title>EF metadatu failu ielādes issue</title><link>http://dotnet.lv/blogs/vi/archive/2010/10/30/ef-metadatu-failu-iel-des-issue.aspx</link><pubDate>Fri, 29 Oct 2010 23:13:28 GMT</pubDate><guid isPermaLink="false">245d81fd-b543-41d7-a051-d8603c6e9e31:26393</guid><dc:creator>valdis.iljuconoks</dc:creator><slash:comments>5</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnet.lv/blogs/vi/rsscomments.aspx?PostID=26393</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://dotnet.lv/blogs/vi/commentapi.aspx?PostID=26393</wfw:comment><comments>http://dotnet.lv/blogs/vi/archive/2010/10/30/ef-metadatu-failu-iel-des-issue.aspx#comments</comments><description>&lt;div id="post_content"&gt;   &lt;p&gt;Vienā no projektiem saskāros ar interesantu problēmu.&lt;/p&gt;    &lt;p&gt;Setups projektiem apmēram šāds:&lt;/p&gt;    &lt;ol&gt;     &lt;li&gt;Ir &lt;font color="#000000"&gt;Windows Service &lt;/font&gt;aplikācija, kas kalpo kā entry point servisiem. &lt;/li&gt;      &lt;li&gt;Ir servisu implementācijas bibliotēka, kurā ir realizēts kāds konkrēta servisa darbība. Servisa implementācija izmanto EF datu modeli, lai darbotos ar datubāzi, pieslēgtos un iegūtu datus, manipulētu ar tiem un saglabātu atpakaļ datubāzē. &lt;/li&gt;      &lt;li&gt;Servisa pārvaldnieks ielādē servisu dinamiski (izmantojot reflekciju – System.Reflection), jo tas esot labāk, ērtāk un elastīgāk. &lt;/li&gt;   &lt;/ol&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;p&gt;Daļa no servisa pārvaldnieka realizācijas (&lt;font size="2"&gt;&lt;font face="Courier New"&gt;dynamic&lt;/font&gt; &lt;/font&gt;keywords ir tikai ātrākai un ērtākai piemēra parādīšanai – patiesībā reālā dzīvē nekad neesmu izmantojis šo iespēju :)):&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;div style="border-bottom:1px dashed;border-left:1px dashed;padding-bottom:3px;padding-left:3px;padding-right:3px;background:#efefef;border-top:1px dashed;border-right:1px dashed;padding-top:3px;"&gt;     &lt;pre style="margin:0px;"&gt;&lt;span&gt;&lt;font color="#0000ff"&gt;&lt;font style="font-size:10pt;"&gt;var&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font style="font-size:10pt;"&gt; asm = &lt;span&gt;&lt;font color="#2b91af"&gt;Assembly&lt;/font&gt;&lt;/span&gt;.Load(&lt;span&gt;&lt;font color="#a31515"&gt;&amp;quot;ClassLibrary&amp;quot;&lt;/font&gt;&lt;/span&gt;);&lt;/font&gt;&lt;/pre&gt;

    &lt;pre style="margin:0px;"&gt;&lt;span&gt;&lt;font color="#0000ff"&gt;&lt;font style="font-size:10pt;"&gt;var&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font style="font-size:10pt;"&gt; typ = asm.GetType(&lt;span&gt;&lt;font color="#a31515"&gt;&amp;quot;ClassLibrary.Class1&amp;quot;&lt;/font&gt;&lt;/span&gt;);&lt;/font&gt;&lt;/pre&gt;

    &lt;pre style="margin:0px;"&gt;&lt;span&gt;&lt;font color="#0000ff"&gt;&lt;font style="font-size:10pt;"&gt;dynamic&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font style="font-size:10pt;"&gt; instance = &lt;span&gt;&lt;font color="#2b91af"&gt;Activator&lt;/font&gt;&lt;/span&gt;.CreateInstance(typ);&lt;/font&gt;&lt;/pre&gt;

    &lt;pre style="margin:0px;"&gt;&lt;span&gt;&lt;font color="#0000ff"&gt;&lt;font style="font-size:10pt;"&gt;var&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font style="font-size:10pt;"&gt; result = instance.GetCount();&lt;/font&gt;&lt;/pre&gt;
  &lt;/div&gt;

  &lt;p&gt;&amp;#160;&lt;/p&gt;

  &lt;p&gt;Fragments no servisa implementācijas realizācijas:&lt;/p&gt;

  &lt;p&gt;&amp;#160;&lt;/p&gt;

  &lt;div style="border-bottom:1px dashed;border-left:1px dashed;padding-bottom:3px;padding-left:3px;padding-right:3px;background:#efefef;border-top:1px dashed;border-right:1px dashed;padding-top:3px;"&gt;
    &lt;pre style="margin:0px;"&gt;&lt;span&gt;&lt;font color="#0000ff"&gt;&lt;font style="font-size:10pt;"&gt;public&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font style="font-size:10pt;"&gt; &lt;span&gt;&lt;font color="#0000ff"&gt;int&lt;/font&gt;&lt;/span&gt; GetCount()&lt;/font&gt;&lt;/pre&gt;

    &lt;pre style="margin:0px;"&gt;&lt;font style="font-size:10pt;"&gt;{&lt;/font&gt;&lt;/pre&gt;

    &lt;pre style="margin:0px;"&gt;&lt;font style="font-size:10pt;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span&gt;&lt;font color="#0000ff"&gt;int&lt;/font&gt;&lt;/span&gt; result = -1;&lt;/font&gt;&lt;/pre&gt;

    &lt;pre style="margin:0px;"&gt;&lt;font style="font-size:10pt;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span&gt;&lt;font color="#0000ff"&gt;using&lt;/font&gt;&lt;/span&gt; (&lt;span&gt;&lt;font color="#0000ff"&gt;var&lt;/font&gt;&lt;/span&gt; ctx = &lt;span&gt;&lt;font color="#0000ff"&gt;new&lt;/font&gt;&lt;/span&gt; &lt;span&gt;&lt;font color="#2b91af"&gt;DemoEntities&lt;/font&gt;&lt;/span&gt;())&lt;/font&gt;&lt;/pre&gt;

    &lt;pre style="margin:0px;"&gt;&lt;font style="font-size:10pt;"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/font&gt;&lt;/pre&gt;

    &lt;pre style="margin:0px;"&gt;&lt;font style="font-size:10pt;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; result = ctx.Table1.Count();&lt;/font&gt;&lt;/pre&gt;

    &lt;pre style="margin:0px;"&gt;&lt;font style="font-size:10pt;"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/font&gt;&lt;/pre&gt;

    &lt;pre style="margin:0px;"&gt;&lt;font style="font-size:10pt;"&gt;&amp;#160;&lt;/font&gt;&lt;/pre&gt;

    &lt;pre style="margin:0px;"&gt;&lt;font style="font-size:10pt;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span&gt;&lt;font color="#0000ff"&gt;return&lt;/font&gt;&lt;/span&gt; result;&lt;/font&gt;&lt;/pre&gt;

    &lt;pre style="margin:0px;"&gt;&lt;font style="font-size:10pt;"&gt;}&lt;/font&gt;&lt;/pre&gt;
  &lt;/div&gt;

  &lt;p&gt;&amp;#160;&lt;/p&gt;

  &lt;p&gt;Kad no servisa pārvaldnieka notiek servisa implementācijas ielāde un izpilde, pēkšņi saņemam sekojošu kļūdas paziņojumu:&lt;/p&gt;

  &lt;p&gt;&amp;#160;&lt;/p&gt;

  &lt;p&gt;&lt;a href="http://dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vi/image_5F00_146B85C5.png" rel="lightbox"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:block;float:none;border-top-width:0px;border-bottom-width:0px;margin-left:auto;border-left-width:0px;margin-right:auto;padding-top:0px;" title="" border="0" alt="" src="http://dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vi/image_5F00_thumb_5F00_5622BB53.png" width="631" height="189" /&gt;&lt;/a&gt;&lt;/p&gt;

  &lt;p&gt;&amp;#160;&lt;/p&gt;

  &lt;p&gt;Kļūdas paziņojums ir pat ļoti OK, jo secinām, ka servisa pārvaldnieka konfigurācijā nepieciešams arī nokonfigurēt EF pieejas un mapping datus, something like this:&lt;/p&gt;

  &lt;p&gt;&amp;#160;&lt;/p&gt;

  &lt;div style="border-bottom:1px dashed;border-left:1px dashed;padding-bottom:3px;padding-left:3px;padding-right:3px;background:#efefef;border-top:1px dashed;border-right:1px dashed;padding-top:3px;"&gt;
    &lt;pre style="margin:0px;"&gt;&lt;span&gt;&lt;font color="#0000ff"&gt;&lt;font style="font-size:10pt;"&gt;&amp;lt;?&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font style="font-size:10pt;"&gt;&lt;span&gt;&lt;font color="#a31515"&gt;xml&lt;/font&gt;&lt;/span&gt;&lt;span&gt;&lt;font color="#0000ff"&gt; &lt;/font&gt;&lt;/span&gt;&lt;span&gt;&lt;font color="#ff0000"&gt;version&lt;/font&gt;&lt;/span&gt;&lt;span&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;/span&gt;&amp;quot;&lt;span&gt;&lt;font color="#0000ff"&gt;1.0&lt;/font&gt;&lt;/span&gt;&amp;quot;&lt;span&gt;&lt;font color="#0000ff"&gt; &lt;/font&gt;&lt;/span&gt;&lt;span&gt;&lt;font color="#ff0000"&gt;encoding&lt;/font&gt;&lt;/span&gt;&lt;span&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;/span&gt;&amp;quot;&lt;span&gt;&lt;font color="#0000ff"&gt;utf-8&lt;/font&gt;&lt;/span&gt;&amp;quot;&lt;/font&gt;&lt;span&gt;&lt;font style="font-size:10pt;" color="#0000ff"&gt;?&amp;gt;&lt;/font&gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="margin:0px;"&gt;&lt;span&gt;&lt;font color="#0000ff"&gt;&lt;font style="font-size:10pt;"&gt;&amp;lt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font style="font-size:10pt;"&gt;&lt;span&gt;&lt;font color="#a31515"&gt;configuration&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;span&gt;&lt;font style="font-size:10pt;" color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="margin:0px;"&gt;&lt;span&gt;&lt;font color="#0000ff"&gt;&lt;font style="font-size:10pt;"&gt;&amp;#160; &amp;lt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font style="font-size:10pt;"&gt;&lt;span&gt;&lt;font color="#a31515"&gt;connectionStrings&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;span&gt;&lt;font style="font-size:10pt;" color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="margin:0px;"&gt;&lt;span&gt;&lt;font color="#0000ff"&gt;&lt;font style="font-size:10pt;"&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font style="font-size:10pt;"&gt;&lt;span&gt;&lt;font color="#a31515"&gt;add&lt;/font&gt;&lt;/span&gt;&lt;span&gt;&lt;font color="#0000ff"&gt; &lt;/font&gt;&lt;/span&gt;&lt;span&gt;&lt;font color="#ff0000"&gt;name&lt;/font&gt;&lt;/span&gt;&lt;span&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;/span&gt;&amp;quot;&lt;span&gt;&lt;font color="#0000ff"&gt;DemoEntities&lt;/font&gt;&lt;/span&gt;&amp;quot;&lt;font color="#0000ff"&gt;&lt;br /&gt;         &lt;/font&gt;&lt;span&gt;&lt;font color="#ff0000"&gt;connectionString&lt;/font&gt;&lt;/span&gt;&lt;span&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;/span&gt;&amp;quot;&lt;span&gt;&lt;font color="#0000ff"&gt;metadata=res://*/DataModel.csdl|res://*/DataModel.ssdl|&lt;br /&gt;                           res://*/DataModel.msl;provider=System.Data.SqlClient;&lt;br /&gt;                           provider connection string=&lt;/font&gt;&lt;/span&gt;&lt;span&gt;&lt;font color="#ff0000"&gt;&amp;amp;quot;&lt;br /&gt;                           &lt;/font&gt;&lt;/span&gt;&lt;span&gt;&lt;font color="#0000ff"&gt;Data Source=localhost;Initial Catalog=EF_DEMO;&lt;br /&gt;                           Integrated Security=True;&lt;br /&gt;                           MultipleActiveResultSets=True&lt;/font&gt;&lt;/span&gt;&lt;span&gt;&lt;font color="#ff0000"&gt;&amp;amp;quot;&lt;/font&gt;&lt;/span&gt;&amp;quot;&lt;font color="#0000ff"&gt;&lt;br /&gt;         &lt;/font&gt;&lt;span&gt;&lt;font color="#ff0000"&gt;providerName&lt;/font&gt;&lt;/span&gt;&lt;span&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;&lt;/span&gt;&amp;quot;&lt;span&gt;&lt;font color="#0000ff"&gt;System.Data.EntityClient&lt;/font&gt;&lt;/span&gt;&amp;quot;&lt;/font&gt;&lt;span&gt;&lt;font style="font-size:10pt;" color="#0000ff"&gt; /&amp;gt;&lt;/font&gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="margin:0px;"&gt;&lt;span&gt;&lt;font color="#0000ff"&gt;&lt;font style="font-size:10pt;"&gt;&amp;#160; &amp;lt;/&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font style="font-size:10pt;"&gt;&lt;span&gt;&lt;font color="#a31515"&gt;connectionStrings&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;span&gt;&lt;font style="font-size:10pt;" color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="margin:0px;"&gt;&lt;span&gt;&lt;font color="#0000ff"&gt;&lt;font style="font-size:10pt;"&gt;&amp;lt;/&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font style="font-size:10pt;"&gt;&lt;span&gt;&lt;font color="#a31515"&gt;configuration&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;span&gt;&lt;font style="font-size:10pt;" color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;/span&gt;&lt;/pre&gt;
  &lt;/div&gt;

  &lt;p&gt;&amp;#160;&lt;/p&gt;

  &lt;p&gt;Tomēr, kad pēc šāda veida vingrojuma izdarīšanas savā trace plūsmā redzam paziņojumu:&lt;/p&gt;

  &lt;p&gt;&amp;#160;&lt;/p&gt;

  &lt;p&gt;&lt;font size="2" face="Courier New"&gt;System.ArgumentException: The specified default EntityContainer name &amp;#39;DemoEntities&amp;#39; could not be found in the mapping and metadata information. 
      &lt;br /&gt;Parameter name: defaultContainerName 

      &lt;br /&gt;at System.Data.Metadata.Edm.ClrPerspective.SetDefaultContainer(String defaultContainerName) 

      &lt;br /&gt;at System.Data.Objects.ObjectContext.set_DefaultContainerName(String value) 

      &lt;br /&gt;at System.Data.Objects.ObjectContext..ctor(EntityConnection connection, String defaultContainerName) 

      &lt;br /&gt;at ClassLibrary.DemoEntities..ctor(EntityConnection connection) in …&lt;/font&gt;&lt;/p&gt;

  &lt;p&gt;&amp;#160;&lt;/p&gt;

  &lt;p&gt;tajā momentā gribas kliegt – WTF??&lt;/p&gt;

  &lt;p&gt;&amp;#160;&lt;/p&gt;

  &lt;p&gt;Pēc apmēram puses no darba dienas, kad pārrakts ir gandrīz viss savs kods, izdarbināti dažādi memory dump un atkļūdošanas rīki (vēl joprojām uzskatu, ka windbg ir &lt;a href="http://dotnet.lv/blogs/vi/archive/2008/06/02/ko-ies-kt-ar-try-catch-bloku-ra-o-anas-vid.aspx" target="_blank"&gt;labākais&lt;/a&gt; Tavs ražošanas vides draugs) nākas atgriezties pie developera “kad nestrādā” rīku sequences pēdējā tooļa – Read F* Manual.&lt;/p&gt;

  &lt;p&gt;&amp;#160;&lt;/p&gt;

  &lt;p&gt;MSDN ieraksts par šo tēmu runā sekojošo:&lt;/p&gt;

  &lt;p&gt;&amp;#160;&lt;/p&gt;

  &lt;p&gt;&lt;em&gt;The full name of an assembly with the embedded resource. The name includes the simple name, version name, supported culture, and public key, as follows: &lt;/em&gt;&lt;/p&gt;

  &lt;p&gt;&lt;code&gt;&lt;em&gt;ResourceLib, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null&lt;/em&gt;&lt;/code&gt;&lt;/p&gt;

  &lt;p&gt;&lt;em&gt;Resources can be embedded in any assembly that is accessible by the application.&lt;/em&gt;&lt;/p&gt;

  &lt;p&gt;&lt;em&gt;If you specify a wildcard (*) for &lt;strong&gt;assemblyFullName&lt;/strong&gt;, the Entity Framework runtime will search for resources in the following locations, in this order:&lt;/em&gt;&lt;/p&gt;

  &lt;ol&gt;
    &lt;li&gt;&lt;em&gt;The calling assembly. &lt;/em&gt;&lt;/li&gt;

    &lt;li&gt;&lt;em&gt;The referenced assemblies. &lt;/em&gt;&lt;/li&gt;

    &lt;li&gt;&lt;em&gt;The assemblies in the bin directory of an application. &lt;/em&gt;&lt;/li&gt;
  &lt;/ol&gt;

  &lt;p&gt;&lt;em&gt;If the files are not in one of these locations, an exception will be thrown. &lt;/em&gt;&lt;/p&gt;

  &lt;p&gt;&amp;#160;&lt;/p&gt;

  &lt;p&gt;&amp;#160;&lt;/p&gt;

  &lt;p&gt;Uzmanību piesaistīja tieši wildcard lietošanas piezīmes 2. punkts – referenced assemblies. Cik zināms, tad Windows Service nestartējas tajā direktorijā, kurā .exe fails fiziski atrodas, bet gan &lt;font size="2" face="Courier New"&gt;%SystemDirectory%&lt;/font&gt;. tā kā 1. un 3. punkts diezvai šajā gadījumā nostrādā. Šī hipotēze tika apstiprināta arī ar Windows Forms testa klienta izveidi tieši tam pašam servisa implementācijas apgabalam, simulējot servisa pārvaldnieka darbību no Windows Forms aplikācijas.&lt;/p&gt;

  &lt;p&gt;&amp;#160;&lt;/p&gt;

  &lt;p&gt;Nākamais solis bija izpētīt referencētās bibliotēkas no servisa pārvaldnieka puses. Par cik servisa pārvaldnieks izsauc servisa implementāciju dinamiski, tad references, kas būtu veidotas no Visual Studio, protams, ka nebija. Tomēr servisa implementācijas bibliotēkas pielikšana servisa pārvaldnieka projektam kā referenci šo interesanto problēmu nerisināja.&lt;/p&gt;

  &lt;p&gt;Kā izrādās, tad pieliekot klāt referenci uz kādu citu bibliotēku Windows aplikācijai un neizmantojot *nevienu* tipu no šīs bibliotēkas, saka priekšā kompilatora optimizācijas departamentam: “Lūdzu, neraksti šo particular bibliotēku pie savu bibliotēku referencēm, jo mums viņa hr** zin kāpēc ir piereģistrēta kā reference, neko taču no viņas mēs neizmantojam!”&lt;/p&gt;

  &lt;p&gt;Zemāk arī redzams piemērā:&lt;/p&gt;

  &lt;p&gt;&amp;#160;&lt;/p&gt;

  &lt;p&gt;&lt;a href="http://dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vi/image_5F00_19AA46A9.png" rel="lightbox"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:block;float:none;border-top-width:0px;border-bottom-width:0px;margin-left:auto;border-left-width:0px;margin-right:auto;padding-top:0px;" title="image" border="0" alt="image" src="http://dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vi/image_5F00_thumb_5F00_1DD41E6E.png" width="527" height="255" /&gt;&lt;/a&gt;&lt;/p&gt;

  &lt;p&gt;&amp;#160;&lt;/p&gt;

  &lt;p&gt;Lai nepieciešamās bibliotēkas parādītos “References” sadaļā un EF noklusētais ielādes mehānisms darbotos korekti, nepieciešams pielietot vismaz vienu kādu tipu no nepieciešamās bibliotēkas. Tā arī izdarījām:&lt;/p&gt;

  &lt;p&gt;&amp;#160;&lt;/p&gt;

  &lt;div style="border-bottom:1px dashed;border-left:1px dashed;padding-bottom:3px;padding-left:3px;padding-right:3px;background:#efefef;border-top:1px dashed;border-right:1px dashed;padding-top:3px;"&gt;
    &lt;pre style="margin:0px;"&gt;&lt;span&gt;&lt;font color="#0000ff"&gt;&lt;font style="font-size:10pt;"&gt;namespace&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;font style="font-size:10pt;"&gt; ReferenceDemoWinService&lt;/font&gt;&lt;/pre&gt;

    &lt;pre style="margin:0px;"&gt;&lt;font style="font-size:10pt;"&gt;{&lt;/font&gt;&lt;/pre&gt;

    &lt;pre style="margin:0px;"&gt;&lt;font style="font-size:10pt;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span&gt;&lt;font color="#0000ff"&gt;internal&lt;/font&gt;&lt;/span&gt; &lt;span&gt;&lt;font color="#0000ff"&gt;static&lt;/font&gt;&lt;/span&gt; &lt;span&gt;&lt;font color="#0000ff"&gt;class&lt;/font&gt;&lt;/span&gt; &lt;/font&gt;&lt;span&gt;&lt;font style="font-size:10pt;" color="#2b91af"&gt;Program&lt;/font&gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="margin:0px;"&gt;&lt;font style="font-size:10pt;"&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/font&gt;&lt;/pre&gt;

    &lt;pre style="margin:0px;"&gt;&lt;font style="font-size:10pt;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span&gt;&lt;font color="#c0c0c0"&gt;///&lt;/font&gt;&lt;/span&gt;&lt;span&gt;&lt;font color="#808080"&gt; &lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;span&gt;&lt;font style="font-size:10pt;" color="#c0c0c0"&gt;&amp;lt;summary&amp;gt;&lt;/font&gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="margin:0px;"&gt;&lt;font style="font-size:10pt;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span&gt;&lt;font color="#c0c0c0"&gt;///&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;span&gt;&lt;font style="font-size:10pt;" color="#808080"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; The main entry point for the application.&lt;/font&gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="margin:0px;"&gt;&lt;font style="font-size:10pt;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span&gt;&lt;font color="#c0c0c0"&gt;///&lt;/font&gt;&lt;/span&gt;&lt;span&gt;&lt;font color="#808080"&gt; &lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;span&gt;&lt;font style="font-size:10pt;" color="#c0c0c0"&gt;&amp;lt;/summary&amp;gt;&lt;/font&gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;pre style="margin:0px;"&gt;&lt;font style="font-size:10pt;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span&gt;&lt;font color="#0000ff"&gt;private&lt;/font&gt;&lt;/span&gt; &lt;span&gt;&lt;font color="#0000ff"&gt;static&lt;/font&gt;&lt;/span&gt; &lt;span&gt;&lt;font color="#0000ff"&gt;void&lt;/font&gt;&lt;/span&gt; Main()&lt;/font&gt;&lt;/pre&gt;

    &lt;pre style="margin:0px;"&gt;&lt;font style="font-size:10pt;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; {&lt;/font&gt;&lt;/pre&gt;

    &lt;pre style="margin:0px;"&gt;&lt;font style="font-size:10pt;"&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&gt;&lt;font color="#0000ff"&gt;var&lt;/font&gt;&lt;/span&gt; dummyReferenceType = &lt;span&gt;&lt;font color="#0000ff"&gt;new&lt;/font&gt;&lt;/span&gt; ClassLibrary.&lt;span&gt;&lt;font color="#2b91af"&gt;Class1&lt;/font&gt;&lt;/span&gt;();&lt;/font&gt;&lt;/pre&gt;

    &lt;pre style="margin:0px;"&gt;&lt;font style="font-size:10pt;"&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&gt;&lt;font color="#2b91af"&gt;ServiceBase&lt;/font&gt;&lt;/span&gt;.Run(&lt;span&gt;&lt;font color="#0000ff"&gt;new&lt;/font&gt;&lt;/span&gt; &lt;span&gt;&lt;font color="#2b91af"&gt;ServiceBase&lt;/font&gt;&lt;/span&gt;[] { &lt;span&gt;&lt;font color="#0000ff"&gt;new&lt;/font&gt;&lt;/span&gt; &lt;span&gt;&lt;font color="#2b91af"&gt;Service1&lt;/font&gt;&lt;/span&gt;() });&lt;/font&gt;&lt;/pre&gt;

    &lt;pre style="margin:0px;"&gt;&lt;font style="font-size:10pt;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/font&gt;&lt;/pre&gt;

    &lt;pre style="margin:0px;"&gt;&lt;font style="font-size:10pt;"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/font&gt;&lt;/pre&gt;

    &lt;pre style="margin:0px;"&gt;&lt;font style="font-size:10pt;"&gt;}&lt;/font&gt;&lt;/pre&gt;
  &lt;/div&gt;

  &lt;p&gt;&amp;#160;&lt;/p&gt;

  &lt;p&gt;Skatoties uz servisa pārvaldnieka bibliotēku:&lt;/p&gt;

  &lt;p&gt;&amp;#160;&lt;/p&gt;

  &lt;p&gt;&lt;a href="http://dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vi/image_5F00_59D03A56.png" rel="lightbox"&gt;&lt;img style="background-image:none;border-right-width:0px;padding-left:0px;padding-right:0px;display:block;float:none;border-top-width:0px;border-bottom-width:0px;margin-left:auto;border-left-width:0px;margin-right:auto;padding-top:0px;" title="image" border="0" alt="image" src="http://dotnet.lv/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/vi/image_5F00_thumb_5F00_49E0F592.png" width="550" height="234" /&gt;&lt;/a&gt;&lt;/p&gt;

  &lt;p&gt;&amp;#160;&lt;/p&gt;

  &lt;p&gt;References jau izskatās labāk un EF ir vieglāk strādāt – t.i., pēc references uz servisa implementāciju pielikšanas un kāda no tipa izmantošanas savā kodā, veicināja bibliotēkas parādīšanos “References” sadaļā servisa pārvaldnieka projektā un veicināja arī EF ielādēt meta datu failus pareizi un no attiecīgās bibliotēkas.&lt;/p&gt;

  &lt;p&gt;&amp;#160;&lt;/p&gt;

  &lt;p&gt;&amp;#160;&lt;/p&gt;

  &lt;p&gt;Cerams, ka noderēs un nebūs Jums jāpavada pāris stundas vienkārši blenžot monitorā un mēģinot izdomāt, kas par lietu.&lt;/p&gt;

  &lt;p&gt;&lt;em&gt;Happy coding!&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://dotnet.lv/aggbug.aspx?PostID=26393" width="1" height="1"&gt;</description><category domain="http://dotnet.lv/blogs/vi/archive/tags/Architecture/default.aspx">Architecture</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/Design/default.aspx">Design</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/Entity+Framework/default.aspx">Entity Framework</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/Visual+Studio+2010/default.aspx">Visual Studio 2010</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/C_2300_+4.0/default.aspx">C# 4.0</category><category domain="http://dotnet.lv/blogs/vi/archive/tags/Deployment/default.aspx">Deployment</category></item></channel></rss>