<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.microsoft.co.il/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/"><channel><title>Smallfish</title><link>http://blogs.microsoft.co.il/blogs/smallfish/</link><description>Tips, Tricks, Shticks &amp;amp; Anything That Can Help You Be better Developer</description><dc:language>en</dc:language><generator>CommunityServer 2007.1 (Build: 20917.1142)</generator><item><title>Quality Code Short Tip #3 – Use Nested Class for Constants</title><link>http://blogs.microsoft.co.il/blogs/smallfish/archive/2009/12/25/quality-code-short-tip-3-use-nested-class-for-constants.aspx</link><pubDate>Fri, 25 Dec 2009 16:15:00 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:475853</guid><dc:creator>Yair Cohen</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/smallfish/rsscomments.aspx?PostID=475853</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/smallfish/commentapi.aspx?PostID=475853</wfw:comment><comments>http://blogs.microsoft.co.il/blogs/smallfish/archive/2009/12/25/quality-code-short-tip-3-use-nested-class-for-constants.aspx#comments</comments><description>&lt;p&gt;One of the ‘best-practice’ and code styling guidelines say that you need to use constants instead of literals for more readability and ease of maintenance. Among the usages there are time that you want to specify database field names, xml attribute / element names and etc. In such cases the code easily get messed with dozens of constants around the code and make it harder to find the constant you need. &lt;/p&gt;  &lt;p&gt;A little trick can aid here: &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Instead of:&lt;/strong&gt;&lt;/p&gt;  &lt;div class="csharpcode"&gt;   &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;class&lt;/span&gt; TheClassUsingTheConstants&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;{&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;const&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; CustomerIdField = “CustomerId”;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;const&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; CustomerNameField = “CustomerName”;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;const&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; TaskIdField = “TaskId”;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;const&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; TaskTitleField = “TaskTitle”;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; UseConstants(IDataReader reader)&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;    {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;           var fieldValue = reader[CustomerIdField];&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;    }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;}&lt;/pre&gt;
&lt;/div&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, &amp;quot;Courier New&amp;quot;, courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }

&lt;p&gt;&lt;strong&gt;Use:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;class&lt;/span&gt; TheClassUsingTheConstants&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;{&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; CustomerFields&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;    {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;const&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Id = “CustomerId”;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;const&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Name = “CustomerName”;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;    }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; TaskFields&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;    {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;         &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;const&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Id= “TaskId”;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;         &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;const&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Name = “TaskTitle”;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;    }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; UseConstants(IDataReader reader)&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;    {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;           var fieldValue = reader[CustomerFields.Id];&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;    }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;}&lt;/pre&gt;
&lt;/div&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, &amp;quot;Courier New&amp;quot;, courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=475853" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/smallfish/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://blogs.microsoft.co.il/blogs/smallfish/archive/tags/Tip/default.aspx">Tip</category><category domain="http://blogs.microsoft.co.il/blogs/smallfish/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/smallfish/archive/tags/C_2300_+3.0/default.aspx">C# 3.0</category><category domain="http://blogs.microsoft.co.il/blogs/smallfish/archive/tags/Quality/default.aspx">Quality</category></item><item><title>Session Manager (post on post on post)</title><link>http://blogs.microsoft.co.il/blogs/smallfish/archive/2009/12/21/session-manager-post-on-post-on-post.aspx</link><pubDate>Mon, 21 Dec 2009 13:52:00 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:474171</guid><dc:creator>Yair Cohen</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/smallfish/rsscomments.aspx?PostID=474171</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/smallfish/commentapi.aspx?PostID=474171</wfw:comment><comments>http://blogs.microsoft.co.il/blogs/smallfish/archive/2009/12/21/session-manager-post-on-post-on-post.aspx#comments</comments><description>&lt;p&gt;Today I read the &lt;a href="http://blogs.microsoft.co.il/blogs/ranw" target="_blank"&gt;Ran Wahle&lt;/a&gt;’s &lt;a href="http://blogs.microsoft.co.il/blogs/ranw/archive/2009/12/20/session-manager.aspx" target="_blank"&gt;&amp;quot;Session manager&amp;quot;&lt;/a&gt; that was (kind of) response to &lt;a href="http://blogs.microsoft.co.il/blogs/shlomo/"&gt;Shlomo Goldberg&lt;/a&gt;’s &lt;a href="http://blogs.microsoft.co.il/blogs/shlomo/archive/2009/12/20/session-manager.aspx" target="_blank"&gt;post&lt;/a&gt; about a way to use the session state in type-safe way. Because I tried out both approaches but was only satisfied with another (slightly sharper approach to Ran’s) and I will be glad to share it too (as in all other fields, pick the best that works for you project in hand).&lt;/p&gt;  &lt;p&gt;After several projects I have got to conclusion that there is no need for more than one object graph in the session, the more variables, the more your project get messy (without correlation of the method used). So, I’m designing a tree (each project by its own) that will contain the ‘sessional’ information. This leaves us with one (and only) session property to handle with the session state, all other properties are within the ‘root object’ tree (nested object-type properties). &lt;/p&gt;  &lt;p&gt;My object will look like:&lt;/p&gt;  &lt;p&gt;public class UserSessionInfo   &lt;br /&gt;{    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public const string SessionKey = &amp;quot;CurrentUser&amp;quot;;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;public string UserName { get; set; }&lt;/p&gt;    &lt;p&gt;public ShppingCart Cart { get; set;}&lt;/p&gt;    &lt;p&gt;//… other related properties …&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;}&lt;/p&gt;  &lt;p&gt;The session initialization will take place in the &lt;strong&gt;AccountController&lt;/strong&gt; (it is a project for learning the &lt;a href="http://asp.net/mvc" target="_blank"&gt;ASP.NET MVC&lt;/a&gt; using the default… ) right after successful login (in a method ‘SetUserSessionInfo’).&lt;/p&gt;  &lt;p&gt;The other place is a ControllerBase, that is a controller that all other controllers derive from (if it was more complex project / WebForms may be another approach like IHttpModule or PageBase) and the initialization is done in &lt;strong&gt;ValidateUserSession&lt;/strong&gt; that is called whenever the session is required from the Controller.Initialize method override (in this case is always but the login / register actions when the request is not authenticated). Of course (following &lt;a href="http://en.wikipedia.org/wiki/Law_of_Demeter" target="_blank"&gt;Law of Demeter&lt;/a&gt;), I expose a protected property accessors for the properties (usually they will be readonly, but irrelevant for the discussion) like:&lt;/p&gt;  &lt;p&gt;protected string UserName&lt;/p&gt;  &lt;p&gt;{&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; get { return m_currentUser.UserName; } // where ‘m_currentUser’ is a reference to the session object stored in the ValidateUserSession method.&lt;/p&gt;  &lt;p&gt;}&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Advanteges:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;1. You / your team needs to handle only one object which is designed carefully and well thought off instead any one adding parameters here and there loosing the control.&lt;/p&gt;  &lt;p&gt;2. This is the other side of ‘&lt;a href="http://en.wikipedia.org/wiki/Single_responsibility_principle" target="_blank"&gt;Single Responsibility Principle&lt;/a&gt;’ by &lt;a href="http://en.wikipedia.org/wiki/Robert_Cecil_Martin" target="_blank"&gt;Robert C. Martin&lt;/a&gt;, whereas only one object in the whole system (maybe a ‘parent’ object) is used to access ‘sessional’ information.&lt;/p&gt;  &lt;p&gt;3. One may ask if it doesn’t have performance penalty because of all information stored in the session. Good question, but you can always leave a reference (like the Cart property) to null taking only the reference bytes (4 / 8) which is neglect able.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Disadvanteges:&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Slightly more work of design and thinking… (or does it advantage ;-) )&lt;/p&gt;  &lt;p&gt;And final notes about other implementations:&lt;/p&gt;  &lt;p&gt;1. Using singleton tightly coupled your whole project to the type and the same instance, which is horrified for testing and it is the ‘most misused design pattern’ i have ever saw.&lt;/p&gt;  &lt;p&gt;2. As a good citizen of .net, please forget that the keyword &lt;strong&gt;‘sealed’ &lt;/strong&gt;ever existed (future post), in this case (if it was written in .net 2 and up it could be ‘static’ class).&lt;/p&gt;  &lt;p&gt;3. For the enum approach, I don’t think the ‘ToString’ performance is an issue, just an nondeterministic way to convert to string as it may be localized (currently it isn’t but who knows), using ‘Enum.GetName’ instead would help.&lt;/p&gt;  &lt;p&gt;4. A nice wrapper around the session would be C# 3.0 extension methods around the HttpSessionStateBase type like:&lt;/p&gt;  &lt;p&gt;&lt;em&gt;public static UserSessionInfo CurrentUser(this HttpSessionStateBase session) { return session[UserSessionInfo.SessionKey] as UserSessionInfo; }&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;5. A warning: the expression “Session != null” can throw exception of “Session is not available…” in some cases, bad design by .net, but you need to take care.&lt;/p&gt;  &lt;p&gt;Have fun!&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=474171" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/smallfish/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://blogs.microsoft.co.il/blogs/smallfish/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://blogs.microsoft.co.il/blogs/smallfish/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/smallfish/archive/tags/C_2300_+3.0/default.aspx">C# 3.0</category></item><item><title>Quality Code Short Tip #2 – Don’t Create What Isn’t Required</title><link>http://blogs.microsoft.co.il/blogs/smallfish/archive/2009/10/07/quality-code-short-tip-2-don-t-create-what-isn-t-required.aspx</link><pubDate>Wed, 07 Oct 2009 21:37:00 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:414110</guid><dc:creator>Yair Cohen</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/smallfish/rsscomments.aspx?PostID=414110</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/smallfish/commentapi.aspx?PostID=414110</wfw:comment><comments>http://blogs.microsoft.co.il/blogs/smallfish/archive/2009/10/07/quality-code-short-tip-2-don-t-create-what-isn-t-required.aspx#comments</comments><description>&lt;p&gt;In Israel, this sign say “&lt;strike&gt;one-way street&lt;/strike&gt; &lt;strong&gt;Update: &lt;/strong&gt;dead-end” (you enter and exit the same side):&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;a href="http://blogs.microsoft.co.il/blogs/smallfish/OneWay_64E482AF.jpg"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="OneWay" border="0" alt="OneWay" src="http://blogs.microsoft.co.il/blogs/smallfish/OneWay_thumb_0EE480D8.jpg" width="62" height="68" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Now, if you see this sign, its meaning is clear. But if you see this sign:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/smallfish/WrongOneWay_14BF2471.jpg"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="WrongOneWay" border="0" alt="WrongOneWay" src="http://blogs.microsoft.co.il/blogs/smallfish/WrongOneWay_thumb_73CBB1C9.jpg" width="62" height="68" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;You will start to think “What is this number? is it until 2011? from 2011? serial number of the sign?” etc.&lt;/p&gt;  &lt;p&gt;So, why it is not as clear in development?&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Many times, developers “prepare for the future” adding variables, db columns, tables etc. for “future use” - “I know we will need it in the future…”, but as in the sign, if you add it now you are adding “noise” to the code / db / etc. and may mislead your fellow developer (or you?)&lt;/p&gt;  &lt;p&gt;so: &lt;strong&gt;Don’t Create What Isn’t Required Now!&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Now, you are working on current tasks, create just what you need to accomplish the current task.&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=414110" width="1" height="1"&gt;</description></item><item><title>WPF vs. Windows Forms</title><link>http://blogs.microsoft.co.il/blogs/smallfish/archive/2009/10/02/WPF-vs.-Windows-Forms.aspx</link><pubDate>Fri, 02 Oct 2009 12:17:00 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:413386</guid><dc:creator>Yair Cohen</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/smallfish/rsscomments.aspx?PostID=413386</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/smallfish/commentapi.aspx?PostID=413386</wfw:comment><comments>http://blogs.microsoft.co.il/blogs/smallfish/archive/2009/10/02/WPF-vs.-Windows-Forms.aspx#comments</comments><description>&lt;p&gt;This argument exists since the first version of WPF (Windows Presentation Framework), so what should one select, WPF or Windows Forms?&lt;/p&gt;  &lt;p&gt;I will start with my conclusion / disclaimer:&lt;/p&gt;  &lt;blockquote&gt;   &lt;h4&gt;Any new windows client should use WPF!&lt;/h4&gt; &lt;/blockquote&gt;  &lt;p&gt;Now, for the explanation:    &lt;br /&gt;The biggest &amp;quot;flaw&amp;quot; of WPF is its learning curve, it is slightly hard to understand the &amp;quot;rhythmic&amp;quot; of it. Thus, many companies / developers prefer the comfort zone of windows forms as it seems more easy and &amp;quot;fast&amp;quot; to develop.     &lt;br /&gt;The fact is that after you pass over the first barrier of WPF, it become much easier, simpler and faster to develop.     &lt;br /&gt;Aspects where WPF that led me to my conclusion:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;&lt;u&gt;Productivity:&lt;/u&gt;&lt;/strong&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;blockquote&gt;   &lt;p&gt;The most valuable feature here is WPF data binding, it saves your time because you don&amp;#39;t need to manually mess with the controls directly, and by applying good design such &lt;a title="Karl on WPF - MVVM" href="http://karlshifflett.wordpress.com/mvvm/" target="_blank"&gt;MVVM&lt;/a&gt; or alike you will go faster. So, you may say &amp;quot;windows forms supports data binding also&amp;quot;, and yes, you right but it is like comparing Mercedes to Subaru (nothing bad with Subaru, but …).       &lt;br /&gt;I have put this first because in most applications (especially commercial) developers&amp;#39; time is the most valuable in terms of money.       &lt;br /&gt;WPF supports many other automations that leads you to the (my?) first rule if productivity: Write Less Code, because writing less code takes less time, introduces less bugs (there is exponential or at least linear correlation between the amount of code you write and the number of bugs you have). Writing less code requires less source code which ease visual studio / source control to work much faster, and thus takes less valuable time of the developer.       &lt;br /&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;&lt;u&gt;Usability: &lt;/u&gt;&lt;/strong&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;blockquote&gt;   &lt;p&gt;In WPF it is very simple to create more usable application which, for my opinion, should be the most critical measurement for the customer. One if the features that enables this is the Commanding architecture that let&amp;#39;s you bind a command to various buttons / input gestures like keyboard shortcuts or even multi-touch gestures in the near future.      &lt;br /&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;ul&gt;   &lt;li&gt;&lt;u&gt;&lt;strong&gt;Performances:&lt;/strong&gt;&lt;/u&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;blockquote&gt;   &lt;p&gt;The most valuable feature in this area is the use of Hardware Acceleration which is not only speed up your graphic it is also frees the main CPU for other important tasks. For more information look at &lt;a title="WPF- Pick Your API Abstraction" href="http://www.fernicola.org/loquitor/index.php?/archives/17-WPF-Pick-Your-API-Abstraction.html" target="_blank"&gt;WPF- Pick Your API Abstraction&lt;/a&gt; by Pablo Fernicola.       &lt;br /&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;ul&gt;   &lt;li&gt;&lt;u&gt;&lt;strong&gt;Technology:&lt;/strong&gt;&lt;/u&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;blockquote&gt;   &lt;p&gt;In most fields newer technology is better, with less &lt;a href="http://blogs.microsoft.co.il/blogs/smallfish/archive/2009/09/25/quality-code-short-tip-1.aspx" target="_blank"&gt;defects&lt;/a&gt;&amp;#160; as it evolves from experience in the problem domain, tooling and processes. I will bet that Microsoft® used better development and product manage process in WPF than in windows forms.       &lt;br /&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;ul&gt;   &lt;li&gt;&lt;u&gt;&lt;strong&gt;Support:&lt;/strong&gt;&lt;/u&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;blockquote&gt;   &lt;p&gt;Traditionally Microsoft® supports application for about ten or twelve years (my informal rough estimation) which means that WPF will be supported long after windows forms and it will continue to be developed further in contradiction to windows forms (that already stopped&amp;amp;).      &lt;br /&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;ul&gt;   &lt;li&gt;&lt;u&gt;&lt;strong&gt;Eye Candy:&lt;/strong&gt;&lt;/u&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;blockquote&gt;   &lt;p&gt;Beautiful applications sell better, it&amp;#39;s a fact. In WPF you almost have to create nicer application because it easier and because it let&amp;#39;s you cooperate graphics designers in the process.&lt;/p&gt;    &lt;p&gt;References:&lt;/p&gt;    &lt;p&gt;&lt;a title="In Defense of Eye Candy" href="http://www.alistapart.com/articles/indefenseofeyecandy" target="_blank"&gt;In Defense of Eye Candy&lt;/a&gt; by &lt;a title="Stephen P. Anderson" href="http://www.alistapart.com/authors/a/stephenanderson" target="_blank"&gt;Stephen P. Anderson&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Enjoy WPF, Now!&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=413386" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/smallfish/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://blogs.microsoft.co.il/blogs/smallfish/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/smallfish/archive/tags/WPF/default.aspx">WPF</category><category domain="http://blogs.microsoft.co.il/blogs/smallfish/archive/tags/M-V-VM/default.aspx">M-V-VM</category><category domain="http://blogs.microsoft.co.il/blogs/smallfish/archive/tags/MVVM/default.aspx">MVVM</category><category domain="http://blogs.microsoft.co.il/blogs/smallfish/archive/tags/C_2300_+3.0/default.aspx">C# 3.0</category><category domain="http://blogs.microsoft.co.il/blogs/smallfish/archive/tags/XAML/default.aspx">XAML</category><category domain="http://blogs.microsoft.co.il/blogs/smallfish/archive/tags/Windows+Forms/default.aspx">Windows Forms</category><category domain="http://blogs.microsoft.co.il/blogs/smallfish/archive/tags/WPF+vs+Windows+Forms.XAML/default.aspx">WPF vs Windows Forms.XAML</category></item><item><title>Quality Code Short Tip #1 – Say “Defects” not “Bugs”</title><link>http://blogs.microsoft.co.il/blogs/smallfish/archive/2009/09/25/quality-code-short-tip-1.aspx</link><pubDate>Fri, 25 Sep 2009 14:24:00 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:413016</guid><dc:creator>Yair Cohen</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/smallfish/rsscomments.aspx?PostID=413016</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/smallfish/commentapi.aspx?PostID=413016</wfw:comment><comments>http://blogs.microsoft.co.il/blogs/smallfish/archive/2009/09/25/quality-code-short-tip-1.aspx#comments</comments><description>&lt;p&gt;I wanted to start a short tips series for improving code and application quality, each post will be 1 to few sentences with a tip.&lt;/p&gt;  &lt;p&gt;First tip:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Say “Defects”, not “Bugs”&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;For me, the word “bug” sounds as “something not so important that is in the nature of the application”, which at least it isn’t true! when the application doesn’t do what it should (or do it wrong, or crash etc) it is a &lt;strong&gt;&lt;em&gt;Defect&lt;/em&gt;&lt;/strong&gt; in our application. It is hard because we are so naturally says it, but we should start to change our terminology for better software!&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=413016" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/smallfish/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://blogs.microsoft.co.il/blogs/smallfish/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/smallfish/archive/tags/C_2300_+3.0/default.aspx">C# 3.0</category></item><item><title>Programming Tip For Easier Life or Applying SRP Principle On Variables / Enums</title><link>http://blogs.microsoft.co.il/blogs/smallfish/archive/2009/09/25/programming-tip-for-easier-life-or-applying-srp-principle-on-variables-enums.aspx</link><pubDate>Fri, 25 Sep 2009 14:19:00 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:413015</guid><dc:creator>Yair Cohen</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/smallfish/rsscomments.aspx?PostID=413015</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/smallfish/commentapi.aspx?PostID=413015</wfw:comment><comments>http://blogs.microsoft.co.il/blogs/smallfish/archive/2009/09/25/programming-tip-for-easier-life-or-applying-srp-principle-on-variables-enums.aspx#comments</comments><description>&lt;p&gt;According to the first principle of &lt;a title="The S.O.L.I.D principle" href="http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod" target="_blank"&gt;S.O.L.I.D&lt;/a&gt;, SRP – &lt;strong&gt;S&lt;/strong&gt;ingle &lt;strong&gt;R&lt;/strong&gt;esponsibility &lt;strong&gt;P&lt;/strong&gt;rinciple, a class should have one responsibility, shortly, it should have only one reason to change. &lt;/p&gt;  &lt;p&gt;&lt;u&gt;&lt;strong&gt;Example&lt;/strong&gt;&lt;/u&gt;&lt;/p&gt;  &lt;p&gt;Let assume that we have to create a software for importing CSV data to the database.&lt;/p&gt;  &lt;p&gt;“&lt;strong&gt;Fast &amp;amp; Dirty”&lt;/strong&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Reading directly from the CSV file into the database, line by line, on each line parsing (in separated method, or worse inline) the string and writing it to database. &lt;/p&gt;  &lt;div class="csharpcode"&gt;   &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; CSVtoDbImporter&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;{&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Import(&lt;span class="kwrd"&gt;string&lt;/span&gt; fileName)&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;    {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;        &lt;span class="kwrd"&gt;using&lt;/span&gt; (var reader = File.OpenRead(fileName))&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;        {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;            &lt;span class="kwrd"&gt;string&lt;/span&gt; line;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;            &lt;span class="kwrd"&gt;while&lt;/span&gt; ((line = reader.ReadLine()) != &lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;            {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;                InsertToDb(line);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;            }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;        }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;    }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; InsertToDb(&lt;span class="kwrd"&gt;string&lt;/span&gt; line)&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;    {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;        var values = line.Split(&lt;span class="str"&gt;&amp;#39;,&amp;#39;&lt;/span&gt;);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;        var insertStatement = &lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(&lt;span class="str"&gt;&amp;quot;INSERT INTO Table VALUES({0},&amp;#39;{1}&amp;#39;)&amp;quot;&lt;/span&gt;,values);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;        ExecuteCommand(insertStatement);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;    }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;The problem here is that when the file format changes or the db schema changes this class should be updated (or rewritten), violating the SRP.&lt;/p&gt;

&lt;p&gt;“&lt;strong&gt;SRP Applied”&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Reading each row to corresponding &lt;a title="Plain Old CLR Object" href="http://en.wikipedia.org/wiki/Plain_Old_CLR_Object" target="_blank"&gt;POCO&lt;/a&gt; object that represents the row loosely from the format (doesn’t care if it CSV, XML or any other form), and a specialized reader, CSVReader that sends this object to another class, DbImporter, that knows how to import it to the db. (performance issues are not relevant here, because on (very-)large files you can still stream the object one at a time and keep the separation)&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; TableRow&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;{&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; Id { get; set; }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Name { get; set; }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;}&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; CSVReader : IReader&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;{&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; TableRow[] Read(&lt;span class="kwrd"&gt;string&lt;/span&gt; fileName)&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;    {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;        &lt;span class="rem"&gt;// read and parse each line into TableRow objects and return the array...&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;    }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;}&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; DbImporter : IDbImporter&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;{&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Import(TableRow[] rows)&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;    {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;        &lt;span class="rem"&gt;// insert each row into db&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;    }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;In this snippet, when the database schema changed, only the DbImporter changes, and the reader remains the same. On the other side, if the file format is changed, only the reader implementation is changed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;u&gt;SRP in Variables&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It may seem straignt forward but this principle is violated in variables too in the form of ambiguity: using the same variable to represent more than one meaning, for example:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;int&lt;/span&gt; status = (&lt;span class="kwrd"&gt;int&lt;/span&gt;)Statuses.SomeStatus&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;&lt;span class="rem"&gt;// …&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;&lt;span class="kwrd"&gt;if&lt;/span&gt; (status == (&lt;span class="kwrd"&gt;int&lt;/span&gt;)Statuses.SomeStatus) status = 125 &lt;span class="rem"&gt;/* Some other code, not a status */&lt;/span&gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;First, the principle: &lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Variable should have one and only one meaning&lt;/strong&gt; – if it represents status, it is a status variable, if it represents code it is code variable, never the same.&lt;/p&gt;

&lt;p&gt;This ambiguity WILL catch you, and it will be in the most inappropriate time. It introduce parallel flow (do not confuse with parallel computing) for the application making it very hard to maintain the code, harm the productivity and introduce defects (bugs) that&amp;#160; are very hard to spot and fix.&lt;/p&gt;

&lt;p&gt;Of-course, this principle applies to properties, constants, enums etc.&lt;/p&gt;

&lt;p&gt;So, express yourself!&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=413015" width="1" height="1"&gt;</description></item><item><title>How To Create XAML Markup Extension in WPF – Creating the Now markup extension</title><link>http://blogs.microsoft.co.il/blogs/smallfish/archive/2009/04/19/how-to-create-xaml-markup-extension-in-wpf-creating-the-now-markup-extension.aspx</link><pubDate>Sun, 19 Apr 2009 12:46:23 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:271514</guid><dc:creator>Yair Cohen</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/smallfish/rsscomments.aspx?PostID=271514</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/smallfish/commentapi.aspx?PostID=271514</wfw:comment><comments>http://blogs.microsoft.co.il/blogs/smallfish/archive/2009/04/19/how-to-create-xaml-markup-extension-in-wpf-creating-the-now-markup-extension.aspx#comments</comments><description>&lt;h3&gt;   &lt;p&gt;What?&lt;/p&gt; &lt;/h3&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;Display a label and analog clock on screen, they should be updated “live” with the time.&lt;/p&gt;  &lt;h3&gt;How?&lt;/h3&gt;  &lt;p&gt;I use XAML Markup Extension for several reasons:&lt;/p&gt;  &lt;blockquote&gt;   &lt;ol&gt;     &lt;li&gt;It makes it easy to use it on XAML, especially to bind to it. &lt;/li&gt;      &lt;li&gt;Learn the framework extension points. &lt;/li&gt;      &lt;li&gt;Reuse – easy to use it everywhere with half line of XAML. &lt;/li&gt;   &lt;/ol&gt; &lt;/blockquote&gt;  &lt;h3&gt;&lt;/h3&gt;  &lt;h3&gt;Show me the money!&lt;/h3&gt;  &lt;div style="font-family:consolas;color:black;font-size:10pt;"&gt;   &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &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;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:gray;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt; XAML Markup Extension to bind dependency property (DateTime or String)&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:gray;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt; to the current date and time (updated each second)&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; &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;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;public&lt;/span&gt; &lt;span style="color:blue;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;NowExtension&lt;/span&gt; : &lt;span style="color:#2b91af;"&gt;MarkupExtension&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;&lt;span style="color:blue;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; #region&lt;/span&gt; State&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;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:green;"&gt;// default, full date format (current culture)&lt;/span&gt;&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;private&lt;/span&gt; &lt;span style="color:blue;"&gt;readonly&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt; m_format = &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; &lt;span style="color:#2b91af;"&gt;CultureInfo&lt;/span&gt;.CurrentCulture.DateTimeFormat.FullDateTimePattern;&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:green;"&gt;// for empty constructor we return the DateTime&lt;/span&gt;&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;private&lt;/span&gt; &lt;span style="color:blue;"&gt;readonly&lt;/span&gt; &lt;span style="color:blue;"&gt;bool&lt;/span&gt; m_returnDate = &lt;span style="color:blue;"&gt;false&lt;/span&gt;;&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;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;private&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;DependencyObject&lt;/span&gt; m_targetObject;&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;private&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;DependencyProperty&lt;/span&gt; m_targetProperty;&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;private&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;DispatcherTimer&lt;/span&gt; m_timer;&lt;/pre&gt;

  &lt;pre style="margin:0px;"&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; #endregion&lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; #region&lt;/span&gt; Constructors&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;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &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;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:gray;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt; Create new Now Extension that return the &lt;/span&gt;&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:gray;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt; current DateTime (DateTime.Now)&lt;/span&gt;&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: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;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;public&lt;/span&gt; NowExtension()&lt;/pre&gt;

  &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&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;&amp;#160;&amp;#160;&amp;#160;&amp;#160; m_returnDate = &lt;span style="color:blue;"&gt;true&lt;/span&gt;;&lt;/pre&gt;

  &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&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;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &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;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:gray;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt; Create new Now Extension that return the &lt;/span&gt;&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:gray;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt; current DateTime formatted (calling ToString &lt;/span&gt;&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:gray;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt; with m_format)&lt;/span&gt;&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: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;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;public&lt;/span&gt; NowExtension(&lt;span style="color:blue;"&gt;string&lt;/span&gt; format)&lt;/pre&gt;

  &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&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;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;if&lt;/span&gt; (!&lt;span style="color:blue;"&gt;string&lt;/span&gt;.IsNullOrEmpty(format))&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; {&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; m_format = format;&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; }&lt;/pre&gt;

  &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&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;&lt;span style="color:blue;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; #endregion&lt;/span&gt;&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;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &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;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:gray;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt; Overrides MarkupExtension.ProvideValue to return &lt;/span&gt;&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:gray;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt; the current datetime and hook a timer to update the &lt;/span&gt;&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:gray;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt; target propery each second &lt;/span&gt;&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:gray;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt; (using DispatcherTime with Background priority)&lt;/span&gt;&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: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;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &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;param name=&amp;quot;serviceProvider&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&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:gray;"&gt;///&lt;/span&gt;&lt;span style="color:green;"&gt; &lt;/span&gt;&lt;span style="color:gray;"&gt;&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&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;public&lt;/span&gt; &lt;span style="color:blue;"&gt;override&lt;/span&gt; &lt;span style="color:blue;"&gt;object&lt;/span&gt; ProvideValue(&lt;span style="color:#2b91af;"&gt;IServiceProvider&lt;/span&gt; serviceProvider)&lt;/pre&gt;

  &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&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;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;var&lt;/span&gt; targetHelper = &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; (&lt;span style="color:#2b91af;"&gt;IProvideValueTarget&lt;/span&gt;)&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; serviceProvider.GetService(&lt;span style="color:blue;"&gt;typeof&lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;IProvideValueTarget&lt;/span&gt;));&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;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; m_targetObject = &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; targetHelper.TargetObject &lt;span style="color:blue;"&gt;as&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;DependencyObject&lt;/span&gt;;&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;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; m_targetProperty = &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; targetHelper.TargetProperty &lt;span style="color:blue;"&gt;as&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;DependencyProperty&lt;/span&gt;;&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;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; m_timer = &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;DispatcherTimer&lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;DispatcherPriority&lt;/span&gt;.Background);&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; m_timer.Interval = &lt;span style="color:#2b91af;"&gt;TimeSpan&lt;/span&gt;.FromSeconds(1);&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; m_timer.Tick += &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;EventHandler&lt;/span&gt;(m_timer_Tick);&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; m_timer.Start();&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;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;if&lt;/span&gt; (m_returnDate)&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; {&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; &lt;span style="color:blue;"&gt;return&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;DateTime&lt;/span&gt;.Now;&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; }&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;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;return&lt;/span&gt; GetNowValue();&lt;/pre&gt;

  &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&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;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &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;string&lt;/span&gt; GetNowValue()&lt;/pre&gt;

  &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&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;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;return&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;DateTime&lt;/span&gt;.Now.ToString(m_format);&lt;/pre&gt;

  &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&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;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;void&lt;/span&gt; m_timer_Tick(&lt;span style="color:blue;"&gt;object&lt;/span&gt; sender, &lt;span style="color:#2b91af;"&gt;EventArgs&lt;/span&gt; e)&lt;/pre&gt;

  &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&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;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;if&lt;/span&gt; (m_targetObject != &lt;span style="color:blue;"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; m_targetProperty != &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;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&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;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;object&lt;/span&gt; value = GetNowValue();&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; &lt;span style="color:blue;"&gt;if&lt;/span&gt; (m_returnDate)&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; {&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; value = &lt;span style="color:#2b91af;"&gt;DateTime&lt;/span&gt;.Now;&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; }&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; m_targetObject.SetValue(m_targetProperty, value);&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; }&lt;/pre&gt;

  &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;

  &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;
&lt;/div&gt;

&lt;h3&gt;How does it works?&lt;/h3&gt;

&lt;p&gt;The first time the ProviderValue is called, we are hooking to the target DependencyObject / DependencyProperty so we will be able to set the property on timer intervals. Then we start a timer (with interval of 1 second) and in that timer Tick event we set the new value to the hooked property, the last line just return the current value for the first time.&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=271514" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/smallfish/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://blogs.microsoft.co.il/blogs/smallfish/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/smallfish/archive/tags/WPF/default.aspx">WPF</category><category domain="http://blogs.microsoft.co.il/blogs/smallfish/archive/tags/XAML/default.aspx">XAML</category></item><item><title>How To Get A Property Name Using Lambda Expression in C# 3.0</title><link>http://blogs.microsoft.co.il/blogs/smallfish/archive/2009/04/02/how-to-get-a-property-name-using-lambda-expression-in-c-3-0.aspx</link><pubDate>Thu, 02 Apr 2009 19:01:00 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:263794</guid><dc:creator>Yair Cohen</dc:creator><slash:comments>5</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/smallfish/rsscomments.aspx?PostID=263794</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/smallfish/commentapi.aspx?PostID=263794</wfw:comment><comments>http://blogs.microsoft.co.il/blogs/smallfish/archive/2009/04/02/how-to-get-a-property-name-using-lambda-expression-in-c-3-0.aspx#comments</comments><description>&lt;p&gt;During development of WPF application using &lt;a href="http://msdn.microsoft.com/en-us/magazine/dd419663.aspx" target="_blank"&gt;M-V-VM design pattern (by Josh Smith on MSDN Mag.)&lt;/a&gt; I came across a problem of refactoring the view model classes, especially the properties’ names. The view model classes are implementing the &lt;a href="http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.aspx" target="_blank"&gt;INotifyPropertyChanged&lt;/a&gt; interface by inheriting from a helper NotifyPropertyChanged base class which have a method to raise the property changed event called ‘SendPropertyChanged’. That method gets “propertyName” parameter which is a string, and this was the problem:&lt;/p&gt;  &lt;p&gt;My view model properties looks like:&lt;/p&gt;  &lt;div style="font-family:courier new;background:white;color:black;font-size:10pt;"&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;private&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt; m_name;&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;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;#160;&amp;#160;&amp;#160;&amp;#160;&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;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;get&lt;/span&gt; &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; {&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; &lt;span style="color:blue;"&gt;return&lt;/span&gt; m_name;&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; }&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; &lt;span style="color:blue;"&gt;set&lt;/span&gt;&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; {&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; &lt;span style="color:blue;"&gt;if&lt;/span&gt; (m_name != &lt;span style="color:blue;"&gt;value&lt;/span&gt;)&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; {&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; m_name = &lt;span style="color:blue;"&gt;value&lt;/span&gt;;&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; SendPropertyChanged(&lt;span style="color:#a31515;"&gt;&amp;quot;Name&amp;quot;&lt;/span&gt;);&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; }&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; }&lt;/pre&gt;

  &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;the problem here is if I change the property name to “CustomerName” I must ensure to correct the string name in the method parameter. Even worse, if for some reason another method / property is calling ‘SendPropertyChanged’ for the ‘Name’ property it will cause invisible problems (you will see it on the screen, but very difficult to spot). And then:&lt;/p&gt;

&lt;p&gt;Lambda Expression to the rescue! &lt;/p&gt;

&lt;p&gt;What I wanted to achieve is:&lt;/p&gt;

&lt;div style="font-family:courier new;background:white;color:black;font-size:10pt;"&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;private&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt; m_name;&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;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;#160;&amp;#160;&amp;#160;&amp;#160;&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;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;get&lt;/span&gt; &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; {&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; &lt;span style="color:blue;"&gt;return&lt;/span&gt; m_name;&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; }&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; &lt;span style="color:blue;"&gt;set&lt;/span&gt;&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; {&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; &lt;span style="color:blue;"&gt;if&lt;/span&gt; (m_name != &lt;span style="color:blue;"&gt;value&lt;/span&gt;)&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; {&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; m_name = &lt;span style="color:blue;"&gt;value&lt;/span&gt;;&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; SendPropertyChanged(()=&amp;gt; &lt;span style="color:blue;"&gt;this&lt;/span&gt;.Name);&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; }&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; }&lt;/pre&gt;

  &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Note the bolded “() =&amp;gt; this.Name”, this will ensure that if anyone changes the name of the property the build will fail (or, using the Refactoring-&amp;gt;Rename in VS will change it automatically). After a lot of searches I found the way to do this (&lt;a href="http://manicprogrammer.com/cs/blogs/heynemann/archive/2008/07/09/expression-tree-reflection-c-3-5.aspx" target="_blank"&gt;in Bernardo Heynemann blog post&lt;/a&gt;):&lt;/p&gt;

&lt;div style="font-family:courier new;background:white;color:black;font-size:10pt;"&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;private&lt;/span&gt; &lt;span style="color:blue;"&gt;string&lt;/span&gt; GetPropertyName&amp;lt;T&amp;gt;(&lt;span style="color:#2b91af;"&gt;Expression&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;Func&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;T&lt;/span&gt;&amp;gt;&amp;gt; property)&lt;/pre&gt;

  &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&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;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;var&lt;/span&gt; propertyInfo = (property.Body &lt;span style="color:blue;"&gt;as&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;MemberExpression&lt;/span&gt;).Member &lt;span style="color:blue;"&gt;as&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;PropertyInfo&lt;/span&gt;;&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; &lt;span style="color:blue;"&gt;if&lt;/span&gt; (propertyInfo == &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;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&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;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;throw&lt;/span&gt; &lt;span style="color:blue;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ArgumentException&lt;/span&gt;(&lt;span style="color:#a31515;"&gt;&amp;quot;The lambda expression &amp;#39;property&amp;#39; &lt;/span&gt;&lt;/pre&gt;

  &lt;pre style="margin:0px;"&gt;&lt;span style="color:#a31515;"&gt;should point to a valid Property&amp;quot;&lt;/span&gt;);&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; }&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;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;var&lt;/span&gt; propertyName = propertyInfo.Name;&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;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color:blue;"&gt;return&lt;/span&gt; propertyName;&lt;/pre&gt;

  &lt;pre style="margin:0px;"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Note the parameter type &lt;span style="color:#2b91af;"&gt;Expression&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;Func&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;T&lt;/span&gt;&amp;gt;&amp;gt; – whenever you cast a delegate (in this case of Func&amp;lt;T&amp;gt;) into &lt;a href="http://msdn.microsoft.com/en-us/library/system.linq.expressions.expression.aspx" target="_blank"&gt;Expression&lt;/a&gt; you are getting the associated &lt;a href="http://msdn.microsoft.com/en-us/library/bb397951.aspx" target="_blank"&gt;Expression Tree&lt;/a&gt; and not the delegate itself. The call is clean and nice due to another feature of C# 3.0 ‘Type inference’ the compiler determines the type of T parameter and does not require us to add the ugly curly brackets.&lt;/p&gt;

&lt;p&gt;Enjoy the new revolution! &lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=263794" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/smallfish/archive/tags/Visual+Studio+2008/default.aspx">Visual Studio 2008</category><category domain="http://blogs.microsoft.co.il/blogs/smallfish/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/smallfish/archive/tags/LINQ/default.aspx">LINQ</category><category domain="http://blogs.microsoft.co.il/blogs/smallfish/archive/tags/WPF/default.aspx">WPF</category><category domain="http://blogs.microsoft.co.il/blogs/smallfish/archive/tags/M-V-VM/default.aspx">M-V-VM</category><category domain="http://blogs.microsoft.co.il/blogs/smallfish/archive/tags/MVVM/default.aspx">MVVM</category><category domain="http://blogs.microsoft.co.il/blogs/smallfish/archive/tags/Expression/default.aspx">Expression</category><category domain="http://blogs.microsoft.co.il/blogs/smallfish/archive/tags/ViewModel/default.aspx">ViewModel</category><category domain="http://blogs.microsoft.co.il/blogs/smallfish/archive/tags/C_2300_+3.0/default.aspx">C# 3.0</category></item><item><title>Quick tip: When Visual Studio (2008) Stop Opening A Web Application In Web Browser</title><link>http://blogs.microsoft.co.il/blogs/smallfish/archive/2009/03/02/quick-tip-when-visual-studio-2008-stop-opening-a-web-application-in-web-browser.aspx</link><pubDate>Tue, 03 Mar 2009 03:10:00 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:239685</guid><dc:creator>Yair Cohen</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/smallfish/rsscomments.aspx?PostID=239685</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/smallfish/commentapi.aspx?PostID=239685</wfw:comment><comments>http://blogs.microsoft.co.il/blogs/smallfish/archive/2009/03/02/quick-tip-when-visual-studio-2008-stop-opening-a-web-application-in-web-browser.aspx#comments</comments><description>&lt;p&gt;This problem was hitting me several times and I couldn&amp;#39;t spot what it was, so here it is:&lt;/p&gt;
&lt;p&gt;&lt;u&gt;&lt;b&gt;The Problem&lt;/b&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p&gt;When starting &lt;b&gt;Debug&lt;/b&gt; or &lt;b&gt;Start Without Debugging&lt;/b&gt; of a Web Application in Visual Studio 2008 the internal web server is started but the Web Browser doesn&amp;#39;t.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;u&gt;The Solution&lt;/u&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Right-Click on your &lt;b&gt;Default.aspx&lt;/b&gt; file (I assume it will be fine for any .aspx either) and select &lt;b&gt;Browse With...&lt;/b&gt; and select the browser you want, that&amp;#39;s all!&lt;/p&gt;
&lt;p&gt;(in my machine it was configured for XML Editor for mysterious reason :))&lt;/p&gt;
&lt;p&gt;Keep Going!&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=239685" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/smallfish/archive/tags/Visual+Studio+2008/default.aspx">Visual Studio 2008</category><category domain="http://blogs.microsoft.co.il/blogs/smallfish/archive/tags/Tip/default.aspx">Tip</category><category domain="http://blogs.microsoft.co.il/blogs/smallfish/archive/tags/Web/default.aspx">Web</category><category domain="http://blogs.microsoft.co.il/blogs/smallfish/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://blogs.microsoft.co.il/blogs/smallfish/archive/tags/DEV/default.aspx">DEV</category></item><item><title>LINQ to SQL Performance loading Hierarchical data</title><link>http://blogs.microsoft.co.il/blogs/smallfish/archive/2009/02/28/linq-to-sql-performance-loading-hierarchical-data.aspx</link><pubDate>Sun, 01 Mar 2009 02:24:00 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:238049</guid><dc:creator>Yair Cohen</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/smallfish/rsscomments.aspx?PostID=238049</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/smallfish/commentapi.aspx?PostID=238049</wfw:comment><comments>http://blogs.microsoft.co.il/blogs/smallfish/archive/2009/02/28/linq-to-sql-performance-loading-hierarchical-data.aspx#comments</comments><description>&lt;p&gt;Last week I have trying to load hierarchical data from the same table (Parent/Child). Although I have made it in the past, I was searching the way to accomplish it with LINQ to SQL without SP or at least with the minimum required (in any case, I had a &amp;quot;fallback&amp;quot;). After 4 hours of searching the net without success (there are plenty of articles, nothing met my requirements see &lt;a href="http://blogs.msdn.com/wriju/archive/2007/11/10/linq-to-sql-working-with-hierarchical-data.aspx" title="http://blogs.msdn.com/wriju/archive/2007/11/10/linq-to-sql-working-with-hierarchical-data.aspx"&gt;here&lt;/a&gt; and &lt;a href="http://stackoverflow.com/questions/202912/hierarchical-data-in-linq-options-and-performance"&gt;here&lt;/a&gt;).&lt;/p&gt; &lt;p&gt;Then I thought to give LINQ a chance, and I just used it querying the association created by the designer. I was astonished to reveal it caused to only one T-SQL statement (!!!) to load the full hierarchy(bottom to top, meaning each item as its full ancestors list accessed by .Parent property, does not include children), and the performance? total of 50,000 (10,000 per level, 5 levels in hierarchy) loaded in less than 2.5 seconds! which is great for our purpose (in no case I will query the full table without any filtering criteria).&lt;/p&gt; &lt;p&gt;My satisfaction is based on some assumptions:&lt;/p&gt; &lt;p&gt;1. Each T-SQL written to the log (DataContext.Log) is a roundtrip to the server.&lt;/p&gt; &lt;p&gt;2. This test is by far almost 10x than what we would face in production environment.&lt;/p&gt; &lt;p&gt;3. The test was made on my dev machine without network roundtrip, but based on assumption 1, it will be 1 roundtrip which is necessary in any case.&lt;/p&gt; &lt;p&gt;4. I didn&amp;#39;t tweak the LINQ engine for the best performance (like read-only datacontext, LoadWith etc.)&lt;/p&gt; &lt;p&gt;&lt;b&gt;Why should I eliminate / minimize the use of SPs / T-SQL and use almost-only LINQ to SQL?&lt;/b&gt;&lt;/p&gt; &lt;p&gt;In one word, &lt;b&gt;maintenance, &lt;/b&gt;which is, for my opiniongn, the most valuable aspect for most of business applications, because
business change and so your application, it will be hard to maintain
you will pay a lot of money for each chae and this will minimize or worst, eliminate all your profit. Using LINQ to SQL affects maintenance in several aspects, I will elaborate two of them:&lt;/p&gt; &lt;p&gt;1. Most of development resources are, well, developers. And in C# (or .NET at all) they know C# the most, they have much advanced tools and IDE to use with that language, they are in friendly environment. When those developers are required to write T-SQL / SPs, they are trying to &amp;quot;escape&amp;quot; or eventually do this but the results are fairly bad so you need a DBA to re-write those procedures&lt;/p&gt; &lt;p&gt;2. DataBase is more &amp;quot;static&amp;quot; than the code, more over, changing the database will probably affect many parts (modules) of the application and it is very hard to maintain compared to compiled code.&lt;/p&gt; &lt;p&gt;Conclusion, &lt;/p&gt; &lt;p&gt;Move to LINQ to SQL (L2S), it saves time, streamlines the development and maintenance process!&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=238049" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/smallfish/archive/tags/SQL+Server/default.aspx">SQL Server</category><category domain="http://blogs.microsoft.co.il/blogs/smallfish/archive/tags/Visual+Studio+2008/default.aspx">Visual Studio 2008</category><category domain="http://blogs.microsoft.co.il/blogs/smallfish/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://blogs.microsoft.co.il/blogs/smallfish/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/smallfish/archive/tags/LINQ/default.aspx">LINQ</category><category domain="http://blogs.microsoft.co.il/blogs/smallfish/archive/tags/LINQ+to+SQL/default.aspx">LINQ to SQL</category></item><item><title>Internet Explorer 7 position problem with dynamic created elements</title><link>http://blogs.microsoft.co.il/blogs/smallfish/archive/2009/01/11/ie-7-haslayout.aspx</link><pubDate>Sun, 11 Jan 2009 05:21:00 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:209303</guid><dc:creator>Yair Cohen</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/smallfish/rsscomments.aspx?PostID=209303</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/smallfish/commentapi.aspx?PostID=209303</wfw:comment><comments>http://blogs.microsoft.co.il/blogs/smallfish/archive/2009/01/11/ie-7-haslayout.aspx#comments</comments><description>&lt;p&gt;&lt;span style="WIDOWS:2;TEXT-TRANSFORM:none;TEXT-INDENT:0px;BORDER-COLLAPSE:separate;FONT:12px &amp;#39;Lucida Grande&amp;#39;;WHITE-SPACE:pre;ORPHANS:2;LETTER-SPACING:normal;WORD-SPACING:0px;-webkit-border-horizontal-spacing:0px;-webkit-border-vertical-spacing:0px;-webkit-text-decorations-in-effect:none;-webkit-text-size-adjust:auto;-webkit-text-stroke-width:0;" class="Apple-style-span"&gt;Hi all, &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="WIDOWS:2;TEXT-TRANSFORM:none;TEXT-INDENT:0px;BORDER-COLLAPSE:separate;FONT:12px &amp;#39;Lucida Grande&amp;#39;;WHITE-SPACE:pre;ORPHANS:2;LETTER-SPACING:normal;WORD-SPACING:0px;-webkit-border-horizontal-spacing:0px;-webkit-border-vertical-spacing:0px;-webkit-text-decorations-in-effect:none;-webkit-text-size-adjust:auto;-webkit-text-stroke-width:0;" class="Apple-style-span"&gt;This is an issue i&amp;#39;m facing a lot with ajax web applications - when you have dynamically created elements on a web page, Internet Explorer may have problems lying out those items and some items may &amp;quot;disapear&amp;quot; from the page by a magic...&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="WIDOWS:2;TEXT-TRANSFORM:none;TEXT-INDENT:0px;BORDER-COLLAPSE:separate;FONT:12px &amp;#39;Lucida Grande&amp;#39;;WHITE-SPACE:pre;ORPHANS:2;LETTER-SPACING:normal;WORD-SPACING:0px;-webkit-border-horizontal-spacing:0px;-webkit-border-vertical-spacing:0px;-webkit-text-decorations-in-effect:none;-webkit-text-size-adjust:auto;-webkit-text-stroke-width:0;" class="Apple-style-span"&gt;Now, and the times before, the followingexcellent &amp;nbsp;article comes to he rescue: &lt;a title="On having layout" href="http://www.satzansatz.de/cssd/onhavinglayout.html"&gt;&amp;quot;On having layout&amp;quot;&lt;/a&gt;&amp;nbsp;(cant find who is the editor, there are some in the bottom of the page).&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="WIDOWS:2;TEXT-TRANSFORM:none;TEXT-INDENT:0px;BORDER-COLLAPSE:separate;FONT:12px &amp;#39;Lucida Grande&amp;#39;;WHITE-SPACE:pre;ORPHANS:2;LETTER-SPACING:normal;WORD-SPACING:0px;-webkit-border-horizontal-spacing:0px;-webkit-border-vertical-spacing:0px;-webkit-text-decorations-in-effect:none;-webkit-text-size-adjust:auto;-webkit-text-stroke-width:0;" class="Apple-style-span"&gt;Have fun!&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="WIDOWS:2;TEXT-TRANSFORM:none;TEXT-INDENT:0px;BORDER-COLLAPSE:separate;FONT:12px &amp;#39;Lucida Grande&amp;#39;;WHITE-SPACE:pre;ORPHANS:2;LETTER-SPACING:normal;WORD-SPACING:0px;-webkit-border-horizontal-spacing:0px;-webkit-border-vertical-spacing:0px;-webkit-text-decorations-in-effect:none;-webkit-text-size-adjust:auto;-webkit-text-stroke-width:0;" class="Apple-style-span"&gt;Link:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="WIDOWS:2;TEXT-TRANSFORM:none;TEXT-INDENT:0px;BORDER-COLLAPSE:separate;FONT:12px &amp;#39;Lucida Grande&amp;#39;;WHITE-SPACE:pre;ORPHANS:2;LETTER-SPACING:normal;WORD-SPACING:0px;-webkit-border-horizontal-spacing:0px;-webkit-border-vertical-spacing:0px;-webkit-text-decorations-in-effect:none;-webkit-text-size-adjust:auto;-webkit-text-stroke-width:0;" class="Apple-style-span"&gt;&lt;a href="http://www.satzansatz.de/cssd/onhavinglayout.html"&gt;http://www.satzansatz.de/cssd/onhavinglayout.html&lt;/a&gt; &lt;/span&gt;&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=209303" width="1" height="1"&gt;</description></item><item><title>How to configure WCF REST service hosted in IIS (properly)?</title><link>http://blogs.microsoft.co.il/blogs/smallfish/archive/2008/12/30/how-to-configure-wcf-rest-service-hosted-in-iis-properly.aspx</link><pubDate>Tue, 30 Dec 2008 22:29:44 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:204202</guid><dc:creator>Yair Cohen</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/smallfish/rsscomments.aspx?PostID=204202</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/smallfish/commentapi.aspx?PostID=204202</wfw:comment><comments>http://blogs.microsoft.co.il/blogs/smallfish/archive/2008/12/30/how-to-configure-wcf-rest-service-hosted-in-iis-properly.aspx#comments</comments><description>&lt;p&gt;Trying to configure WCF REST service hosted in IIS you may encounter an error message saying something like: &lt;/p&gt; &lt;p&gt;&lt;em&gt;&lt;strong&gt;&amp;quot;The message with To &amp;#39;*&amp;#39; cannot be processed at the receiver, due to an AddressFilter mismatch at the EndpointDispatcher. Check that the sender and receiver&amp;#39;s EndpointAddresses agree.&amp;quot;&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt; &lt;p&gt;where &amp;#39;*&amp;#39; is the address you are trying to access. There are some answers here and there on the web but those are incomplete or hard to understand.&lt;/p&gt; &lt;h4&gt;&lt;/h4&gt; &lt;h5&gt;The Problem&lt;/h5&gt; &lt;p&gt;When using the &amp;quot;*.svc&amp;quot; file to host a service within ASP.NET web site, regular WCF ServiceHost is created. WCF itself does not understand the REST address (as specified by the UriTemplate property of WebGet attribute), so we should configure the proper endpoint behavior &amp;quot;webHttp&amp;quot;.&lt;/p&gt; &lt;h5&gt;The Solution&lt;/h5&gt; &lt;p&gt;So, here is how to configure WCF REST service to be hosted in IIS:&lt;/p&gt; &lt;p&gt;To host a service on IIS we are creating &amp;quot;.svc&amp;quot; file to map that file URL to the service type, for example:&lt;/p&gt; &lt;p&gt;&amp;lt;%@ ServiceHost Language=&amp;quot;C#&amp;quot; Debug=&amp;quot;true&amp;quot; Service=&amp;quot;[ServiceFullTypeName]&amp;quot; %&amp;gt;&lt;/p&gt; &lt;p&gt;To enable this service as REST service, we will configure the required endpoint and behaviors in web.config:&lt;/p&gt; &lt;p style="border-right:black 1px solid;border-top:black 1px solid;border-left:black 1px solid;border-bottom:black 1px solid;background-color:lightyellow;"&gt;&amp;lt;system.serviceModel&amp;gt;&lt;br /&gt;&amp;lt;behaviors&amp;gt;&lt;br /&gt;&amp;lt;endpointBehaviors&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;behavior name=&amp;quot;WebBehavior&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;strong&gt;&amp;lt;webHttp/&amp;gt;&lt;/strong&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/behavior&amp;gt;&lt;br /&gt;&amp;lt;/endpointBehaviors&amp;gt; &lt;br /&gt;&amp;lt;/behaviors&amp;gt;&lt;br /&gt;&amp;lt;services&amp;gt;&lt;br /&gt;&amp;lt;service name=&amp;quot;[ServiceTypeFullName]&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;endpoint address=&amp;quot;js&amp;quot; binding=&amp;quot;webHttpBinding&amp;quot; behaviorConfiguration=&amp;quot;WebBehavior&amp;quot; contract=&amp;quot;[ServiceContractName]&amp;quot;/&amp;gt; &lt;br /&gt;&amp;lt;/service&amp;gt;&lt;br /&gt;&amp;lt;/services&amp;gt;&lt;br /&gt;&amp;lt;/system.serviceModel&amp;gt; &lt;/p&gt; &lt;p&gt;Thats all! &lt;/p&gt; &lt;p&gt;Note that the &amp;quot;baseAddress&amp;quot; of this service is the URL to the &amp;quot;.svc&amp;quot; file, the &amp;quot;js&amp;quot; address is not required, but I prefer to distinguish between the &amp;quot;regular&amp;quot; address and the JSON address.&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=204202" width="1" height="1"&gt;</description></item><item><title>How to reset Identity column in SQL Server?</title><link>http://blogs.microsoft.co.il/blogs/smallfish/archive/2008/12/24/how-to-reset-identity-column-in-sql-server.aspx</link><pubDate>Wed, 24 Dec 2008 16:08:53 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:200076</guid><dc:creator>Yair Cohen</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/smallfish/rsscomments.aspx?PostID=200076</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/smallfish/commentapi.aspx?PostID=200076</wfw:comment><comments>http://blogs.microsoft.co.il/blogs/smallfish/archive/2008/12/24/how-to-reset-identity-column-in-sql-server.aspx#comments</comments><description>&lt;p&gt;Recently, a programmer in my team, Amichai Sichel, had found a way to reset identity column in SQL Server DataBase. The reason he had to reset it was for testing and because of relations between tables he could not use TRUNCATE TABLE.&lt;/p&gt; &lt;p&gt;Assuming you want to clear your data, you first need to clean it with DELETE FROM [TableName], then you can RESEED it to any number you want, you need to RESEED it to the value before incrementing (if the column is specified a IDENTITY (1,1) which means its incremental is 1, you need to set it to the value you want minus 1)&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;em&gt;DBCC CHECKIDENT(&amp;#39;[TableName]&amp;#39;, RESEED, 0)&lt;/em&gt;&lt;/strong&gt; -- Will reseed it to 0 and the next identity will be 1 (assuming IDENTITY(1,1))&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;em&gt;DBCC CHECKIDENT(&amp;#39;[TableName]&amp;#39;, NORESEED)&lt;/em&gt;&lt;/strong&gt; -- Will not reseed the value and will return the maximum column value&lt;/p&gt; &lt;p&gt;for more information: &lt;a title="http://technet.microsoft.com/en-us/library/ms176057.aspx" href="http://technet.microsoft.com/en-us/library/ms176057.aspx"&gt;http://technet.microsoft.com/en-us/library/ms176057.aspx&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Thanks to Amichai Sichel&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=200076" width="1" height="1"&gt;</description></item><item><title>The stubborn "," or Why Does It Work on FireFox But Not on Internet Explorer</title><link>http://blogs.microsoft.co.il/blogs/smallfish/archive/2008/12/14/the-stubborn-quot-quot-or-why-does-it-works-on-firefox-but-not-on-internet-explorer.aspx</link><pubDate>Sun, 14 Dec 2008 20:25:00 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:192329</guid><dc:creator>Yair Cohen</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/smallfish/rsscomments.aspx?PostID=192329</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/smallfish/commentapi.aspx?PostID=192329</wfw:comment><comments>http://blogs.microsoft.co.il/blogs/smallfish/archive/2008/12/14/the-stubborn-quot-quot-or-why-does-it-works-on-firefox-but-not-on-internet-explorer.aspx#comments</comments><description>&lt;p&gt;I wanted to share with you a strange behavior that I ran into today: ASP.NET web site that works on FireFox 2 (I assume it will work on 3 too), but it does not work on&amp;nbsp;Internet Explorer!&lt;/p&gt;
&lt;p&gt;I have disabled script debugging since I have FireBugs, as the web is&amp;nbsp;full of JavaScript bugs and the popup message is annoying and also the line number that Internet Explorer reports on does not help at all.&lt;/p&gt;
&lt;p&gt;After a little struggling I have found that the problem was an unnecessary colon (&amp;quot;,&amp;quot;) in JavaScript &amp;quot;class&amp;quot;, like this:&lt;/p&gt;
&lt;p&gt;function A(){}&lt;/p&gt;
&lt;p&gt;A.prototype = {&lt;br /&gt;funcA: function(a,b) { return a * b; },&lt;br /&gt;funcB: function() { ... } &lt;strong&gt;&lt;u&gt;, // &amp;lt;- Note this colon&lt;/u&gt;&lt;/strong&gt;&lt;br /&gt;};&lt;br /&gt;
&lt;p&gt;This works great on FireFox (and FireBugs) but fails in Internet Explorer 7...&lt;br /&gt;I had removed that colon and now&amp;nbsp;it works great.&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=192329" width="1" height="1"&gt;</description></item><item><title>Testing WCF Service using Visual Studio 2008 Unit Tests</title><link>http://blogs.microsoft.co.il/blogs/smallfish/archive/2008/11/28/testing-wcf-service.aspx</link><pubDate>Fri, 28 Nov 2008 07:21:00 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:176506</guid><dc:creator>Yair Cohen</dc:creator><slash:comments>1</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/smallfish/rsscomments.aspx?PostID=176506</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/smallfish/commentapi.aspx?PostID=176506</wfw:comment><comments>http://blogs.microsoft.co.il/blogs/smallfish/archive/2008/11/28/testing-wcf-service.aspx#comments</comments><description>&lt;div style="margin:0px;padding:0px;display:inline;float:none;" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:5aea1309-9435-4b77-8b28-6baae7e49279" class="wlWriterSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/Unit%20Tests" rel="tag"&gt;Unit Tests&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Test" rel="tag"&gt;Test&lt;/a&gt;,&lt;a href="http://technorati.com/tags/WCF" rel="tag"&gt;WCF&lt;/a&gt;,&lt;a href="http://technorati.com/tags/C#" rel="tag"&gt;C#&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Visual%20Studio%202008" rel="tag"&gt;Visual Studio 2008&lt;/a&gt;&lt;/div&gt; &lt;p&gt;Testing Windows Communication Foundation (WCF) service should be handled in a slightly different way than other &amp;quot;regular&amp;quot; .net types. We should test the service logic (as always) but we also need to test it in few more manners to assure our service quality:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Test the service within WCF runtime environment - which can raise several issues that would not be in regular CLR environment.  &lt;/li&gt;&lt;li&gt;Test for your default binding and for all other bindings required from the service specs.  &lt;/li&gt;&lt;li&gt;Test DataContract serialization - you will be surprise by a service failure when you see the service is running ok but client still get error (empasizes with REST service)&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;* The method I will show here uses Visual Studio 2008 Unit Tests framework but it can easily be ported into NUnit or other framework. &lt;/p&gt; &lt;h4&gt;Tests Inheritance&lt;/h4&gt; &lt;p&gt;Any Unit Test is a plain .net class, so we can use inheritance, polymorphism and overriding to re-use the original (logic) test of the service. The driven unit test class should contain the &amp;quot;TestClass&amp;quot; attribute at least, all methods on parent class marked with &amp;quot;TestMethod&amp;quot; attributes will run also when testing the concrete class.&lt;/p&gt; &lt;h4&gt;Let&amp;#39;s start&lt;/h4&gt; &lt;p&gt;First, we will define the target of the test, the obvious Calculator Service (I always use interface for ServiceContract, also in Demo :)):&lt;/p&gt; &lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="rem"&gt;// Defines the Calculator Service contract&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;[ServiceContract]&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;interface&lt;/span&gt; ICalculatorService&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;{&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;    [OperationContract]&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;    &lt;span class="kwrd"&gt;int&lt;/span&gt; Add(&lt;span class="kwrd"&gt;int&lt;/span&gt; a, &lt;span class="kwrd"&gt;int&lt;/span&gt; b);&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;    [OperationContract]&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;    &lt;span class="kwrd"&gt;int&lt;/span&gt; Subtract(&lt;span class="kwrd"&gt;int&lt;/span&gt; a, &lt;span class="kwrd"&gt;int&lt;/span&gt; b);&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;    [OperationContract]&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;    &lt;span class="kwrd"&gt;int&lt;/span&gt; Multiply(&lt;span class="kwrd"&gt;int&lt;/span&gt; a, &lt;span class="kwrd"&gt;int&lt;/span&gt; b);&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;    [OperationContract]&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;    &lt;span class="kwrd"&gt;int&lt;/span&gt; Divide(&lt;span class="kwrd"&gt;int&lt;/span&gt; a , &lt;span class="kwrd"&gt;int&lt;/span&gt; b);&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;}&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;    &lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Then, you should define your service implementation (I&amp;#39;ll skip it, you can download the full code &lt;a href="http://download.5115.us/CalculatorTestSample.zip"&gt;here&lt;/a&gt;). We will test the contract interface and not the concrete implementation be able to test another implementations of the ICalculatorService contract. The logic-test will be defined (code trimmed):&lt;/p&gt;
&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;[TestClass]&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; CalculatorTest&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;{&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;    ...&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;    &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;virtual&lt;/span&gt; ICalculatorService CreateTarget()&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;    {&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;            ICalculatorService target = &lt;span class="kwrd"&gt;new&lt;/span&gt; CalculatorService();&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; target;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;    }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;    [TestMethod]&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Add2Positive()&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;    {&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;        &lt;span class="kwrd"&gt;int&lt;/span&gt; a = 1;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;        &lt;span class="kwrd"&gt;int&lt;/span&gt; b = 2;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;        &lt;span class="kwrd"&gt;int&lt;/span&gt; expected = 3;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;        ICalculatorService calculator = CreateTarget();&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;        &lt;span class="kwrd"&gt;int&lt;/span&gt; actual = calculator.Add(a,b);&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;        Assert.AreEqual(expected, actual);&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;    }&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  23:  &lt;/span&gt;    ...&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  24:  &lt;/span&gt;}&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;the key method here is the &lt;i&gt;CreateTarget&lt;/i&gt; which creates the target of the test and it is marked as &lt;b&gt;protected virtual&lt;/b&gt; so we can override it in sub-class and the test will keep its logic. And we will do just that:&lt;/p&gt;
&lt;h4&gt;&lt;/h4&gt;
&lt;h4&gt;Testing the service within its real environment - WCF runtime&lt;/h4&gt;
&lt;div class="csharpcode"&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;    [TestClass]&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; CalculatorServiceTestAsWCFService &lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;                          : ICalculatorServiceTest&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;    {&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; ServiceHost m_serviceHost;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;        [TestInitialize]&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; InitializeHost()&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;        {&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;            m_serviceHost = &lt;span class="kwrd"&gt;new&lt;/span&gt; ServiceHost(&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;                        &lt;span class="kwrd"&gt;typeof&lt;/span&gt;(CalculatorService));&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;            m_serviceHost.AddServiceEndpoint(&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;                        &lt;span class="kwrd"&gt;typeof&lt;/span&gt;(ICalculatorService), &lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;                        GetTestBinding(), &lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;                        &lt;span class="kwrd"&gt;new&lt;/span&gt; Uri( GetTestAddress()));&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;            m_serviceHost.Open();&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;        }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;        &lt;span class="kwrd"&gt;protected virtual &lt;/span&gt;&lt;span class="kwrd"&gt;string&lt;/span&gt; GetTestAddress()&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;        {&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="str"&gt;&amp;quot;http://localhost:9999/Calculator&amp;quot;&lt;/span&gt;;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;        }&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  23:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  24:  &lt;/span&gt;        [TestCleanup()]&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  25:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; CloseHost()&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  26:  &lt;/span&gt;        {&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  27:  &lt;/span&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (m_serviceHost != &lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  28:  &lt;/span&gt;            {&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  29:  &lt;/span&gt;                m_serviceHost.Close();&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  30:  &lt;/span&gt;            }&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  31:  &lt;/span&gt;        }&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  32:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  33:  &lt;/span&gt;        &lt;span class="kwrd"&gt;protected virtual &lt;/span&gt;Binding GetTestBinding()&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  34:  &lt;/span&gt;        {&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  35:  &lt;/span&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; WSHttpBinding();&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  36:  &lt;/span&gt;        }&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  37:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  38:  &lt;/span&gt;        &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; ICalculatorService CreateTarget()&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  39:  &lt;/span&gt;        {&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  40:  &lt;/span&gt;            ICalculatorService calcServiceClient = &lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  41:  &lt;/span&gt;                ChannelFactory&amp;lt;ICalculatorService&amp;gt;.CreateChannel(&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  42:  &lt;/span&gt;                                    GetTestBinding(), &lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  43:  &lt;/span&gt;                                    &lt;span class="kwrd"&gt;new&lt;/span&gt; EndpointAddress(GetTestAddress()));&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  44:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  45:  &lt;/span&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; calcServiceClient;&lt;/pre&gt;&lt;pre&gt;&lt;span class="lnum"&gt;  46:  &lt;/span&gt;        }&lt;/pre&gt;&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  47:  &lt;/span&gt;    }&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Here we inherits from our logic-test class and add several methods:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;b&gt;InitializeHost&lt;/b&gt; - on each test, we create a host, and add test service endpoint using the ICalculatorService contract, test address and binding 
&lt;/li&gt;&lt;li&gt;&lt;b&gt;GetTestAddress,GetTestBinding&lt;/b&gt; - virtual methods for generating the testing address and binding. If you want to test your service against several bindings you just need to inherit this class and override these 2 methods. 
&lt;/li&gt;&lt;li&gt;&lt;b&gt;CloseHost&lt;/b&gt; - on test cleanup, closes the host. 
&lt;/li&gt;&lt;li&gt;&lt;b&gt;CreateTarget &lt;/b&gt;- overrides the base class&amp;#39; method to provide a real WCF client for the test, so the test methods will now work in environment as close as possible to the real environment (including serializations, interceptions etc.)&lt;/li&gt;&lt;/ol&gt;
&lt;h4&gt;Notes&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;This method assume that the target service logic is not depend on WCF runtime environment like OperationContext for example. 
&lt;/li&gt;&lt;li&gt;Don&amp;#39;t over-test the WCF, meaning, test only bindings you want to guaranty (if you work with Compact Framework clients, it would be basicHttpBinding, for example)&amp;nbsp; 
&lt;/li&gt;&lt;/ul&gt;
&lt;h4&gt;Links&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://download.5115.us/CalculatorTestSample.zip"&gt;Sample Code Download&lt;/a&gt;
&lt;/li&gt;&lt;li&gt;&lt;a href="http://weblogs.asp.net/stephenwalther/archive/2008/03/19/tdd-test-driven-development-with-visual-studio-2008-unit-tests.aspx" title="Unit Testing in Visual Studio 2008"&gt;Unit Testing in Visual Studio 2008&lt;/a&gt; 
&lt;/li&gt;&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/aa730844%28vs.80%29.aspx" title="Guidelines for Test-Driven Development"&gt;Guidelines for Test-Driven Development&lt;/a&gt; 
&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.ssw.com.au/ssw/Standards/Rules/RulesToBetterUnitTests.aspx" title="Rules to Better Unit Tests"&gt;Rules to Better Unit Tests&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=176506" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/smallfish/archive/tags/Visual+Studio+2008/default.aspx">Visual Studio 2008</category><category domain="http://blogs.microsoft.co.il/blogs/smallfish/archive/tags/Test/default.aspx">Test</category><category domain="http://blogs.microsoft.co.il/blogs/smallfish/archive/tags/WCF/default.aspx">WCF</category><category domain="http://blogs.microsoft.co.il/blogs/smallfish/archive/tags/Unit+Tests/default.aspx">Unit Tests</category><category domain="http://blogs.microsoft.co.il/blogs/smallfish/archive/tags/C_2300_/default.aspx">C#</category></item></channel></rss>