<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;DEUHRHo-eSp7ImA9WhBUE0Q.&quot;"><id>tag:blogger.com,1999:blog-2212558652617325901</id><updated>2013-05-01T04:17:15.451-04:00</updated><category term="C#" /><category term="Threading" /><category term="Visual Studio" /><category term="Attributes" /><category term="Architecture" /><category term="Tip" /><category term="Fluent interfaces" /><category term="OOP" /><category term="Parallel Extensions" /><category term="Settings" /><category term="Debug" /><category term="Design" /><category term="Parallel Computing" /><category term="Property" /><category term="Generics" /><category term="Password" /><category term="Training" /><category term="Pattens" /><category term="Reflector" /><category term="DevTeach" /><category term="Silverlight" /><category term="Extension methods" /><title>Eric De C#</title><subtitle type="html">Eric De Carufel, Parallel Extensions, Parallel Computing, C#, .NET, Design Patterns, OOP, Famework.NET 2.0, 3.0, 3.5, Visual Studio.</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://blog.decarufel.net/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://blog.decarufel.net/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/2212558652617325901/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Eric De C#</name><uri>http://www.blogger.com/profile/01046447681968794782</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_F9mN1vFyteY/STk80ggsyRI/AAAAAAAAD5g/XiVQebXFt_0/S220/Eric_De_Carufel_120x160.jpg" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>86</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/EricDeCarufelsBlog" /><feedburner:info uri="ericdecarufelsblog" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>EricDeCarufelsBlog</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><entry gd:etag="W/&quot;CUIBSX49fyp7ImA9WhBVEUw.&quot;"><id>tag:blogger.com,1999:blog-2212558652617325901.post-605716533984186254</id><published>2013-04-16T07:59:00.000-04:00</published><updated>2013-04-16T07:59:18.067-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2013-04-16T07:59:18.067-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Fluent interfaces" /><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><category scheme="http://www.blogger.com/atom/ns#" term="OOP" /><category scheme="http://www.blogger.com/atom/ns#" term="Pattens" /><title>Are you “fluent” in C#?</title><content type="html">I’m starting a new codeplex project to build a fluent library for design patterns. For example let’s take those examples. &lt;br /&gt;
Here is how to build a chain of responsibility is a standard manner:&lt;br /&gt;
&lt;pre class="brush: csharp;"&gt;var command1 = new Command1();
var command2 = new Command2("Test");
command1.NextInChain = command2;
command1.Execute(null);&lt;/pre&gt;
&lt;span style="font-family: Verdana;"&gt;Here is the same construct in a fluent manner:&lt;/span&gt;&lt;br /&gt;
&lt;pre class="brush: csharp;"&gt;var chain = new ChainBuilder&amp;lt;ChainCommand&amp;gt;()
  .Add&amp;lt;Command1&amp;gt;()
  .Add&amp;lt;Command2&amp;gt;(() =&amp;gt; new Command2("Test"))
  .Build();
chain.Execute(null);&lt;/pre&gt;
Which one do you like the most? In my case I prefer the fluent way. Building a chain of responsibility in not that difficult if you have only a handful of element to chain, but if you have more it become boring to remember to link the previous element to the next. My builder take car of that for you. Because of “fluent” concept you always now what comes next. For exmaple the ChainBuilder class only expose some overload of Add and a Build method. &lt;br /&gt;
So if you like this way of thinking, join my codeplex project and give me your feedback about it.&lt;br /&gt;
See : &lt;a href="http://fluentpatterns.codeplex.com/" title="http://fluentpatterns.codeplex.com/"&gt;http://fluentpatterns.codeplex.com/&lt;/a&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=lIUP0J7EpRo:Mjo1erFsU2g:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=lIUP0J7EpRo:Mjo1erFsU2g:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?i=lIUP0J7EpRo:Mjo1erFsU2g:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=lIUP0J7EpRo:Mjo1erFsU2g:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=lIUP0J7EpRo:Mjo1erFsU2g:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?i=lIUP0J7EpRo:Mjo1erFsU2g:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=lIUP0J7EpRo:Mjo1erFsU2g:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=lIUP0J7EpRo:Mjo1erFsU2g:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/EricDeCarufelsBlog/~4/lIUP0J7EpRo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.decarufel.net/feeds/605716533984186254/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2212558652617325901&amp;postID=605716533984186254&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2212558652617325901/posts/default/605716533984186254?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2212558652617325901/posts/default/605716533984186254?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/EricDeCarufelsBlog/~3/lIUP0J7EpRo/are-you-fluent-in-c.html" title="Are you “fluent” in C#?" /><author><name>Eric De C#</name><uri>http://www.blogger.com/profile/01046447681968794782</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_F9mN1vFyteY/STk80ggsyRI/AAAAAAAAD5g/XiVQebXFt_0/S220/Eric_De_Carufel_120x160.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.decarufel.net/2013/04/are-you-fluent-in-c.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUEBR3c7fCp7ImA9WhRVFU0.&quot;"><id>tag:blogger.com,1999:blog-2212558652617325901.post-3010703983697353178</id><published>2012-01-13T21:20:00.000-05:00</published><updated>2012-01-13T21:20:56.904-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-13T21:20:56.904-05:00</app:edited><title>Recommandation + embauche = 2000 $</title><content type="html">&lt;a href="http://pyxis-tech.com/blog/2012/01/12/recommandation-embauche-2000/?utm_source=rss&amp;amp;utm_medium=rss&amp;amp;utm_campaign=recommandation-embauche-2000"&gt;Recommandation + embauche = 2000 $&lt;/a&gt;: &lt;p&gt;Pour répondre à la demande incessante de l’Agilité, Pyxis a l’objectif d’embaucher 22 nouveaux collègues en 2012. Nous avons décidé de prendre la pénurie de main-d’œuvre en TI par les cornes : nous donnerons 2000 $ pour chaque personne recommandée embauchée.&lt;/p&gt;
&lt;p&gt;N’hésitez pas! Recommandez-nous un de vos contacts pour un des postes suivants : &lt;a href="http://pyxis-tech.com/fr/carriere/scrum-master"&gt;Scrum Master&lt;/a&gt;, &lt;a href="http://pyxis-tech.com/fr/carriere/coach-organisationnel-agile"&gt;coach organisationnel&lt;/a&gt;, &lt;a href="http://pyxis-tech.com/fr/carriere/coach-dequipe-agile"&gt;coach d’équipe&lt;/a&gt; ou &lt;a href="http://pyxis-tech.com/fr/carriere/conseiller-en-developpement"&gt;conseiller technique&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Si la personne recommandée est embauchée, nous vous remettrons 2000 $. C’est aussi simple que ça!&lt;/p&gt;
&lt;p&gt;&lt;a href="http://pyxis-tech.info/reference/etape3/"&gt;&lt;img src="http://pyxis-tech.com/docs/sizes/4f0dc5e61e9c0/source/bouton-candidat-ideal.png" alt="" width="300" height="46" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=gLH6woF4wig:ady-4JgaVEA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=gLH6woF4wig:ady-4JgaVEA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?i=gLH6woF4wig:ady-4JgaVEA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=gLH6woF4wig:ady-4JgaVEA:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=gLH6woF4wig:ady-4JgaVEA:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?i=gLH6woF4wig:ady-4JgaVEA:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=gLH6woF4wig:ady-4JgaVEA:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=gLH6woF4wig:ady-4JgaVEA:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/EricDeCarufelsBlog/~4/gLH6woF4wig" height="1" width="1"/&gt;</content><link rel="related" href="http://pyxis-tech.com/blog/2012/01/12/recommandation-embauche-2000/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=recommandation-embauche-2000" title="Recommandation + embauche = 2000 $" /><link rel="replies" type="application/atom+xml" href="http://blog.decarufel.net/feeds/3010703983697353178/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2212558652617325901&amp;postID=3010703983697353178&amp;isPopup=true" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2212558652617325901/posts/default/3010703983697353178?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2212558652617325901/posts/default/3010703983697353178?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/EricDeCarufelsBlog/~3/gLH6woF4wig/recommandation-embauche-2000.html" title="Recommandation + embauche = 2000 $" /><author><name>Eric De C#</name><uri>http://www.blogger.com/profile/01046447681968794782</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_F9mN1vFyteY/STk80ggsyRI/AAAAAAAAD5g/XiVQebXFt_0/S220/Eric_De_Carufel_120x160.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://blog.decarufel.net/2012/01/recommandation-embauche-2000.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DE4HRHw-eSp7ImA9WhRRFkw.&quot;"><id>tag:blogger.com,1999:blog-2212558652617325901.post-4041887116456197558</id><published>2011-11-29T20:35:00.001-05:00</published><updated>2011-11-29T20:35:35.251-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-29T20:35:35.251-05:00</app:edited><title>Top 5 ways to improve your code</title><content type="html">&lt;p&gt;For all of you here it is&lt;/p&gt;  &lt;div style="width: 425px" id="__ss_10390617"&gt;&lt;strong style="margin: 12px 0px 4px; display: block"&gt;&lt;a title="Top 5 des meilleures façon d&amp;#39;améliorer ton code" href="http://www.slideshare.net/ericdecarufel/top-5-des-meilleures-faon-damliorer-ton-code"&gt;Top 5 des meilleures façon d'améliorer ton code&lt;/a&gt;&lt;/strong&gt;&lt;object id="__sse10390617" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=arc305frca-111129192007-phpapp01&amp;amp;stripped_title=top-5-des-meilleures-faon-damliorer-ton-code&amp;amp;userName=ericdecarufel" /&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;param name="allowScriptAccess" value="always" /&gt;&lt;param name="wmode" value="transparent" /&gt;&lt;embed name="__sse10390617" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=arc305frca-111129192007-phpapp01&amp;amp;stripped_title=top-5-des-meilleures-faon-damliorer-ton-code&amp;amp;userName=ericdecarufel" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" wmode="transparent" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;    &lt;div style="padding-bottom: 12px; padding-left: 0px; padding-right: 0px; padding-top: 5px"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/ericdecarufel"&gt;Eric De Carufel&lt;/a&gt;.&lt;/div&gt; &lt;/div&gt;  &lt;div style="width: 425px" id="__ss_10390621"&gt;&lt;strong style="margin: 12px 0px 4px; display: block"&gt;&lt;a title="Arc305   en" href="http://www.slideshare.net/ericdecarufel/arc305-en"&gt;Arc305 en&lt;/a&gt;&lt;/strong&gt;&lt;object id="__sse10390621" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=arc305-en-111129192021-phpapp02&amp;amp;stripped_title=arc305-en&amp;amp;userName=ericdecarufel" /&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;param name="allowScriptAccess" value="always" /&gt;&lt;param name="wmode" value="transparent" /&gt;&lt;embed name="__sse10390621" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=arc305-en-111129192021-phpapp02&amp;amp;stripped_title=arc305-en&amp;amp;userName=ericdecarufel" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" wmode="transparent" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;    &lt;div style="padding-bottom: 12px; padding-left: 0px; padding-right: 0px; padding-top: 5px"&gt;View more &lt;a href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/ericdecarufel"&gt;Eric De Carufel&lt;/a&gt;.&lt;/div&gt; &lt;/div&gt;  &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=taFJGBkcI4k:R3fjAzRNea4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=taFJGBkcI4k:R3fjAzRNea4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?i=taFJGBkcI4k:R3fjAzRNea4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=taFJGBkcI4k:R3fjAzRNea4:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=taFJGBkcI4k:R3fjAzRNea4:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?i=taFJGBkcI4k:R3fjAzRNea4:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=taFJGBkcI4k:R3fjAzRNea4:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=taFJGBkcI4k:R3fjAzRNea4:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/EricDeCarufelsBlog/~4/taFJGBkcI4k" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.decarufel.net/feeds/4041887116456197558/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2212558652617325901&amp;postID=4041887116456197558&amp;isPopup=true" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2212558652617325901/posts/default/4041887116456197558?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2212558652617325901/posts/default/4041887116456197558?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/EricDeCarufelsBlog/~3/taFJGBkcI4k/top-5-ways-to-improve-your-code.html" title="Top 5 ways to improve your code" /><author><name>Eric De C#</name><uri>http://www.blogger.com/profile/01046447681968794782</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_F9mN1vFyteY/STk80ggsyRI/AAAAAAAAD5g/XiVQebXFt_0/S220/Eric_De_Carufel_120x160.jpg" /></author><thr:total>3</thr:total><feedburner:origLink>http://blog.decarufel.net/2011/11/top-5-ways-to-improve-your-code.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C04BRXk-cCp7ImA9WhdWGUw.&quot;"><id>tag:blogger.com,1999:blog-2212558652617325901.post-8419641690418249299</id><published>2011-09-13T07:05:00.000-04:00</published><updated>2011-09-13T07:05:54.758-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-13T07:05:54.758-04:00</app:edited><title>Vote for Your Favourite Session to be Included in TechDays 2011</title><content type="html">&lt;a href="http://feedproxy.google.com/~r/CanDevs/~3/GZvhvvFDhww/vote-for-your-favourite-session-to-be-included-in-techdays-2011.aspx"&gt;Vote for Your Favourite Session to be Included in TechDays 2011&lt;/a&gt;: &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-60-29-metablogapi/0181.techdays_5F00_canada_5F00_3_5F00_261EE619.jpg"&gt;&lt;img style="border-right-width:0px;margin:0px 5px 3px 0px;padding-left:0px;padding-right:0px;display:inline;float:left;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px" title="techdays_canada_3" border="0" alt="techdays_canada_3" align="left" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-60-29-metablogapi/1663.techdays_5F00_canada_5F00_3_5F00_thumb_5F00_00B4F2AB.jpg" width="244" height="100" /&gt;&lt;/a&gt;&lt;span &gt;&lt;strong&gt;WOW!&lt;/strong&gt;&lt;/span&gt;  That’s all I can say to the response we received to our &lt;a href="http://blogs.technet.com/b/canitpro/archive/2011/08/18/techdays-2011-session-submissions-now-open.aspx"&gt;open call for sessions&lt;/a&gt; for &lt;a href="http://www.techdays.ca/"&gt;TechDays 2011&lt;/a&gt;!  We had almost 60 individuals submit close to 130 sessions to be delivered at TechDays 2011 in Toronto, Vancouver and Montreal.  This made the task of narrowing it down for a short list for your votes challenging to say the least but we were able to make it happen.  Now it’s your turn!&lt;/p&gt;  &lt;p&gt;Today we have made all of the sessions on the short list available for you to cast your vote and tell us the kind of content you want delivered at TechDays 2011 that would help you grow in your career and help your organization grow their IT infrastructure and applications.  &lt;/p&gt;  &lt;p&gt;To cast your vote for the sessions you want to see at TechDays 2011, go to &lt;a href="http://bit.ly/tdcan2011vote"&gt;http://bit.ly/tdcan2011vote&lt;/a&gt; and make your selections.  Voting is open until 11:59pm Eastern Time on Friday, September 16th so cast your votes now.  Just like in all those reality shows featuring great talent, you need to vote for the sessions and individuals who proposed them if you want to see them at TechDays 2011 so don’t wait – &lt;a href="http://bit.ly/tdcan2011vote"&gt;&lt;span &gt;&lt;strong&gt;VOTE NOW&lt;/strong&gt;&lt;/span&gt;&lt;/a&gt;!! &lt;/p&gt;  &lt;p&gt;We will be announcing the sessions selected from the audience vote next week.  &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-60-29-metablogapi/4774.DamirB_2D00_BlogSignature_5F00_43B0C118.png"&gt;&lt;img style="border-right-width:0px;padding-left:0px;padding-right:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;padding-top:0px" title="DamirB-BlogSignature" border="0" alt="DamirB-BlogSignature" src="http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-00-60-29-metablogapi/2627.DamirB_2D00_BlogSignature_5F00_thumb_5F00_2FB72E82.png" width="88" height="52" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both"&gt;&lt;/div&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=10209721" width="1" height="1" /&gt;&lt;div&gt;
&lt;a href="http://feeds.feedburner.com/~ff/CanDevs?a=GZvhvvFDhww:IiZvanCA11I:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CanDevs?d=yIl2AUoC8zA" border="0" /&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CanDevs?a=GZvhvvFDhww:IiZvanCA11I:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CanDevs?i=GZvhvvFDhww:IiZvanCA11I:V_sGLiPBpWU" border="0" /&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CanDevs?a=GZvhvvFDhww:IiZvanCA11I:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CanDevs?d=7Q72WNTAKBA" border="0" /&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CanDevs?a=GZvhvvFDhww:IiZvanCA11I:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CanDevs?d=qj6IDK7rITs" border="0" /&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/CanDevs?a=GZvhvvFDhww:IiZvanCA11I:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/CanDevs?i=GZvhvvFDhww:IiZvanCA11I:D7DqB2pKExk" border="0" /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/CanDevs/~4/GZvhvvFDhww" height="1" width="1" /&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=h1zxap7s19g:mQaRcnJrHbk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=h1zxap7s19g:mQaRcnJrHbk:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?i=h1zxap7s19g:mQaRcnJrHbk:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=h1zxap7s19g:mQaRcnJrHbk:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=h1zxap7s19g:mQaRcnJrHbk:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?i=h1zxap7s19g:mQaRcnJrHbk:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=h1zxap7s19g:mQaRcnJrHbk:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=h1zxap7s19g:mQaRcnJrHbk:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/EricDeCarufelsBlog/~4/h1zxap7s19g" height="1" width="1"/&gt;</content><link rel="related" href="http://feedproxy.google.com/~r/CanDevs/~3/GZvhvvFDhww/vote-for-your-favourite-session-to-be-included-in-techdays-2011.aspx" title="Vote for Your Favourite Session to be Included in TechDays 2011" /><link rel="replies" type="application/atom+xml" href="http://blog.decarufel.net/feeds/8419641690418249299/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2212558652617325901&amp;postID=8419641690418249299&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2212558652617325901/posts/default/8419641690418249299?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2212558652617325901/posts/default/8419641690418249299?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/EricDeCarufelsBlog/~3/h1zxap7s19g/vote-for-your-favourite-session-to-be.html" title="Vote for Your Favourite Session to be Included in TechDays 2011" /><author><name>Eric De C#</name><uri>http://www.blogger.com/profile/01046447681968794782</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_F9mN1vFyteY/STk80ggsyRI/AAAAAAAAD5g/XiVQebXFt_0/S220/Eric_De_Carufel_120x160.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.decarufel.net/2011/09/vote-for-your-favourite-session-to-be.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUAGR34zfip7ImA9WhZSE0s.&quot;"><id>tag:blogger.com,1999:blog-2212558652617325901.post-136316198251983975</id><published>2011-03-28T21:29:00.001-04:00</published><updated>2011-03-28T21:55:26.086-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-03-28T21:55:26.086-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Tip" /><category scheme="http://www.blogger.com/atom/ns#" term="Property" /><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><category scheme="http://www.blogger.com/atom/ns#" term="Silverlight" /><title>How to Databind to ListBox’s SelectedItems property (Silverlight)</title><content type="html">&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;It’s been a while since the last time I published some useful code sample. I apologize!&lt;/p&gt;  &lt;p&gt;Today I found what I qualify as a bug in Silverlight 4.0. Those who know me are aware that I’m working on a big Silverlight project for about a year now. As you also know I’m a big fan of patterns and for Silverlight, the obvious one is MVVM. &lt;/p&gt;  &lt;p&gt;Every pattern has its own standard and often its own framework. With MVVM the omnipresent framework feature is Databinding. In XAML, Databinding is really powerful. Of course Silverlight doesn’t have all the power WPF has but almost. I’m already used to deal with the limitation of Silverlight binding and the lack of Markup extension for example. But today I it a wall with something I didn’t expect, data binding to the SelectedItems property of a ListBox.&lt;/p&gt;  &lt;p&gt;If you look closely at ListBox’s properties you will find that almost all of them are DependencyProperty except for SelectedItems (don’t miss the “s”). SelectedItem (without an “s”) is a ok but not SelectedItems. Why? I suppose its was forgotten.&lt;/p&gt;  &lt;p&gt;How to fix that? I found many complex implementation of solution to solve this issue but I didn’t found one I was satisfied with. When trying to debug this “bug” I realized that if I inspect the content of the SelectedItems property in the debug view then the binding was working. So I came up with a solution around that strange side effect.&lt;/p&gt;  &lt;p&gt;First let’s try to reproduce the problem. The first thing you need to do is to create a new Silverlight application. Accept all the default, it doesn’t matter. Next put this code in the MainPage.xaml&lt;/p&gt;  &lt;pre class="brush: xml;"&gt;&amp;lt;UserControl x:Class=&amp;quot;ListBoxSelecteItemsBug.MainPage&amp;quot;
             xmlns=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&amp;quot;
             xmlns:x=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml&amp;quot;
             xmlns:d=&amp;quot;http://schemas.microsoft.com/expression/blend/2008&amp;quot;
             xmlns:mc=&amp;quot;http://schemas.openxmlformats.org/markup-compatibility/2006&amp;quot;
             xmlns:fix=&amp;quot;clr-namespace:ListBoxSelecteItemsBug&amp;quot;
             mc:Ignorable=&amp;quot;d&amp;quot;
             d:DesignHeight=&amp;quot;300&amp;quot;
             d:DesignWidth=&amp;quot;400&amp;quot;&amp;gt;

    &amp;lt;Grid x:Name=&amp;quot;LayoutRoot&amp;quot;
          Background=&amp;quot;White&amp;quot;&amp;gt;
        &amp;lt;StackPanel Orientation=&amp;quot;Vertical&amp;quot;&amp;gt;
            &amp;lt;ListBox x:Name=&amp;quot;myListBox&amp;quot;
                     Height=&amp;quot;200&amp;quot;
               SelectionMode=&amp;quot;Extended&amp;quot;
                     ItemsSource=&amp;quot;{Binding MyItems}&amp;quot; /&amp;gt;

            &amp;lt;Button Content=&amp;quot;Click me&amp;quot;
                    Command=&amp;quot;{Binding DoItCommand}&amp;quot;
                    CommandParameter=&amp;quot;{Binding SelectedItems, ElementName=myListBox}&amp;quot; /&amp;gt;
      &amp;lt;Button Content=&amp;quot;Make it work&amp;quot;
              Click=&amp;quot;ButtonBase_OnClick&amp;quot; /&amp;gt;
        &amp;lt;/StackPanel&amp;gt;
    &amp;lt;/Grid&amp;gt;
&amp;lt;/UserControl&amp;gt;&lt;/pre&gt;

&lt;p&gt;Notice the “CommandParameter” binding at line 22 binding to “SelectedItems” on “myListBox”. Then Put the following code in the MainPage.xaml.cs (code behind).&lt;/p&gt;

&lt;pre class="brush: csharp;"&gt;using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Data;
using System.Windows.Input;

namespace ListBoxSelecteItemsBug
{
  public partial class MainPage : UserControl
  {
    private readonly ICommand _doItCommand = new MyCommand();
    private readonly ObservableCollection&amp;lt;string&amp;gt; _myItems = new ObservableCollection&amp;lt;string&amp;gt;();

    public MainPage()
    {
      _myItems.Add(&amp;quot;test1&amp;quot;);
      _myItems.Add(&amp;quot;test2&amp;quot;);
      _myItems.Add(&amp;quot;test3&amp;quot;);
      _myItems.Add(&amp;quot;test4&amp;quot;);
      _myItems.Add(&amp;quot;test5&amp;quot;);
      _myItems.Add(&amp;quot;test6&amp;quot;);
      _myItems.Add(&amp;quot;test7&amp;quot;);

      InitializeComponent();

      DataContext = this;
    }

    public ICommand DoItCommand
    {
      get { return _doItCommand; }
    }

    public ObservableCollection&amp;lt;string&amp;gt; MyItems
    {
      get { return _myItems; }
    }

    private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
    {
      MessageBox.Show(string.Format(&amp;quot;{0} actual selected items&amp;quot;, myListBox.SelectedItems.Count));
    }
  }

  public class MyCommand : ICommand
  {
    #region ICommand Members

    public bool CanExecute(object parameter)
    {
      return true;
    }

    public void Execute(object parameter)
    {
      var list = (ICollection&amp;lt;object&amp;gt;) parameter;
      MessageBox.Show(string.Format(&amp;quot;{0} items selected&amp;quot;, list.Count()));
    }

    public event EventHandler CanExecuteChanged;

    #endregion
  }
}&lt;/pre&gt;

&lt;p&gt;For simplicity purpose I put everything in the same file but wouldn’t do that normally. &lt;/p&gt;

&lt;p&gt;The concept here is simple. If you run this application you will see a ListBox with 7 items in it. You can select one or more of these items and click on “Click me” button. If you do that you should see a popup with “0 items selected” displayed. This proves that the “SelectedItems” is not working. Now if you click on “Make it work” button you should see the actual number of item you have selected previously. Now click again on “Click me” and the number should also be right.&lt;/p&gt;

&lt;p&gt;What happened in this sequence of event is simple. The first time you click on “Click me” button you see the initial binding value of number of “SelectedItems” which is 0. The next time you click on it will display the right number because accessing “SelectedItems” outside of data binding seems to refresh its value.&lt;/p&gt;

&lt;p&gt;How can we trigger that refresh automatically? With an attached property.&lt;/p&gt;

&lt;p&gt;Now add a new file to the Silverlight project call it ListBoxFix and paste it this content:&lt;/p&gt;

&lt;pre class="brush: csharp; highlight: [20];"&gt;using System.Windows;

namespace ListBoxSelecteItemsBug
{
  public static class ListBoxFix
  {
    public static bool GetSelectedItemsBinding(System.Windows.Controls.ListBox element)
    {
      return (bool)element.GetValue(SelectedItemsBindingProperty);
    }
      
    public static void SetSelectedItemsBinding(System.Windows.Controls.ListBox element, bool value)
    {
      element.SetValue(SelectedItemsBindingProperty, value);
      if (value)
      {
        element.SelectionChanged += (sender, args) =&amp;gt;
        {
          // Dummy code to refresh SelectedItems value
          var x = element.SelectedItems;
        };
      }
    }

    public static readonly DependencyProperty SelectedItemsBindingProperty =
        DependencyProperty.RegisterAttached(&amp;quot;FixSlecetedItemsBinding&amp;quot;,
        typeof(bool), typeof(FrameworkElement), new PropertyMetadata(false));
  }
}&lt;/pre&gt;

&lt;p&gt;The key here is the line 20. The only thing it does is accessing the “SelectedItems”. The last thing to do is to use that AttachedProperty in our ListBox:&lt;/p&gt;

&lt;pre class="brush: xml; first-line: 14; highlight: [16];"&gt;            &amp;lt;ListBox x:Name=&amp;quot;myListBox&amp;quot;
                     Height=&amp;quot;200&amp;quot;
               fix:ListBox.SelectedItemsBinding=&amp;quot;True&amp;quot;
               SelectionMode=&amp;quot;Extended&amp;quot;
                     ItemsSource=&amp;quot;{Binding MyItems}&amp;quot; /&amp;gt;&lt;/pre&gt;

&lt;p&gt;Doing that, triggers the binding to be refreshed and everything should work.&lt;/p&gt;  &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=YVdjoql3HNI:xP1G4dPFJI0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=YVdjoql3HNI:xP1G4dPFJI0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?i=YVdjoql3HNI:xP1G4dPFJI0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=YVdjoql3HNI:xP1G4dPFJI0:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=YVdjoql3HNI:xP1G4dPFJI0:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?i=YVdjoql3HNI:xP1G4dPFJI0:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=YVdjoql3HNI:xP1G4dPFJI0:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=YVdjoql3HNI:xP1G4dPFJI0:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/EricDeCarufelsBlog/~4/YVdjoql3HNI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.decarufel.net/feeds/136316198251983975/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2212558652617325901&amp;postID=136316198251983975&amp;isPopup=true" title="9 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2212558652617325901/posts/default/136316198251983975?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2212558652617325901/posts/default/136316198251983975?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/EricDeCarufelsBlog/~3/YVdjoql3HNI/how-to-databind-to-listboxs.html" title="How to Databind to ListBox’s SelectedItems property (Silverlight)" /><author><name>Eric De C#</name><uri>http://www.blogger.com/profile/01046447681968794782</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_F9mN1vFyteY/STk80ggsyRI/AAAAAAAAD5g/XiVQebXFt_0/S220/Eric_De_Carufel_120x160.jpg" /></author><thr:total>9</thr:total><feedburner:origLink>http://blog.decarufel.net/2011/03/how-to-databind-to-listboxs.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUIBQX8_eSp7ImA9Wx9WGUg.&quot;"><id>tag:blogger.com,1999:blog-2212558652617325901.post-2610316038294880146</id><published>2011-01-25T07:12:00.001-05:00</published><updated>2011-01-25T07:12:30.141-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-01-25T07:12:30.141-05:00</app:edited><title>Using a ToDo list more effectively</title><content type="html">&lt;p&gt;Have you ever had the need to place a TODO in your code? I’m sure we’ve all done so, for some reason or another. Normally it’s just a temporary reminder that we’ll get back to after finishing off something else, in an attempt to avoid breaking the expensive flow we get our minds into when writing code.&lt;/p&gt;  &lt;p&gt;Similar to comments however, TODO’s are only valuable if they have meaningful information, and much like comments, we developers, aren’t necessarily to attentive to such things. A TODO can be a bug, a code smell, an optimization or even a feature that would need to be logged. As such, it would be more valuable if things TODO’s were defined correctly, something that doesn’t often happen (specially when considering the whole flow thing…). That translates into expecting TODO’s inline with:&lt;/p&gt;  &lt;p&gt;// TODO: this needs cleaning up&lt;/p&gt;  &lt;p&gt;// FEATURE: Need to add support for XYZ&lt;/p&gt;  &lt;p&gt;but in turn we get:&lt;/p&gt;  &lt;p&gt;// this is some stinky piece of code&lt;/p&gt;  &lt;p&gt;// ultimately we need to support feature XYZ&lt;/p&gt;  &lt;p&gt;// this code smells worse than a dark alley next to a Club on a Sunday morning&lt;/p&gt;  &lt;p&gt;The problem with this, apart from the inconsistency that can cause you sleepless nights, is that things can get lost. The TaskList feature in Visual Studio requires these kind of comments to follow a certain pattern, and even when that occurs, the way they are presented leaves a bit to be desired.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.jetbrains.com/dotnet/wp-content/uploads/2011/01/image13.png"&gt;&lt;img title="image" border="0" alt="image" src="http://blogs.jetbrains.com/dotnet/wp-content/uploads/2011/01/image-thumb13.png" width="664" height="262" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h6&gt;[Visual Studio Task List]&lt;/h6&gt;  &lt;h5&gt;Enhancing ToDo’s&lt;/h5&gt;  &lt;p&gt;ReSharper ToDo management adds several benefits over Visual Studio’s built-in. But before we see these, let’s first examine how we can solve the previous problem. To recall, what we want to do is be able to support multiple formats when it comes to defining comments, so &lt;em&gt;// TODO: fix this &lt;/em&gt;and &lt;em&gt;// add this to the list of ToDo’s to fix &lt;/em&gt;both would appear under the list of ToDo’s.&lt;/p&gt;  &lt;p&gt;Fortunately, the way &lt;a href="http://www.jetbrains.com/resharper"&gt;ReSharper&lt;/a&gt; allows us to define ToDo items make this very simple. First, in order to access the definitions, we go to &lt;strong&gt;ReSharper| Options | ToDo Items&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.jetbrains.com/dotnet/wp-content/uploads/2011/01/image14.png"&gt;&lt;img title="image" border="0" alt="image" src="http://blogs.jetbrains.com/dotnet/wp-content/uploads/2011/01/image-thumb14.png" width="294" height="380" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Selecting any of the items (for instance the first one) and double-clicking or clicking on Edit, we get the definition dialog box:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.jetbrains.com/dotnet/wp-content/uploads/2011/01/snaghtmld8e0cd3.png"&gt;&lt;img title="SNAGHTMLd8e0cd3" border="0" alt="SNAGHTMLd8e0cd3" src="http://blogs.jetbrains.com/dotnet/wp-content/uploads/2011/01/snaghtmld8e0cd3-thumb.png" width="364" height="265" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;As opposed to the default Visual Studio, with ReSharper we use regular expression. This provides us with the flexibility required. The above example for instance is telling ReSharper to search for any pattern that contains the word TODO in it. By default, normally these patterns are searched for in comments, although we can optionally look in strings and identifiers too. We do not have to worry about defining case-sensitivity in the regular expression. Instead we can just mark the Case sensitive checkbox if we require it. Finally, we can define the color and icon we want displayed when viewing the list of items (which we’ll see later on).&lt;/p&gt;  &lt;h5&gt;Adding new Items&lt;/h5&gt;  &lt;p&gt;By default, out of the box, ReSharper comes with four items (Todo, Bug, Note and NotImplemented). We can easily extend this to offer support for other items such as identifying code smells, features, etc. Easiest way is to simply click on an existing item and Duplicate it:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.jetbrains.com/dotnet/wp-content/uploads/2011/01/snaghtmldbf5c1b.png"&gt;&lt;img title="SNAGHTMLdbf5c1b" border="0" alt="SNAGHTMLdbf5c1b" src="http://blogs.jetbrains.com/dotnet/wp-content/uploads/2011/01/snaghtmldbf5c1b-thumb.png" width="364" height="265" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h5&gt;Searching and Filtering Items&lt;/h5&gt;  &lt;p&gt;Having the items defined, we can now display a list of them by invoking the Todo Items Explorer from &lt;strong&gt;ReSharper | Tools | To-do Items&lt;/strong&gt;, or pressing &lt;strong&gt;Ctrl+Alt+D&lt;/strong&gt; (VS Scheme)&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.jetbrains.com/dotnet/wp-content/uploads/2011/01/snaghtmldc547b1.png"&gt;&lt;img title="SNAGHTMLdc547b1" border="0" alt="SNAGHTMLdc547b1" src="http://blogs.jetbrains.com/dotnet/wp-content/uploads/2011/01/snaghtmldc547b1-thumb.png" width="523" height="265" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;The advantage of course is that it is not required for items to begin with a certain word, as this can be in any position of the string. ReSharper also allows us to filter items so that we can focus on a specific type of task by using the Filter option:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.jetbrains.com/dotnet/wp-content/uploads/2011/01/image15.png"&gt;&lt;img title="image" border="0" alt="image" src="http://blogs.jetbrains.com/dotnet/wp-content/uploads/2011/01/image-thumb15.png" width="538" height="107" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;which can also be customized using under &lt;strong&gt;Tools | Options&lt;/strong&gt; (accessible too from the To-do Explorer [icon to the left of Filter]). Last but not least, we can also group items by a variety of options, from namespaces to projects, to types, etc.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.jetbrains.com/dotnet/wp-content/uploads/2011/01/snaghtmldc90bf9.png"&gt;&lt;img title="SNAGHTMLdc90bf9" border="0" alt="SNAGHTMLdc90bf9" src="http://blogs.jetbrains.com/dotnet/wp-content/uploads/2011/01/snaghtmldc90bf9-thumb.png" width="523" height="265" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Now that’s what I call a colorful, albeit long list of tasks&lt;/p&gt;  &lt;p&gt;Source: &lt;a href="http://blogs.jetbrains.com/dotnet/2011/01/using-a-todo-list-more-effectively/" target="_blank"&gt;Jetbrain&lt;/a&gt;.&lt;/p&gt;  &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=Zqv5IbasN5g:eOAtn7yjDtk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=Zqv5IbasN5g:eOAtn7yjDtk:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?i=Zqv5IbasN5g:eOAtn7yjDtk:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=Zqv5IbasN5g:eOAtn7yjDtk:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=Zqv5IbasN5g:eOAtn7yjDtk:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?i=Zqv5IbasN5g:eOAtn7yjDtk:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=Zqv5IbasN5g:eOAtn7yjDtk:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=Zqv5IbasN5g:eOAtn7yjDtk:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/EricDeCarufelsBlog/~4/Zqv5IbasN5g" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.decarufel.net/feeds/2610316038294880146/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2212558652617325901&amp;postID=2610316038294880146&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2212558652617325901/posts/default/2610316038294880146?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2212558652617325901/posts/default/2610316038294880146?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/EricDeCarufelsBlog/~3/Zqv5IbasN5g/using-todo-list-more-effectively.html" title="Using a ToDo list more effectively" /><author><name>Eric De C#</name><uri>http://www.blogger.com/profile/01046447681968794782</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_F9mN1vFyteY/STk80ggsyRI/AAAAAAAAD5g/XiVQebXFt_0/S220/Eric_De_Carufel_120x160.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.decarufel.net/2011/01/using-todo-list-more-effectively.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkAHQHY9eip7ImA9Wx9XGEg.&quot;"><id>tag:blogger.com,1999:blog-2212558652617325901.post-129007893399216630</id><published>2011-01-12T12:52:00.000-05:00</published><updated>2011-01-12T12:52:11.862-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-01-12T12:52:11.862-05:00</app:edited><title>TFS 2010 - Urban Turtle for a Better Scrum</title><content type="html">&lt;a href="http://feedproxy.google.com/~r/ShaiRaiten/~3/Pfw6Iexwipw/tfs-2010-urban-turtle-for-a-better-scrum.aspx"&gt;TFS 2010 - Urban Turtle for a Better Scrum&lt;/a&gt;: "&lt;a href="http://urbanturtle.com/"&gt;&lt;img style="display:inline;float:right" alt="Urban Turtle logo" align="right" src="http://urbanturtle.com/images/2_urbanturtle-logo.png" /&gt;&lt;/a&gt;  &lt;h1&gt;&lt;img src="http://urbanturtle.com/images/2_rocket-turtle.png" width="107" height="60" alt="" /&gt;TFS 2010 - Urban Turtle for a Better Scrum &lt;/h1&gt;  &lt;p&gt;If you doing Scrum in TFS 2010 this is an Add-on you can’t ignore!!! &lt;a href="http://urbanturtle.com/"&gt;Urban Turtle&lt;/a&gt; is built by &lt;a href="http://pyxis-tech.com/en/home"&gt;Pyxis Technologies&lt;/a&gt; and provides an awesome Scrum experience for TFS.&lt;/p&gt;  &lt;p&gt;Urban Turtle will assist you with your Scrum process with a beautiful Interface and easy functionality though TFS 2010 Web Access.&lt;/p&gt;  &lt;p&gt;Sounds Good? give it a try &lt;a href="http://urbanturtle.com/"&gt;http://urbanturtle.com&lt;/a&gt; – You can download it for 30 days &lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/b/bharry/archive/2011/01/05/urban-turtle-for-scrum-and-tfs.aspx"&gt;Ream More from Brian Harry&lt;/a&gt;&lt;/p&gt;  &lt;h3&gt;&lt;u&gt;&lt;span style="font-weight:bold"&gt;Planning Board&lt;/span&gt;&lt;/u&gt;&lt;/h3&gt;  &lt;ul&gt;   &lt;li&gt;Prioritize your backlog using drag-and-drop interface&lt;/li&gt;    &lt;li&gt;Change to priority of a user story and the task will automatically follow &lt;/li&gt;    &lt;li&gt;Easy filtering let's you focus on what you are doing&lt;/li&gt;    &lt;li&gt;Plan your work with a simple drag-and-drop &lt;/li&gt;    &lt;li&gt;Effortlessly add tasks to a user story&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/shair/image_79C3C96B.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px" title="image" border="0" alt="image" src="http://blogs.microsoft.co.il/blogs/shair/image_thumb_73D90005.png" width="853" height="322" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h3&gt;&lt;span style="font-weight:bold"&gt;&lt;u&gt;Task Board&lt;/u&gt;&lt;/span&gt;&lt;/h3&gt;  &lt;ul&gt;   &lt;li&gt;Task board to view completed, ongoing and remaining work at a glance&lt;/li&gt;    &lt;li&gt;Select or close a task in a second using drag-and-drop &lt;/li&gt;    &lt;li&gt;Increase the efficiency of your Daily Scrum by providing transparency to your team &lt;/li&gt;    &lt;li&gt;Sprint Burndown with live data to make sure you deliver what you are committed to&lt;/li&gt;    &lt;li&gt;Makes impediment visible to easily eliminate it&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;a href="http://blogs.microsoft.co.il/blogs/shair/image_7EF26482.png"&gt;&lt;img style="border-bottom:0px;border-left:0px;padding-left:0px;padding-right:0px;display:inline;border-top:0px;border-right:0px;padding-top:0px" title="image" border="0" alt="image" src="http://blogs.microsoft.co.il/blogs/shair/image_thumb_30D9DF40.png" width="859" height="382" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=769510" width="1" height="1" /&gt;&lt;img src="http://feeds.feedburner.com/~r/ShaiRaiten/~4/Pfw6Iexwipw" height="1" width="1" /&gt;"&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=AMNy2CAmz64:blG9kYSjKJg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=AMNy2CAmz64:blG9kYSjKJg:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?i=AMNy2CAmz64:blG9kYSjKJg:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=AMNy2CAmz64:blG9kYSjKJg:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=AMNy2CAmz64:blG9kYSjKJg:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?i=AMNy2CAmz64:blG9kYSjKJg:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=AMNy2CAmz64:blG9kYSjKJg:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=AMNy2CAmz64:blG9kYSjKJg:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/EricDeCarufelsBlog/~4/AMNy2CAmz64" height="1" width="1"/&gt;</content><link rel="related" href="http://feedproxy.google.com/~r/ShaiRaiten/~3/Pfw6Iexwipw/tfs-2010-urban-turtle-for-a-better-scrum.aspx" title="TFS 2010 - Urban Turtle for a Better Scrum" /><link rel="replies" type="application/atom+xml" href="http://blog.decarufel.net/feeds/129007893399216630/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2212558652617325901&amp;postID=129007893399216630&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2212558652617325901/posts/default/129007893399216630?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2212558652617325901/posts/default/129007893399216630?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/EricDeCarufelsBlog/~3/AMNy2CAmz64/tfs-2010-urban-turtle-for-better-scrum.html" title="TFS 2010 - Urban Turtle for a Better Scrum" /><author><name>Eric De C#</name><uri>http://www.blogger.com/profile/01046447681968794782</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_F9mN1vFyteY/STk80ggsyRI/AAAAAAAAD5g/XiVQebXFt_0/S220/Eric_De_Carufel_120x160.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.decarufel.net/2011/01/tfs-2010-urban-turtle-for-better-scrum.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEICRXo-cCp7ImA9Wx9XF0s.&quot;"><id>tag:blogger.com,1999:blog-2212558652617325901.post-2670808372645862475</id><published>2011-01-11T11:16:00.001-05:00</published><updated>2011-01-11T11:16:04.458-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-01-11T11:16:04.458-05:00</app:edited><title>Urban Turtle–The best add-in to VS2010 for Agile development</title><content type="html">&lt;p&gt;&lt;a href="http://urbanturtle.com/"&gt;&lt;img style="display: inline; float: right" alt="Urban Turtle logo" align="right" src="http://urbanturtle.com/images/2_urbanturtle-logo.png" width="150" height="93" /&gt;&lt;/a&gt;Everyone wants to do agile software development these days but without the right tool its near to impossible. Pyxis is working for months to put their expertise in agile software development in a box called Urban Turtle.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Mario Cardinal, the host of the Visual Studio Talk Show, is quite happy these days. He works with the Urban Turtle team and they received significant support from Microsoft. Brian Harry, who is the Product Unit Manager for Team Foundation Server, has published an outstanding blog post about Urban Turtle that says: &amp;quot;&lt;b&gt;...awesome Scrum experience for TFS.&lt;/b&gt;” You can read Brian Harry's blog post at the following URL: &lt;a href="http://urbanturtle.com/awesome"&gt;http://urbanturtle.com/awesome&lt;/a&gt;.&lt;/p&gt;&lt;/blockquote&gt;  &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=98wbXhE5Le4:grk6QJyBqpU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=98wbXhE5Le4:grk6QJyBqpU:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?i=98wbXhE5Le4:grk6QJyBqpU:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=98wbXhE5Le4:grk6QJyBqpU:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=98wbXhE5Le4:grk6QJyBqpU:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?i=98wbXhE5Le4:grk6QJyBqpU:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=98wbXhE5Le4:grk6QJyBqpU:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=98wbXhE5Le4:grk6QJyBqpU:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/EricDeCarufelsBlog/~4/98wbXhE5Le4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.decarufel.net/feeds/2670808372645862475/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2212558652617325901&amp;postID=2670808372645862475&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2212558652617325901/posts/default/2670808372645862475?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2212558652617325901/posts/default/2670808372645862475?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/EricDeCarufelsBlog/~3/98wbXhE5Le4/urban-turtlethe-best-add-in-to-vs2010.html" title="Urban Turtle–The best add-in to VS2010 for Agile development" /><author><name>Eric De C#</name><uri>http://www.blogger.com/profile/01046447681968794782</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_F9mN1vFyteY/STk80ggsyRI/AAAAAAAAD5g/XiVQebXFt_0/S220/Eric_De_Carufel_120x160.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.decarufel.net/2011/01/urban-turtlethe-best-add-in-to-vs2010.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEIBSHc6fyp7ImA9Wx5bEk8.&quot;"><id>tag:blogger.com,1999:blog-2212558652617325901.post-6462431495213571859</id><published>2010-10-27T20:42:00.000-04:00</published><updated>2010-10-27T20:42:39.917-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-10-27T20:42:39.917-04:00</app:edited><title>Agile approaches in 1 minute</title><content type="html">&lt;object width="480" height="295"&gt;&lt;param name="movie" value="http://www.youtube.com/v/C-KwYsjgjDE?fs=1&amp;amp;hl=en_US"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/C-KwYsjgjDE?fs=1&amp;amp;hl=en_US" width="480" height="295" allowscriptaccess="never" allowfullscreen="true" wmode="transparent" type="application/x-shockwave-flash"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=CbrEzKAU9XI:-6I_POmaIpI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=CbrEzKAU9XI:-6I_POmaIpI:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?i=CbrEzKAU9XI:-6I_POmaIpI:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=CbrEzKAU9XI:-6I_POmaIpI:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=CbrEzKAU9XI:-6I_POmaIpI:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?i=CbrEzKAU9XI:-6I_POmaIpI:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=CbrEzKAU9XI:-6I_POmaIpI:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=CbrEzKAU9XI:-6I_POmaIpI:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/EricDeCarufelsBlog/~4/CbrEzKAU9XI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.decarufel.net/feeds/6462431495213571859/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2212558652617325901&amp;postID=6462431495213571859&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2212558652617325901/posts/default/6462431495213571859?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2212558652617325901/posts/default/6462431495213571859?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/EricDeCarufelsBlog/~3/CbrEzKAU9XI/agile-approaches-in-1-minute.html" title="Agile approaches in 1 minute" /><author><name>Eric De C#</name><uri>http://www.blogger.com/profile/01046447681968794782</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_F9mN1vFyteY/STk80ggsyRI/AAAAAAAAD5g/XiVQebXFt_0/S220/Eric_De_Carufel_120x160.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.decarufel.net/2010/10/agile-approaches-in-1-minute.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkMEQn4zeip7ImA9WxFaF0k.&quot;"><id>tag:blogger.com,1999:blog-2212558652617325901.post-4407747156536001872</id><published>2010-07-21T16:33:00.001-04:00</published><updated>2010-07-21T16:33:23.082-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-07-21T16:33:23.082-04:00</app:edited><title>Agile finally made right for Visual Studio 2010</title><content type="html">&lt;p&gt;&lt;img src="http://urbanturtle.com/images/logo.png" /&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;After 35 years, 840 sprints, two generations of product owners, the team is proud to finally ship Urban Turtle with support for the new &lt;a href="http://urbanturtle.com/blog/2010/07/19/create-kickass-software-fast/"&gt;Visual Studio Scrum Template&lt;/a&gt;. It has been a long journey that seemed very short. It feels like this story began 35 days ago and not 35 years ago. Time flies.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;See our story &lt;a href="http://urbanturtle.com/ourstory/"&gt;http://urbanturtle.com/ourstory/&lt;/a&gt;&lt;/p&gt;  &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=VxM-Be_AHC0:ZvE37B6Ctio:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=VxM-Be_AHC0:ZvE37B6Ctio:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?i=VxM-Be_AHC0:ZvE37B6Ctio:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=VxM-Be_AHC0:ZvE37B6Ctio:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=VxM-Be_AHC0:ZvE37B6Ctio:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?i=VxM-Be_AHC0:ZvE37B6Ctio:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=VxM-Be_AHC0:ZvE37B6Ctio:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=VxM-Be_AHC0:ZvE37B6Ctio:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/EricDeCarufelsBlog/~4/VxM-Be_AHC0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.decarufel.net/feeds/4407747156536001872/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2212558652617325901&amp;postID=4407747156536001872&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2212558652617325901/posts/default/4407747156536001872?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2212558652617325901/posts/default/4407747156536001872?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/EricDeCarufelsBlog/~3/VxM-Be_AHC0/agile-finally-made-right-for-visual.html" title="Agile finally made right for Visual Studio 2010" /><author><name>Eric De C#</name><uri>http://www.blogger.com/profile/01046447681968794782</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_F9mN1vFyteY/STk80ggsyRI/AAAAAAAAD5g/XiVQebXFt_0/S220/Eric_De_Carufel_120x160.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.decarufel.net/2010/07/agile-finally-made-right-for-visual.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkcHQXoyfip7ImA9WxFbEE8.&quot;"><id>tag:blogger.com,1999:blog-2212558652617325901.post-4350903832547822120</id><published>2010-07-01T19:47:00.001-04:00</published><updated>2010-07-01T19:47:10.496-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-07-01T19:47:10.496-04:00</app:edited><title>MVP C# for the second time</title><content type="html">&lt;p&gt;Yes I’m in again. &lt;/p&gt;  &lt;p&gt;For the second year in a row I’m recognize as a valuable Microsoft professional. It’s great to be part of this active community of devoted people. I’ll do my best to continue to share my knowledge with all you, dear followers.&lt;/p&gt;  &lt;p&gt;I’m from Montreal, Canada but if your user group is looking for speakers maybe we can arrange something. My domains of expertise revolve around parallel computing, design patterns, Prism (Composite Application Block for WPF and Silverlight) and anything about C# programming in general.&lt;/p&gt;  &lt;p&gt;You will find my &lt;a href="http://www.decarufel.net/contact"&gt;contact information&lt;/a&gt; on &lt;a href="http://www.decarufel.net/"&gt;my web site&lt;/a&gt;.&lt;/p&gt;  &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=OIFWBVy0nTM:W6AWAUtXT1I:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=OIFWBVy0nTM:W6AWAUtXT1I:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?i=OIFWBVy0nTM:W6AWAUtXT1I:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=OIFWBVy0nTM:W6AWAUtXT1I:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=OIFWBVy0nTM:W6AWAUtXT1I:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?i=OIFWBVy0nTM:W6AWAUtXT1I:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=OIFWBVy0nTM:W6AWAUtXT1I:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=OIFWBVy0nTM:W6AWAUtXT1I:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/EricDeCarufelsBlog/~4/OIFWBVy0nTM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.decarufel.net/feeds/4350903832547822120/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2212558652617325901&amp;postID=4350903832547822120&amp;isPopup=true" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2212558652617325901/posts/default/4350903832547822120?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2212558652617325901/posts/default/4350903832547822120?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/EricDeCarufelsBlog/~3/OIFWBVy0nTM/mvp-c-for-second-time.html" title="MVP C# for the second time" /><author><name>Eric De C#</name><uri>http://www.blogger.com/profile/01046447681968794782</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_F9mN1vFyteY/STk80ggsyRI/AAAAAAAAD5g/XiVQebXFt_0/S220/Eric_De_Carufel_120x160.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://blog.decarufel.net/2010/07/mvp-c-for-second-time.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C04HQ3g8eyp7ImA9WxFXFEs.&quot;"><id>tag:blogger.com,1999:blog-2212558652617325901.post-3200538467931126930</id><published>2010-05-21T13:12:00.001-04:00</published><updated>2010-05-21T13:12:12.673-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-05-21T13:12:12.673-04:00</app:edited><title>Help yourself and Pyxis will help you</title><content type="html">&lt;p&gt;&lt;a href="http://www.pyxis-tech.com" target="_blank"&gt;&lt;img style="display: inline; margin-left: 0px; margin-right: 0px" align="right" src="http://www.dotnetmontreal.com/dnn/Portals/0/Images/Pyxis.png" /&gt;&lt;/a&gt;I’m proud to become a member of the Pyxis family.&lt;/p&gt;  &lt;p&gt;If you need some coaching to become agile Pyxis is there for you. Here how we see this.&lt;/p&gt;  &lt;p&gt;&lt;img alt="Ensemble. Developing Together. Right. Now." src="http://www.pyxis-tech.com/images/ensemble-developingtogether.png" /&gt;&lt;/p&gt;  &lt;p&gt;Ensemble, it is our way to contribute to your software development projects and help you succeed.&lt;/p&gt;  &lt;p&gt;Our collaborative development center:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Provides you with a multidisciplinary team &lt;/li&gt;    &lt;li&gt;Provides you with software engineering, software usability, and performance metric specialists to complement the team &lt;/li&gt;    &lt;li&gt;Offers a structure based on the delivery of value using a well-performing project management approach &lt;/li&gt;    &lt;li&gt;Integrates with Pyxis’ coaching and training services&lt;/li&gt; &lt;/ul&gt;  &lt;h4&gt;Benefits to develop your software Ensemble:&lt;/h4&gt;  &lt;ul&gt;   &lt;li&gt;Build rapidly a proficient and well-grounded software development team &lt;/li&gt;    &lt;li&gt;Focus on the delivery of value to your organization &lt;/li&gt;    &lt;li&gt;Have an overall view of progress &lt;/li&gt;    &lt;li&gt;Bring significant productivity gains using proven development techniques &lt;/li&gt;    &lt;li&gt;Increase the ability to adapt to change&lt;i&gt;Get a first increment of functional software after 2-4 weeks&lt;/i&gt;&lt;/li&gt;    &lt;li&gt;Ensure knowledge transfer throughout the project&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Ensemble, our development center, is the result of our experience in the supervision of dozens of Agile projects as well as in training courses and coaching services in the execution of hundreds of projects for organizations of various sizes.&lt;/p&gt;  &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=-wt1_lllMh0:VIoCNw4AB-Y:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=-wt1_lllMh0:VIoCNw4AB-Y:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?i=-wt1_lllMh0:VIoCNw4AB-Y:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=-wt1_lllMh0:VIoCNw4AB-Y:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=-wt1_lllMh0:VIoCNw4AB-Y:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?i=-wt1_lllMh0:VIoCNw4AB-Y:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=-wt1_lllMh0:VIoCNw4AB-Y:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=-wt1_lllMh0:VIoCNw4AB-Y:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/EricDeCarufelsBlog/~4/-wt1_lllMh0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.decarufel.net/feeds/3200538467931126930/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2212558652617325901&amp;postID=3200538467931126930&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2212558652617325901/posts/default/3200538467931126930?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2212558652617325901/posts/default/3200538467931126930?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/EricDeCarufelsBlog/~3/-wt1_lllMh0/help-yourself-and-pyxis-will-help-you.html" title="Help yourself and Pyxis will help you" /><author><name>Eric De C#</name><uri>http://www.blogger.com/profile/01046447681968794782</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_F9mN1vFyteY/STk80ggsyRI/AAAAAAAAD5g/XiVQebXFt_0/S220/Eric_De_Carufel_120x160.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.decarufel.net/2010/05/help-yourself-and-pyxis-will-help-you.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D04ASXo5eyp7ImA9WxFREEs.&quot;"><id>tag:blogger.com,1999:blog-2212558652617325901.post-4207600266820057935</id><published>2010-04-23T19:39:00.001-04:00</published><updated>2010-04-23T19:39:08.423-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-04-23T19:39:08.423-04:00</app:edited><title>Pex white box testing tool is now available for MSDN Subscribers</title><content type="html">&lt;p&gt;&lt;a href="http://research.microsoft.com/en-us/projects/Pex/" target="_blank"&gt;Pex power tools&lt;/a&gt; a &lt;a href="http://research.microsoft.com/en-us/default.aspx" target="_blank"&gt;Microsoft Research&lt;/a&gt; graduate project is now available on MSDN for subscribers to download.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/_F9mN1vFyteY/S9IvmcMMcQI/AAAAAAAAHdA/unFIbmJdJY8/s1600-h/Pex%20On%20MSDN%5B11%5D.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="Pex On MSDN" border="0" alt="Pex On MSDN" src="http://lh6.ggpht.com/_F9mN1vFyteY/S9Ivm1MgQMI/AAAAAAAAHdE/IVWkuGj9tIA/Pex%20On%20MSDN_thumb%5B9%5D.png?imgmax=800" width="640" height="187" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=TiyCyRMc948:2sZ8gS48glQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=TiyCyRMc948:2sZ8gS48glQ:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?i=TiyCyRMc948:2sZ8gS48glQ:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=TiyCyRMc948:2sZ8gS48glQ:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=TiyCyRMc948:2sZ8gS48glQ:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?i=TiyCyRMc948:2sZ8gS48glQ:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=TiyCyRMc948:2sZ8gS48glQ:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=TiyCyRMc948:2sZ8gS48glQ:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/EricDeCarufelsBlog/~4/TiyCyRMc948" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.decarufel.net/feeds/4207600266820057935/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2212558652617325901&amp;postID=4207600266820057935&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2212558652617325901/posts/default/4207600266820057935?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2212558652617325901/posts/default/4207600266820057935?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/EricDeCarufelsBlog/~3/TiyCyRMc948/pex-white-box-testing-tool-is-now.html" title="Pex white box testing tool is now available for MSDN Subscribers" /><author><name>Eric De C#</name><uri>http://www.blogger.com/profile/01046447681968794782</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_F9mN1vFyteY/STk80ggsyRI/AAAAAAAAD5g/XiVQebXFt_0/S220/Eric_De_Carufel_120x160.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh6.ggpht.com/_F9mN1vFyteY/S9Ivm1MgQMI/AAAAAAAAHdE/IVWkuGj9tIA/s72-c/Pex%20On%20MSDN_thumb%5B9%5D.png?imgmax=800" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://blog.decarufel.net/2010/04/pex-white-box-testing-tool-is-now.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUMBR3Y-fyp7ImA9WxBaE0k.&quot;"><id>tag:blogger.com,1999:blog-2212558652617325901.post-8542118632923635325</id><published>2010-03-23T07:16:00.001-04:00</published><updated>2010-03-23T07:24:16.857-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-23T07:24:16.857-04:00</app:edited><title>Improving performance of DataBinding, patience is gold</title><content type="html">&lt;p&gt;I came across a performance problem lately. I have a &lt;a href="http://msdn.microsoft.com/en-us/library/ms754130.aspx" target="_blank"&gt;WPF&lt;/a&gt; &lt;a href="http://msdn.microsoft.com/en-us/library/ms998506.aspx" target="_blank"&gt;Smart Client&lt;/a&gt; application connected to a &lt;a href="http://crm.dynamics.com/en-us/Default.aspx" target="_blank"&gt;Dynamics CRM&lt;/a&gt; back end. At some point in my application I have add a lot of lines in a data table held by an &lt;a href="http://msdn.microsoft.com/en-us/library/ms668604.aspx" target="_blank"&gt;ObservableCollection&lt;/a&gt; class. The problem was each time I add a line into the collection a &lt;a href="http://msdn.microsoft.com/en-us/library/system.collections.specialized.inotifycollectionchanged.collectionchanged.aspx" target="_blank"&gt;CollectionChanged&lt;/a&gt; event was raised and that triggered the update of some other fields, approximately 10 in my case.&lt;/p&gt;  &lt;p&gt;So when was doing batch update the screen freezes for way too much time. I found out the problem was the cascading effect of recalculating all the dependent fields every time I add a ne line in the collection, thanks to the new &lt;a href="http://msdn.microsoft.com/en-us/vstudio/dd582936.aspx" target="_blank"&gt;Visual Studio 2010&lt;/a&gt; performance analysis tools.&lt;/p&gt;  &lt;p&gt;In this scenario, I’m only interested to get the totals right when I do the last insert, all other intermediate values are useless. I didn’t wan to play with the data binding itself. I could have unbound the total calculation and have it rebound at the end but I didn’t. Instead I chose to delay the calculation with some kind of sliding expiration timer. Such a timer, set with a timeout of 10 ms, would be reset every time a new add would be made, so if I add a bunch of line in batch odds that the delay between two line add be less than 10 ms is good. In fact it is so good that because it’s almost always true the calculation happens only once at the end.&lt;/p&gt;  &lt;p&gt;So there is this magic DelayRun class with its DelayController:&lt;/p&gt;  &lt;pre class="brush: csharp;"&gt;using System;
using System.Collections.Generic;
using System.Threading;

namespace Infrastructure
{
    public interface IDelayRun
    {
        void Reset();
        void Start(int ms);
        event EventHandler&amp;lt;DelayRunEventArgs&amp;gt; EventCompleted;
    }

    public class DelayRun&amp;lt;T&amp;gt; : IDisposable, IDelayRun
    {
        private static readonly ManualResetEvent _resetEvent = new ManualResetEvent(true);
        private readonly Action&amp;lt;T&amp;gt; _action;
        private readonly T _target;
        private int _delay;
        private volatile Timer _timer;

        private DelayRun(T target, Action&amp;lt;T&amp;gt; action)
        {
            _action = action;
            _target = target;
        }

        #region IDelayRun Members

        public void Start(int ms)
        {
            if (ms == 0)
                throw new ArgumentOutOfRangeException(&amp;quot;ms&amp;quot;, ms, &amp;quot;ms should be grater than 0.&amp;quot;);

            if (_delay != 0)
                throw new InvalidOperationException(&amp;quot;Can't start, already started.&amp;quot;);

            _delay = ms;
            _timer = new Timer(Execute, this, _delay, Timeout.Infinite);
        }

        public void Reset()
        {
            lock (_timer)
            {
                if (_timer == null)
                    throw new InvalidOperationException(&amp;quot;Can't reset the timer, already completed.&amp;quot;);

                _timer.Change(_delay, Timeout.Infinite);
            }
        }

        #endregion

        public static DelayRun&amp;lt;T&amp;gt; CreateNew(T target, Action&amp;lt;T&amp;gt; action)
        {
            return new DelayRun&amp;lt;T&amp;gt;(target, action);
        }

        public static DelayRun&amp;lt;T&amp;gt; StartNew(T target, Action&amp;lt;T&amp;gt; action, int ms)
        {
            DelayRun&amp;lt;T&amp;gt; delayRun = CreateNew(target, action);
            delayRun.Start(ms);
            return delayRun;
        }

        public void Execute(object state)
        {
            _resetEvent.WaitOne();
            lock (_timer)
            {
                _timer.Change(Timeout.Infinite, Timeout.Infinite);
            }

            _action.Invoke(_target);
            _resetEvent.Set();
        }

        #region Event Handling

        public event EventHandler&amp;lt;DelayRunEventArgs&amp;gt; EventCompleted;

        public void InvokeEventCompleted(DelayRunEventArgs e)
        {
            EventHandler&amp;lt;DelayRunEventArgs&amp;gt; handler = EventCompleted;
            if (handler != null) handler(this, e);
        }

        #endregion

        #region IDisposable

        public void Dispose()
        {
            lock (_timer)
            {
                if (_timer != null)
                    _timer.Dispose();
            }
        }

        #endregion
    }

    public class DelayRunEventArgs : EventArgs
    {
        public DelayRunEventArgs(IDelayRun delayAction)
        {
            DelayAction = delayAction;
        }

        public IDelayRun DelayAction { get; set; }
    }

    public static class DelayController
    {
        private static readonly IDictionary&amp;lt;string, IDelayRun&amp;gt; _actions = new Dictionary&amp;lt;string, IDelayRun&amp;gt;();

        public static void Add&amp;lt;T&amp;gt;(string key, T target, Action&amp;lt;T&amp;gt; action, int ms)
        {
            if (_actions.ContainsKey(key))
                _actions[key].Reset();
            else
            {
                DelayRun&amp;lt;T&amp;gt; delayRun = DelayRun&amp;lt;T&amp;gt;.CreateNew(target, _ =&amp;gt; {});
                _actions[key] = delayRun;
                string localKey = key;
                delayRun.EventCompleted += (sender, args) =&amp;gt;
                {
                    _actions.Remove(localKey);
                    action.BeginInvoke(target, ar =&amp;gt; ar.AsyncWaitHandle.WaitOne(), delayRun);
                };
                delayRun.Start(ms);
            }
        }
    }
}&lt;/pre&gt;

&lt;p&gt;To use this class all you need to do is call the DelayController. The DelayController will handle the creation and the reset process of the DelayRun class. It can handle many delay class at once if they have different key value. Each time the controller Add method is called it either create a new instance of a DelayRun Class of reset the running one.&lt;/p&gt;

&lt;p&gt;Here is how you can call it:&lt;/p&gt;

&lt;pre class="brush: csharp;"&gt;DelayController.Add(&amp;quot;ValuesOnCollectionChanged&amp;quot;, this, m =&amp;gt; Recalc(m), 10);&lt;/pre&gt;

&lt;p&gt;This call will delay the Recalc method call for 10 ms. In the mean time if your program add other values to recalc you can recall this line and the delay will be reset for another 10 ms and so on.&lt;/p&gt;

&lt;p&gt;Tell me if this can be helpful in your own projects.&lt;/p&gt;  &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=-WNmYTsmNvU:Ob8TxpHjnXM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=-WNmYTsmNvU:Ob8TxpHjnXM:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?i=-WNmYTsmNvU:Ob8TxpHjnXM:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=-WNmYTsmNvU:Ob8TxpHjnXM:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=-WNmYTsmNvU:Ob8TxpHjnXM:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?i=-WNmYTsmNvU:Ob8TxpHjnXM:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=-WNmYTsmNvU:Ob8TxpHjnXM:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=-WNmYTsmNvU:Ob8TxpHjnXM:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/EricDeCarufelsBlog/~4/-WNmYTsmNvU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.decarufel.net/feeds/8542118632923635325/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2212558652617325901&amp;postID=8542118632923635325&amp;isPopup=true" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2212558652617325901/posts/default/8542118632923635325?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2212558652617325901/posts/default/8542118632923635325?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/EricDeCarufelsBlog/~3/-WNmYTsmNvU/improving-performance-of-databinding.html" title="Improving performance of DataBinding, patience is gold" /><author><name>Eric De C#</name><uri>http://www.blogger.com/profile/01046447681968794782</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_F9mN1vFyteY/STk80ggsyRI/AAAAAAAAD5g/XiVQebXFt_0/S220/Eric_De_Carufel_120x160.jpg" /></author><thr:total>2</thr:total><feedburner:origLink>http://blog.decarufel.net/2010/03/improving-performance-of-databinding.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEcFQXY7fCp7ImA9WxBaEko.&quot;"><id>tag:blogger.com,1999:blog-2212558652617325901.post-1527445840942005625</id><published>2010-03-22T12:37:00.000-04:00</published><updated>2010-03-22T12:40:10.804-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-22T12:40:10.804-04:00</app:edited><title>Canadian Developer Connection : Windows Phone 7 Session Videos and Slides, Organized and Explained</title><content type="html">&lt;img style="display: inline; margin-left: 0px; margin-right: 0px" alt="Windows Phone 7 @ MIX10: Reports on the new hotness from MIX10 in Las Vegas" align="right" src="http://www.globalnerdy.com/wordpress/wp-content/uploads/2010/03/WindowsPhone7atMIX101.jpg" /&gt;  &lt;p&gt;&lt;/p&gt;  &lt;h5&gt;The Videos are Up!&lt;/h5&gt;  &lt;p&gt;It’s only been a couple of days since &lt;a href="http://live.visitmix.com/"&gt;&lt;strong&gt;MIX10&lt;/strong&gt;&lt;/a&gt; wrapped up, but as promised, &lt;a href="http://live.visitmix.com/Videos"&gt;we recorded videos of all the sessions and they’re now available online&lt;/a&gt;. It doesn’t matter if you missed a session or missed the entire conference, you can now catch (or re-catch) them all. The videos are all “two-shots”; that is, they feature two views: one of the speaker, shown in a window on the left, and one of the current slide, shown in a view on the right. They’re all in Windows Video (WMV) format, and for many of the presentations, the speakers have also made the slides available in PowerPoint (PPTX) format.&lt;/p&gt;  &lt;h5&gt;The Windows Phone Videos&lt;/h5&gt;  &lt;p&gt;I’m biased – I’m one of the evangelists designated as a “Windows Phone 7 Champ” – so naturally I consider the Windows Phone 7 Series announcements made at MIX10 to be the most important ones of the conference. (Don’t worry, I’ll talk about the other things I saw at MIX in a later article.)&lt;/p&gt;  &lt;p&gt;I’m a believer in “The Power of the Obvious”. Sometimes, there’s great power and utility in taking information that’s already out there and rearranging it in a way that makes it even more useful. That’s why I decided to take the listing of all the MIX10 session videos, pick out the ones applicable to Windows Phone 7 development and rearrange them into the three lists below:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://blogs.msdn.com/#windows_phone_general"&gt;Windows Phone – General Design and Development&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://blogs.msdn.com/#windows_phone_silverlight"&gt;Windows Phone and Silverlight&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://blogs.msdn.com/#windows_phone_xna"&gt;Windows Phone and XNA&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;I’ve listed each session with:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Its code and title – not the title that appears in the program, but the title that the presenters actually used (some were changed at the last minute) &lt;/li&gt;    &lt;li&gt;A brief description of the session &lt;/li&gt;    &lt;li&gt;A “You should watch it if” list to give you an idea of whether the presentation is relevant to you &lt;/li&gt;    &lt;li&gt;Links to the video of the presentation, and if available, the slides&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;All told, there’s more than 18 hours’ worth of Windows Phone video.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/cdndevs/archive/2010/03/21/windows-phone-7-session-videos-and-slides-organized-and-explained.aspx?utm_source=feedburner&amp;amp;utm_medium=feed&amp;amp;utm_campaign=Feed%3A+CanDevs+%28Canadian+Developers%29&amp;amp;utm_content=Google+Reader"&gt;Canadian Developer Connection : Windows Phone 7 Session Videos and Slides, Organized and Explained&lt;/a&gt;&lt;/p&gt;  &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=i1AoU8LaVpQ:uByWd5_MeGo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=i1AoU8LaVpQ:uByWd5_MeGo:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?i=i1AoU8LaVpQ:uByWd5_MeGo:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=i1AoU8LaVpQ:uByWd5_MeGo:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=i1AoU8LaVpQ:uByWd5_MeGo:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?i=i1AoU8LaVpQ:uByWd5_MeGo:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=i1AoU8LaVpQ:uByWd5_MeGo:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=i1AoU8LaVpQ:uByWd5_MeGo:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/EricDeCarufelsBlog/~4/i1AoU8LaVpQ" height="1" width="1"/&gt;</content><link rel="related" href="http://blogs.msdn.com/cdndevs/archive/2010/03/21/windows-phone-7-session-videos-and-slides-organized-and-explained.aspx?utm_source=feedburner&amp;utm_medium=feed&amp;utm_campaign=Feed%3A+CanDevs+%28Canadian+Developers%29&amp;utm_content=Google+Reader" title="Canadian Developer Connection : Windows Phone 7 Session Videos and Slides, Organized and Explained" /><link rel="replies" type="application/atom+xml" href="http://blog.decarufel.net/feeds/1527445840942005625/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2212558652617325901&amp;postID=1527445840942005625&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2212558652617325901/posts/default/1527445840942005625?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2212558652617325901/posts/default/1527445840942005625?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/EricDeCarufelsBlog/~3/i1AoU8LaVpQ/canadian-developer-connection-windows.html" title="Canadian Developer Connection : Windows Phone 7 Session Videos and Slides, Organized and Explained" /><author><name>Eric De C#</name><uri>http://www.blogger.com/profile/01046447681968794782</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_F9mN1vFyteY/STk80ggsyRI/AAAAAAAAD5g/XiVQebXFt_0/S220/Eric_De_Carufel_120x160.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.decarufel.net/2010/03/canadian-developer-connection-windows.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUYFRH8_fSp7ImA9WxBaEE0.&quot;"><id>tag:blogger.com,1999:blog-2212558652617325901.post-6195928339937639595</id><published>2010-03-18T08:06:00.001-04:00</published><updated>2010-03-19T08:51:55.145-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-19T08:51:55.145-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Tip" /><category scheme="http://www.blogger.com/atom/ns#" term="Fluent interfaces" /><category scheme="http://www.blogger.com/atom/ns#" term="Extension methods" /><category scheme="http://www.blogger.com/atom/ns#" term="Generics" /><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><title>How to use strongly-typed name with INotifyPropertyChanged</title><content type="html">&lt;p&gt;You may already have read my posts about how to use INotifyPropertyChanged in a type-safe way (&lt;a href="http://blog.decarufel.net/2009/07/how-to-use-inotifypropertychanged-type_22.html"&gt;here&lt;/a&gt; and &lt;a href="http://blog.decarufel.net/2009/07/type-safe-inotifypropertychanged-and.html"&gt;here&lt;/a&gt;), but sometime you don’t want to modify all your classes to use this method. All you want is avoid the use of a magic string to define the property. Your code will be refactoring proof.&lt;/p&gt;  &lt;p&gt;For example let say you have this property:&lt;/p&gt;  &lt;pre class="brush: csharp;"&gt;public string FirstName
{
    get { return _firstName; }
    set 
    {
        if (_firstName == value)
            return;
        _firstName = value;
        RaisePropertyChanged(&amp;quot;FirstName&amp;quot;);
    }
}&lt;/pre&gt;

&lt;p&gt;Some refactoring tool, like Resharper, will be able to change the “FirstName” string but not Visual Studio itself. The solution? Replace this string with a strong type value. How? Let’s assume we can do this:&lt;/p&gt;

&lt;pre class="brush: csharp;"&gt;public string FirstName
{
    get { return _firstName; }
    set 
    {
        if (_firstName == value)
            return;
        _firstName = value;
        RaisePropertyChanged(this.NameOf(p =&amp;gt; p.FirstName));
    }
}&lt;/pre&gt;

&lt;p&gt;Notice that you must specify the “this” keyword to make it work. That is exactly What this extension method let you do:&lt;/p&gt;

&lt;pre class="brush: csharp;"&gt;public static class ObjectExtensions
{
    public static string NameOf&amp;lt;T&amp;gt;(this T target, Expression&amp;lt;Func&amp;lt;T, object&amp;gt;&amp;gt; propertyExpression)
    {
        MemberExpression body = null;
        if (propertyExpression.Body is UnaryExpression)
        {
            var unary = propertyExpression.Body as UnaryExpression;
            if (unary.Operand is MemberExpression)
                body = unary.Operand as MemberExpression;
        }
        else if (propertyExpression.Body is MemberExpression)
        {
            body = propertyExpression.Body as MemberExpression;
        }
        if (body == null)
            throw new ArgumentException(&amp;quot;'propertyExpression' should be a member expression&amp;quot;);

        // Extract the right part (after &amp;quot;=&amp;gt;&amp;quot;)
        var vmExpression = body.Expression as ConstantExpression;

        // Extract the name of the property to raise a change on
        return body.Member.Name;
    }
}&lt;/pre&gt;

&lt;p&gt;You can even use it in your property changed handler:&lt;/p&gt;

&lt;pre class="brush: csharp;"&gt;private void OnPropertyChanged(object sender, PropertyChangedEventArgs args)
{
    if (args.PropertyName == this.NameOf(p =&amp;gt; p.FirstName))
    {
        // ...
    }
}&lt;/pre&gt;

&lt;p&gt;Enjoy!&lt;/p&gt;  &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=skSLgUhHt0A:EIkfq1donVI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=skSLgUhHt0A:EIkfq1donVI:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?i=skSLgUhHt0A:EIkfq1donVI:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=skSLgUhHt0A:EIkfq1donVI:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=skSLgUhHt0A:EIkfq1donVI:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?i=skSLgUhHt0A:EIkfq1donVI:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=skSLgUhHt0A:EIkfq1donVI:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=skSLgUhHt0A:EIkfq1donVI:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/EricDeCarufelsBlog/~4/skSLgUhHt0A" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.decarufel.net/feeds/6195928339937639595/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2212558652617325901&amp;postID=6195928339937639595&amp;isPopup=true" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2212558652617325901/posts/default/6195928339937639595?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2212558652617325901/posts/default/6195928339937639595?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/EricDeCarufelsBlog/~3/skSLgUhHt0A/how-to-use-strongly-typed-name-with.html" title="How to use strongly-typed name with INotifyPropertyChanged" /><author><name>Eric De C#</name><uri>http://www.blogger.com/profile/01046447681968794782</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_F9mN1vFyteY/STk80ggsyRI/AAAAAAAAD5g/XiVQebXFt_0/S220/Eric_De_Carufel_120x160.jpg" /></author><thr:total>2</thr:total><feedburner:origLink>http://blog.decarufel.net/2010/03/how-to-use-strongly-typed-name-with.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEYCQXk6fSp7ImA9WxBVEks.&quot;"><id>tag:blogger.com,1999:blog-2212558652617325901.post-3564805343514241001</id><published>2010-02-15T15:36:00.000-05:00</published><updated>2010-02-15T15:36:00.715-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-02-15T15:36:00.715-05:00</app:edited><title>Patch for VS 2010 RC Intellisense Crash Issue Now Available - ScottGu's Blog</title><content type="html">&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: arial; font-size: small; "&gt;&lt;h3 style="font-size: 1.1em; text-decoration: none; "&gt;&lt;u&gt;Crash Symptom&lt;/u&gt;&lt;/h3&gt;&lt;p style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; "&gt;If you are encountering frequent VS 2010 crashes when you are typing in the editor while Intellisense is popping up and/or being dismissed then you are running into this issue.&lt;/p&gt;&lt;h3 style="font-size: 1.1em; text-decoration: none; "&gt;&lt;u&gt;Patch Now Available&lt;/u&gt;&lt;/h3&gt;&lt;p style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; "&gt;This morning we made available a &lt;a href="http://connect.microsoft.com/VisualStudio/Downloads/DownloadDetails.aspx?DownloadID=26662" target="_blank" style="color: rgb(0, 102, 204); "&gt;VS 2010 RC patch&lt;/a&gt; which fixes this issue.  You can download and run it &lt;a href="http://connect.microsoft.com/VisualStudio/Downloads/DownloadDetails.aspx?DownloadID=26662" target="_blank" style="color: rgb(0, 102, 204); "&gt;here&lt;/a&gt;. &lt;/p&gt;&lt;p style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; "&gt;Please apply it if you are encountering any crashes with the VS 2010 RC, or if you have a tablet, multi-touch, screen-reader or external devices attached (including Wacom tablets, phones/ipods, and others that connect via USB).&lt;/p&gt;&lt;p style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; "&gt;Please make sure to submit any issues you encounter with the VS 2010 RC to us via the &lt;a href="https://connect.microsoft.com/VisualStudio/content/content.aspx?ContentID=14625" target="_blank" style="color: rgb(51, 153, 255); "&gt;connect.microsoft.com&lt;/a&gt; web-site.  Once you’ve entered the issue there please send me email (&lt;a href="mailto:scottgu@microsoft.com" style="color: rgb(51, 153, 255); "&gt;scottgu@microsoft.com&lt;/a&gt;) with a pointer to the issue and I’ll make sure the appropriate team follows up quickly.&lt;/p&gt;&lt;p style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; "&gt;Hope this helps,&lt;/p&gt;&lt;p style="margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; "&gt;Scott&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;[Via &lt;a href="http://weblogs.asp.net/scottgu/archive/2010/02/15/patch-for-vs-2010-rc-intellisense-crash-issue-now-available.aspx"&gt;Patch for VS 2010 RC Intellisense Crash Issue Now Available - ScottGu's Blog&lt;/a&gt;]&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=9rw7F4x10Og:WpMn0so0w8s:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=9rw7F4x10Og:WpMn0so0w8s:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?i=9rw7F4x10Og:WpMn0so0w8s:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=9rw7F4x10Og:WpMn0so0w8s:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=9rw7F4x10Og:WpMn0so0w8s:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?i=9rw7F4x10Og:WpMn0so0w8s:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=9rw7F4x10Og:WpMn0so0w8s:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=9rw7F4x10Og:WpMn0so0w8s:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/EricDeCarufelsBlog/~4/9rw7F4x10Og" height="1" width="1"/&gt;</content><link rel="related" href="http://weblogs.asp.net/scottgu/archive/2010/02/15/patch-for-vs-2010-rc-intellisense-crash-issue-now-available.aspx" title="Patch for VS 2010 RC Intellisense Crash Issue Now Available - ScottGu's Blog" /><link rel="replies" type="application/atom+xml" href="http://blog.decarufel.net/feeds/3564805343514241001/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2212558652617325901&amp;postID=3564805343514241001&amp;isPopup=true" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2212558652617325901/posts/default/3564805343514241001?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2212558652617325901/posts/default/3564805343514241001?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/EricDeCarufelsBlog/~3/9rw7F4x10Og/patch-for-vs-2010-rc-intellisense-crash.html" title="Patch for VS 2010 RC Intellisense Crash Issue Now Available - ScottGu's Blog" /><author><name>Eric De C#</name><uri>http://www.blogger.com/profile/01046447681968794782</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_F9mN1vFyteY/STk80ggsyRI/AAAAAAAAD5g/XiVQebXFt_0/S220/Eric_De_Carufel_120x160.jpg" /></author><thr:total>2</thr:total><feedburner:origLink>http://blog.decarufel.net/2010/02/patch-for-vs-2010-rc-intellisense-crash.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEUEQngzfSp7ImA9WxBWGUo.&quot;"><id>tag:blogger.com,1999:blog-2212558652617325901.post-1400235036811435492</id><published>2010-02-12T07:03:00.000-05:00</published><updated>2010-02-12T07:03:23.685-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-02-12T07:03:23.685-05:00</app:edited><title>Parallel Programming with .NET : FAQ :: Which .NET language is best for parallelism?</title><content type="html">&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Tahoma, Arial, Helvetica, sans-serif; font-size: 13px; "&gt;&lt;p class="MsoNormal" style="margin-top: 0in; margin-right: 0in; margin-bottom: 10pt; margin-left: 0in; "&gt;&lt;span style="font-family:Calibri;font-size:100%;"&gt;The new parallelization support in the .NET Framework 4 is implemented purely in libraries and the runtime and does not require special compiler support.  Therefore, it is available to all compliant .NET languages.  This includes all of the managed languages that ship as part of Visual Studio 2010 (Visual C#, Visual Basic, Visual F#, and C++/CLI) as well as other Microsoft-provided languages (e.g. IronPython) and 3&lt;sup&gt;rd&lt;/sup&gt;-party developed languages.&lt;span&gt;  &lt;/span&gt;In fact, our samples available at&lt;/span&gt;&lt;a href="http://code.msdn.microsoft.com/ParExtSamples" style="color: rgb(221, 74, 33); "&gt;&lt;span style="font-family:Calibri;font-size:100%;color:#0000ff;"&gt;http://code.msdn.microsoft.com/ParExtSamples&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:Calibri;"&gt; include examples in multiple languages.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-top: 0in; margin-right: 0in; margin-bottom: 10pt; margin-left: 0in; "&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:Calibri;"&gt;However, some of the APIs in .NET 4 have been designed with certain language capabilities in mind.  For example, C#, Visual Basic, and F# all support lambda expressions and closures, which enable easily defining the bodies for Tasks and parallel loops.  Query comprehensions in C# and Visual Basic, and sequences in F#, can help to write cleaner, more elegant PLINQ queries.  F#’s support for asynchronous workflows and its provision of immutability of data by default are geared towards making it easier to write highly concurrent applications.&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-top: 0in; margin-right: 0in; margin-bottom: 10pt; margin-left: 0in; "&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:Calibri;"&gt;In summary, you can introduce parallelism in your application using any .NET language.  Which one is best still depends on your scenario.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-top: 0in; margin-right: 0in; margin-bottom: 10pt; margin-left: 0in; "&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:Calibri;"&gt;From:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;a href="http://blogs.msdn.com/pfxteam/archive/2010/02/11/9962306.aspx"&gt;Parallel Programming with .NET : FAQ :: Which .NET language is best for parallelism?&lt;/a&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=BO1qAaKJRns:jLvEr85Dyvg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=BO1qAaKJRns:jLvEr85Dyvg:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?i=BO1qAaKJRns:jLvEr85Dyvg:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=BO1qAaKJRns:jLvEr85Dyvg:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=BO1qAaKJRns:jLvEr85Dyvg:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?i=BO1qAaKJRns:jLvEr85Dyvg:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=BO1qAaKJRns:jLvEr85Dyvg:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=BO1qAaKJRns:jLvEr85Dyvg:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/EricDeCarufelsBlog/~4/BO1qAaKJRns" height="1" width="1"/&gt;</content><link rel="related" href="http://blogs.msdn.com/pfxteam/archive/2010/02/11/9962306.aspx" title="Parallel Programming with .NET : FAQ :: Which .NET language is best for parallelism?" /><link rel="replies" type="application/atom+xml" href="http://blog.decarufel.net/feeds/1400235036811435492/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2212558652617325901&amp;postID=1400235036811435492&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2212558652617325901/posts/default/1400235036811435492?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2212558652617325901/posts/default/1400235036811435492?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/EricDeCarufelsBlog/~3/BO1qAaKJRns/parallel-programming-with-net-faq-which.html" title="Parallel Programming with .NET : FAQ :: Which .NET language is best for parallelism?" /><author><name>Eric De C#</name><uri>http://www.blogger.com/profile/01046447681968794782</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_F9mN1vFyteY/STk80ggsyRI/AAAAAAAAD5g/XiVQebXFt_0/S220/Eric_De_Carufel_120x160.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.decarufel.net/2010/02/parallel-programming-with-net-faq-which.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkEDSXo8eip7ImA9WxBWGEQ.&quot;"><id>tag:blogger.com,1999:blog-2212558652617325901.post-2987878004333221193</id><published>2010-02-11T07:17:00.000-05:00</published><updated>2010-02-11T07:17:58.472-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-02-11T07:17:58.472-05:00</app:edited><title>Parallel Programming with .NET : "Parallelism in .NET" Series by Reed Copsey, Jr.</title><content type="html">&lt;a href="http://blogs.msdn.com/pfxteam/archive/2010/02/10/9961019.aspx"&gt;Parallel Programming with .NET : "Parallelism in .NET" Series by Reed Copsey, Jr.&lt;/a&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Tahoma, Arial, Helvetica, sans-serif; font-size: 13px; "&gt;&lt;p&gt;&lt;a title="Reed Copsey, Jr." href="http://reedcopsey.com/" mce_href="http://reedcopsey.com/" style="color: rgb(221, 74, 33); "&gt;Reed Copsey, Jr.&lt;/a&gt; has been writing a great series of articles on parallelism with the .NET Framework 4. The articles provide the insights of an expert developer who has been using parallelism with .NET to speed up real-world programs. Recommended reading.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Parallelism in .NET&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;a title="Introduction" href="http://reedcopsey.com/2010/01/19/parallelism-in-net-introduction/" mce_href="http://reedcopsey.com/2010/01/19/parallelism-in-net-introduction/" style="color: rgb(221, 74, 33); "&gt;Introduction&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a title="Part 1, Decomposition" href="http://reedcopsey.com/2010/01/19/parallelism-in-net-part-1-decomposition/" mce_href="http://reedcopsey.com/2010/01/19/parallelism-in-net-part-1-decomposition/" style="color: rgb(221, 74, 33); "&gt;Part 1, Decomposition&lt;/a&gt;&lt;u&gt;&lt;span style="color:#0066cc;"&gt; &lt;/span&gt;&lt;/u&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://reedcopsey.com/2010/01/20/parallelism-in-net-part-2-simple-imperative-data-parallelism/" style="color: rgb(221, 74, 33); "&gt;Part 2, Simple Imperative Data Parallelism&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://reedcopsey.com/2010/01/22/parallelism-in-net-part-3-imperative-data-parallelism-early-termination/" style="color: rgb(221, 74, 33); "&gt;Part 3, Imperative Data Parallelism: Early Termination&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://reedcopsey.com/2010/01/22/parallelism-in-net-part-4-imperative-data-parallelism-aggregation/" style="color: rgb(221, 74, 33); "&gt;Part 4, Imperative Data Parallelism: Aggregation&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://reedcopsey.com/2010/01/26/parallelism-in-net-part-5-partitioning-of-work/" style="color: rgb(221, 74, 33); "&gt;Part 5, Partitioning of Work&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://reedcopsey.com/2010/01/26/parallelism-in-net-part-6-declarative-data-parallelism/" style="color: rgb(221, 74, 33); "&gt;Part 6, Declarative Data Parallelism&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://reedcopsey.com/2010/01/28/parallelism-in-net-part-7-some-differences-between-plinq-and-linq-to-objects/" style="color: rgb(221, 74, 33); "&gt;Part 7, Some Differences between PLINQ and LINQ to Objects&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://reedcopsey.com/2010/02/03/parallelism-in-net-part-8-plinqs-forall-method/" style="color: rgb(221, 74, 33); "&gt;Part 8, PLINQ’s ForAll Method&lt;/a&gt;&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=-Tw81UpI3wA:sL7CpqQJnxo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=-Tw81UpI3wA:sL7CpqQJnxo:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?i=-Tw81UpI3wA:sL7CpqQJnxo:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=-Tw81UpI3wA:sL7CpqQJnxo:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=-Tw81UpI3wA:sL7CpqQJnxo:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?i=-Tw81UpI3wA:sL7CpqQJnxo:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=-Tw81UpI3wA:sL7CpqQJnxo:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=-Tw81UpI3wA:sL7CpqQJnxo:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/EricDeCarufelsBlog/~4/-Tw81UpI3wA" height="1" width="1"/&gt;</content><link rel="related" href="http://blogs.msdn.com/pfxteam/archive/2010/02/10/9961019.aspx" title="Parallel Programming with .NET : &quot;Parallelism in .NET&quot; Series by Reed Copsey, Jr." /><link rel="replies" type="application/atom+xml" href="http://blog.decarufel.net/feeds/2987878004333221193/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2212558652617325901&amp;postID=2987878004333221193&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2212558652617325901/posts/default/2987878004333221193?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2212558652617325901/posts/default/2987878004333221193?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/EricDeCarufelsBlog/~3/-Tw81UpI3wA/parallel-programming-with-net.html" title="Parallel Programming with .NET : &quot;Parallelism in .NET&quot; Series by Reed Copsey, Jr." /><author><name>Eric De C#</name><uri>http://www.blogger.com/profile/01046447681968794782</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_F9mN1vFyteY/STk80ggsyRI/AAAAAAAAD5g/XiVQebXFt_0/S220/Eric_De_Carufel_120x160.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.decarufel.net/2010/02/parallel-programming-with-net.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkEFRXk5eip7ImA9WxBQFE0.&quot;"><id>tag:blogger.com,1999:blog-2212558652617325901.post-4231513369417329431</id><published>2010-01-13T13:50:00.000-05:00</published><updated>2010-01-13T13:50:14.722-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-01-13T13:50:14.722-05:00</app:edited><title>Troelsen's Tutorials: The Decorator Pattern &amp; Extension Methods</title><content type="html">&lt;a href="http://andrewtroelsen.blogspot.com/2009/04/decorator-pattern-extension-methods.html"&gt;Troelsen's Tutorials: The Decorator Pattern &amp;amp; Extension Methods&lt;/a&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=UtA_1-iDgas:1RO6fO8rT5w:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=UtA_1-iDgas:1RO6fO8rT5w:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?i=UtA_1-iDgas:1RO6fO8rT5w:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=UtA_1-iDgas:1RO6fO8rT5w:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=UtA_1-iDgas:1RO6fO8rT5w:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?i=UtA_1-iDgas:1RO6fO8rT5w:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=UtA_1-iDgas:1RO6fO8rT5w:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=UtA_1-iDgas:1RO6fO8rT5w:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/EricDeCarufelsBlog/~4/UtA_1-iDgas" height="1" width="1"/&gt;</content><link rel="related" href="http://andrewtroelsen.blogspot.com/2009/04/decorator-pattern-extension-methods.html" title="Troelsen's Tutorials: The Decorator Pattern &amp; Extension Methods" /><link rel="replies" type="application/atom+xml" href="http://blog.decarufel.net/feeds/4231513369417329431/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2212558652617325901&amp;postID=4231513369417329431&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2212558652617325901/posts/default/4231513369417329431?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2212558652617325901/posts/default/4231513369417329431?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/EricDeCarufelsBlog/~3/UtA_1-iDgas/troelsens-tutorials-decorator-pattern.html" title="Troelsen's Tutorials: The Decorator Pattern &amp; Extension Methods" /><author><name>Eric De C#</name><uri>http://www.blogger.com/profile/01046447681968794782</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_F9mN1vFyteY/STk80ggsyRI/AAAAAAAAD5g/XiVQebXFt_0/S220/Eric_De_Carufel_120x160.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.decarufel.net/2010/01/troelsens-tutorials-decorator-pattern.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ck8EQ3k4cSp7ImA9WxBSFks.&quot;"><id>tag:blogger.com,1999:blog-2212558652617325901.post-8313943216076422759</id><published>2009-12-24T08:20:00.000-05:00</published><updated>2009-12-24T08:20:02.739-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-12-24T08:20:02.739-05:00</app:edited><title>Microsoft TechEd North America 2010 - Home</title><content type="html">&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: arial, sans-serif; font-size: 13px; border-collapse: collapse; "&gt;Give the gift of technical education, and save US$300 on the full Tech·Ed conference fee.&lt;/span&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;a href="http://northamerica.msteched.com/?CR_CC=100292853"&gt;Microsoft TechEd North America 2010 - Home&lt;/a&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=ZrWZhNHKv_0:b2nz7zaTSBs:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=ZrWZhNHKv_0:b2nz7zaTSBs:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?i=ZrWZhNHKv_0:b2nz7zaTSBs:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=ZrWZhNHKv_0:b2nz7zaTSBs:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=ZrWZhNHKv_0:b2nz7zaTSBs:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?i=ZrWZhNHKv_0:b2nz7zaTSBs:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=ZrWZhNHKv_0:b2nz7zaTSBs:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=ZrWZhNHKv_0:b2nz7zaTSBs:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/EricDeCarufelsBlog/~4/ZrWZhNHKv_0" height="1" width="1"/&gt;</content><link rel="related" href="http://northamerica.msteched.com/?CR_CC=100292853" title="Microsoft TechEd North America 2010 - Home" /><link rel="replies" type="application/atom+xml" href="http://blog.decarufel.net/feeds/8313943216076422759/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2212558652617325901&amp;postID=8313943216076422759&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2212558652617325901/posts/default/8313943216076422759?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2212558652617325901/posts/default/8313943216076422759?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/EricDeCarufelsBlog/~3/ZrWZhNHKv_0/microsoft-teched-north-america-2010.html" title="Microsoft TechEd North America 2010 - Home" /><author><name>Eric De C#</name><uri>http://www.blogger.com/profile/01046447681968794782</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_F9mN1vFyteY/STk80ggsyRI/AAAAAAAAD5g/XiVQebXFt_0/S220/Eric_De_Carufel_120x160.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.decarufel.net/2009/12/microsoft-teched-north-america-2010.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEQFRn46cCp7ImA9WxNaEUs.&quot;"><id>tag:blogger.com,1999:blog-2212558652617325901.post-3062667735440717196</id><published>2009-11-25T10:15:00.001-05:00</published><updated>2009-11-25T10:18:37.018-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-25T10:18:37.018-05:00</app:edited><title>Now Available: patterns &amp; practices Application Architecture Book</title><content type="html">&lt;div style="margin-bottom: 0.5em"&gt;via &lt;a class="f" href="http://blogs.msdn.com/jmeier/default.aspx"&gt;J.D. Meier's Blog&lt;/a&gt; de J.D. Meier le 05/11/09&lt;/div&gt;  &lt;br style="display: none" /&gt;  &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/jmeier/WindowsLiveWriter/NowAvailablepatternspracticesApplication_9A5D/AAG2FrontCover-Small_2.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; margin-left: 0px; border-left-width: 0px; margin-right: 0px" title="AAG2FrontCover-Small" border="0" alt="AAG2FrontCover-Small" align="right" src="http://blogs.msdn.com/blogfiles/jmeier/WindowsLiveWriter/NowAvailablepatternspracticesApplication_9A5D/AAG2FrontCover-Small_thumb.png" width="184" height="225" /&gt;&lt;/a&gt; The Microsoft Application Architecture Guide, 2nd edition, is &lt;a href="http://www.amazon.com/Microsoft%C2%AE-Application-Architecture-Patterns-Practices/dp/073562710X"&gt;now available on Amazon&lt;/a&gt; and should be available on the shelf at your local bookstores soon.&amp;#160; The PDF was downloaded ~180,000 times.&amp;#160; This is the Microsoft platform playbook for application architecture.&amp;#160; You can think of it as a set of blueprints, and as your personal mentor for building common types of applications on the Microsoft platform:&amp;#160; mobile, RIA, services, and Web applications.&lt;/p&gt;  &lt;p&gt;The backbone of the guide is an information model for the application architecture space.&amp;#160; It's a durable and evolvable map to give you a firm foundation of principles, patterns, and practices that you can overlay the latest technologies.&amp;#160; It's your &amp;quot;tome of know-how.&amp;quot;&amp;#160; While it's not a step-by-step for building specific applications, it is a pragmatic guide for designing your architecture, with quality attributes, key software principles, common patterns, and architectural styles in mind.&amp;#160; It's holistic and focused on the key engineering decisions where you face your highest risks and most important choices.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Key Features of the Book      &lt;br /&gt;&lt;/strong&gt;The book has several compelling features for slicing and dicing the application architecture body of knowledge:&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Canonical Frame.&amp;#160; &lt;/strong&gt;This&lt;strong&gt; &lt;/strong&gt;describes at a meta-level, the tiers and layers that an architect should consider. Each tier/layer will be described in terms of its focus, function, capabilities, common design patterns and technologies. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Application Types&lt;/strong&gt;.&amp;#160; These are canonical application archetypes to illustrate common application types: Mobile, Rich Client, RIA, Services, and Web applications.&amp;#160; Each archetype is described in terms of the target scenarios, technologies, patterns and infrastructure it contains. Each archetype is mapped to the canonical app frame. They are illustrative of common application types and not comprehensive or definitive. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Quality attributes&lt;/strong&gt;.&amp;#160; This is a set of qualities and capabilities that shape your application architecture: performance, security, scalability, manageability, deployment, communication, etc. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Cross-cutting concerns&lt;/strong&gt;.&amp;#160; This is a common set of categories for hot spots for key engineering decisions: Authentication, Authorization, Caching, Communication, Configuration Management, Exception Management, Logging and Instrumentation, State Management, and Validation. &lt;/li&gt;    &lt;li&gt;Step-by-Step Design Approach. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Principles, patterns, and practices&lt;/strong&gt;.&amp;#160;&amp;#160; Using the application types, canonical frame, and cross-cutting concerns as backdrops, the guide provides an overlay of relevant principles, patterns, and practices. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Technologies and capabilities&lt;/strong&gt;.&amp;#160; The guide provides an overview and description of the Microsoft custom application development platform and the main technologies and capabilities within it. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Contents at a Glance      &lt;br /&gt;&lt;/strong&gt;The full &lt;a href="http://msdn.microsoft.com/en-us/library/dd673617.aspx"&gt;Microsoft Application Architecture Guide is available for free on MSDN&lt;/a&gt; in HTML.&amp;#160; This is the contents of the guide at a glance:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ee658126.aspx"&gt;Foreword by S. Somasegar&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ee658097.aspx"&gt;Foreword by Scott Guthrie&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ee658082.aspx"&gt;Preface by David Hill&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Chapters&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ee658098.aspx"&gt;Chapter 1: What is Software Architecture?&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ee658124.aspx"&gt;Chapter 2: Key Principles of Software Architecture&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ee658117.aspx"&gt;Chapter 3: Architectural Patterns and Styles&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ee658084.aspx"&gt;Chapter 4: A Technique for Architecture and Design&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ee658109.aspx"&gt;Chapter 5: Layered Application Guidelines&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ee658081.aspx"&gt;Chapter 6: Presentation Layer Guidelines&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ee658103.aspx"&gt;Chapter 7: Business Layer Guidelines&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ee658127.aspx"&gt;Chapter 8: Data Layer Guidelines&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ee658090.aspx"&gt;Chapter 9: Service Layer Guidelines&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ee658121.aspx"&gt;Chapter 10: Component Guidelines&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ee658100.aspx"&gt;Chapter 11: Designing Presentation Components&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ee658102.aspx"&gt;Chapter 12: Designing Business Components&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ee658106.aspx"&gt;Chapter 13: Designing Business Entities&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ee658122.aspx"&gt;Chapter 14: Designing Workflow Components&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ee658119.aspx"&gt;Chapter 15: Designing Data Components&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ee658094.aspx"&gt;Chapter 16: Quality Attributes&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ee658105.aspx"&gt;Chapter 17: Crosscutting Concerns&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ee658118.aspx"&gt;Chapter 18: Communication and Messaging&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ee658120.aspx"&gt;Chapter 19: Physical Tiers and Deployment&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ee658104.aspx"&gt;Chapter 20: Choosing an Application Type&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ee658099.aspx"&gt;Chapter 21: Designing Web Applications&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ee658087.aspx"&gt;Chapter 22: Designing Rich Client Applications&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ee658083.aspx"&gt;Chapter 23: Designing Rich Internet Applications&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ee658108.aspx"&gt;Chapter 24: Designing Mobile Applications&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ee658114.aspx"&gt;Chapter 25: Designing Service Applications&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ee658110.aspx"&gt;Chapter 26: Designing Hosted and Cloud Services&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ee658085.aspx"&gt;Chapter 27: Designing Office Business Applications&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ee658091.aspx"&gt;Chapter 28: Designing SharePoint LOB Applications&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Appendices&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ee658101.aspx"&gt;Appendix A: The Microsoft Application Platform&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ee658088.aspx"&gt;Appendix B: Presentation Technology Matrix&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ee658113.aspx"&gt;Appendix C: Data Access Technology Matrix&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ee658095.aspx"&gt;Appendix D: Integration Technology Matrix&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ee658123.aspx"&gt;Appendix E: Workflow Technology Matrix&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ee658115.aspx"&gt;Appendix F: patterns &amp;amp; practices Enterprise Library&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ee658089.aspx"&gt;Appendix G: patterns &amp;amp; practices Pattern Catalog&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;The Team      &lt;br /&gt;&lt;/strong&gt;Here is the team that brought you the guide:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Core Dev Team&lt;/strong&gt;: J.D. Meier, Alex Homer, David Hill, Jason Taylor, Prashant Bansode, Lonnie Wall, Rob Boucher Jr, Akshay Bogawat &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Test Team&lt;/strong&gt; - Rohit Sharma, Praveen Rangarajan, Kashinath TR, Vijaya Jankiraman &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Edit Team&lt;/strong&gt; - Dennis Rea &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;External Contributors/Reviewers&lt;/strong&gt; - Adwait Ullal; Andy Eunson; Brian Sletten; Christian Weyer; David Guimbellot; David Ing; David Weller; Derek Greer; Eduardo Jezierski; Evan Hoff; Gajapathi Kannan; Jeremy D. Miller; John Kordyback; Keith Pleas; Kent Corley; Mark Baker; Paul Ballard; Peter Oehlert; Norman Headlam; Ryan Plant; Sam Gentile; Sidney G Pinney; Ted Neward; Udi Dahan &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Microsoft Contributors / Reviewers&lt;/strong&gt; - Ade Miller; Amit Chopra; Anna Liu; Anoop Gupta; Bob Brumfield; Brad Abrams; Brian Cawelti; Bhushan Nene; Burley Kawasaki; Carl Perry; Chris Keyser; Chris Tavares; Clint Edmonson; Dan Reagan; David Hill; Denny Dayton; Diego Dagum; Dmitri Martynov; Dmitri Ossipov; Don Smith; Dragos Manolescu; Elisa Flasko; Eric Fleck; Erwin van der Valk; Faisal Mohamood; Francis Cheung; Gary Lewis; Glenn Block; Gregory Leake; Ian Ellison-Taylor; Ilia Fortunov; J.R. Arredondo; John deVadoss; Joseph Hofstader; Koby Avital; Loke Uei Tan; Luke Nyswonger; Manish Prabhu; Meghan Perez; Mehran Nikoo; Michael Puleio; Mike Francis; Mike Walker; Mubarak Elamin; Nick Malik; Nobuyuki Akama; Ofer Ashkenazi; Pablo Castro; Pat Helland; Phil Haack; Rabi Satter; Reed Robison; Rob Tiffany; Ryno Rijnsburger; Scott Hanselman; Seema Ramchandani; Serena Yeoh; Simon Calvert; Srinath Vasireddy; Tom Hollander; Wojtek Kozaczynski &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Application Architecture Knowledge Base      &lt;br /&gt;&lt;/strong&gt;The guide was developed in conjunction with our &lt;a href="http://apparch.codeplex.com/"&gt;Application Architecture Guide v2.0 Knowledge Base Project&lt;/a&gt;. The knowledge base project was used to inform and steer the guide during its development. The Application Architecture Knowledge Base includes a large amount of material that expands on specific topics in the main guide. It also includes draft material from the main guide that is targeted and packaged for more specific audiences, such as the Pocket Guide series.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://apparch.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=17700"&gt;Overview Slides&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://apparch.codeplex.com/wikipage?title=Video:%20Train%20the%20Trainer%20-%20Application%20Architecture%20Guide%202.0&amp;amp;referringTitle=Home"&gt;Train the Trainer&lt;/a&gt; (Video) &lt;/li&gt;    &lt;li&gt;&lt;a href="http://apparch.codeplex.com/wikipage?title=Pocket%20Guides&amp;amp;referringTitle=Home"&gt;Pocket Guides&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://apparch.codeplex.com/wikipage?title=Video%20Index&amp;amp;referringTitle=Home"&gt;Videos&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://apparch.codeplex.com/wikipage?title=Slide%20Index&amp;amp;referringTitle=Home"&gt;Slides&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://apparch.codeplex.com/wikipage?title=Visio%20Index&amp;amp;referringTitle=Home"&gt;Figures (Visios)&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Key Links at a Glance      &lt;br /&gt;&lt;/strong&gt;Here are the key links at a glance:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/dd673617.aspx"&gt;Microsoft Application Architecture Guide&lt;/a&gt; (MSDN) &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.amazon.com/Microsoft%C2%AE-Application-Architecture-Patterns-Practices/dp/073562710X"&gt;Microsoft Application Architecture Guide&lt;/a&gt; (Amazon) &lt;/li&gt;    &lt;li&gt;&lt;a href="http://apparch.codeplex.com/"&gt;Application Architecture Knowledge Base&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=QIRE8Gdssks:osyG3RpdmXs:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=QIRE8Gdssks:osyG3RpdmXs:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?i=QIRE8Gdssks:osyG3RpdmXs:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=QIRE8Gdssks:osyG3RpdmXs:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=QIRE8Gdssks:osyG3RpdmXs:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?i=QIRE8Gdssks:osyG3RpdmXs:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=QIRE8Gdssks:osyG3RpdmXs:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=QIRE8Gdssks:osyG3RpdmXs:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/EricDeCarufelsBlog/~4/QIRE8Gdssks" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.decarufel.net/feeds/3062667735440717196/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2212558652617325901&amp;postID=3062667735440717196&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2212558652617325901/posts/default/3062667735440717196?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2212558652617325901/posts/default/3062667735440717196?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/EricDeCarufelsBlog/~3/QIRE8Gdssks/now-available-patterns-practices.html" title="Now Available: patterns &amp;amp; practices Application Architecture Book" /><author><name>Eric De C#</name><uri>http://www.blogger.com/profile/01046447681968794782</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_F9mN1vFyteY/STk80ggsyRI/AAAAAAAAD5g/XiVQebXFt_0/S220/Eric_De_Carufel_120x160.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.decarufel.net/2009/11/now-available-patterns-practices.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUMNQXg4eCp7ImA9WxNWFkg.&quot;"><id>tag:blogger.com,1999:blog-2212558652617325901.post-4059136721418308923</id><published>2009-10-15T21:33:00.001-04:00</published><updated>2009-10-15T21:44:50.630-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-15T21:44:50.630-04:00</app:edited><title>10/GUI: Fascinating Multitouch User Interface Design</title><content type="html">&lt;p&gt;If you want to see what the next generation of UI might look like, take a look at this concept.&lt;/p&gt;  &lt;p&gt;&lt;object width="640" height="360"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=6712657&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=6712657&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="640" height="360"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt;  &lt;p&gt;Link: &lt;a href="http://10gui.com/video/"&gt;10/GUI&lt;/a&gt; via &lt;a href="http://gizmodo.com/5382585/10gui-fascinating-multitouch-user-interface-design"&gt;Gizmodo&lt;/a&gt;&lt;/p&gt;  &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=v5milOX4KUk:6OoUE0oUgvY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=v5milOX4KUk:6OoUE0oUgvY:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?i=v5milOX4KUk:6OoUE0oUgvY:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=v5milOX4KUk:6OoUE0oUgvY:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=v5milOX4KUk:6OoUE0oUgvY:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?i=v5milOX4KUk:6OoUE0oUgvY:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=v5milOX4KUk:6OoUE0oUgvY:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=v5milOX4KUk:6OoUE0oUgvY:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/EricDeCarufelsBlog/~4/v5milOX4KUk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.decarufel.net/feeds/4059136721418308923/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2212558652617325901&amp;postID=4059136721418308923&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2212558652617325901/posts/default/4059136721418308923?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2212558652617325901/posts/default/4059136721418308923?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/EricDeCarufelsBlog/~3/v5milOX4KUk/10gui-fascinating-multitouch-user.html" title="10/GUI: Fascinating Multitouch User Interface Design" /><author><name>Eric De C#</name><uri>http://www.blogger.com/profile/01046447681968794782</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_F9mN1vFyteY/STk80ggsyRI/AAAAAAAAD5g/XiVQebXFt_0/S220/Eric_De_Carufel_120x160.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.decarufel.net/2009/10/10gui-fascinating-multitouch-user.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CU8ERHozeCp7ImA9WxNXFUU.&quot;"><id>tag:blogger.com,1999:blog-2212558652617325901.post-4607926898832952878</id><published>2009-09-30T21:26:00.002-04:00</published><updated>2009-10-03T11:30:05.480-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-03T11:30:05.480-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Architecture" /><category scheme="http://www.blogger.com/atom/ns#" term="C#" /><category scheme="http://www.blogger.com/atom/ns#" term="OOP" /><category scheme="http://www.blogger.com/atom/ns#" term="Design" /><title>Using Decorator (or Wrapper) Design Patterns to add Validation to an object</title><content type="html">&lt;h4&gt;Context&lt;/h4&gt;  &lt;p&gt;In most cases when someone write about the Decorator pattern it is usually related to UI stuff. The most common example is adding “decoration” to a control, for example a scroll bar. But in my humble opinion, this is not the most useful usage of Decorator. The purpose this pattern is:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;“Attach additional responsibilities to an object dynamically. Decorators provide a flexible alternative to sub classing for extending functionality”&lt;/p&gt;    &lt;p align="right"&gt;Gang of Four&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;If you think about it, Validation is a responsibility and so it can be added by this pattern. Of course we can add the validation to the class itself or in its base class, but how would you reuse this validation across many unrelated objects and what if you object must derive from another base class? &lt;/p&gt;  &lt;h3&gt;&lt;/h3&gt;  &lt;h4&gt;Solution&lt;/h4&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/_F9mN1vFyteY/SsYAGckVzgI/AAAAAAAAG34/28cvGDFA1gc/s1600-h/Decorator%5B37%5D.png" target="_blank"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px" title="Decorator" border="0" alt="Decorator" align="right" src="http://lh4.ggpht.com/_F9mN1vFyteY/SsYAGjOH96I/AAAAAAAAG38/ELhxiAmLdvw/Decorator_thumb%5B33%5D.png?imgmax=800" width="220" height="128" /&gt;&lt;/a&gt; The solution is the Decorator pattern. With this pattern we can add new responsibility to an object without changing its internals.&lt;/p&gt;  &lt;p&gt;For simplicity purpose we will take a simple sample that anyone can understand but the concept shown here can apply to much more complex object.&lt;/p&gt;  &lt;p&gt;Four our sample we will take a bank account. On this account we should be able to to money deposit and withdraw. The class diagram on the right illustrate this design.&lt;/p&gt;  &lt;p&gt;Let’s start by defining our IAccount interface&lt;/p&gt;  &lt;pre class="brush: csharp;"&gt;namespace Model
{
   public interface IAccount {
       string AccountNumber { get; }
       decimal Balance { get; }
       bool Active { get; }
       void Deposit(decimal amount);
       void Withdraw(decimal amount);
       void Close();
   }
}&lt;/pre&gt;

&lt;p&gt;This simple interface will be the central abstraction of the system. The goal is to never depends on concrete class and this interface in enough to add a lot of functionality around an account.&lt;/p&gt;

&lt;p&gt;Now here the interface implementation as an Account:&lt;/p&gt;

&lt;pre class="brush: csharp; collapse: true;"&gt;using System.Diagnostics;

namespace Model
{
   [DebuggerDisplay("Account = {_accountNumber}, Balance = {_balance}")]
   public class Account : IAccount
   {
       public string AccountNumber { get; private set; }
       public decimal Balance { get; private set; }
       public bool Active { get; set; }

       internal Account(string accountNumber, decimal balance)
       {
           AccountNumber = accountNumber;
           Balance = balance;
           Active = true;
       }

       public void Deposit(decimal amount)
       {
           if (OnBeforeDeposit())
               Balance += amount;
           OnAfterDeposit();
       }

       protected virtual bool OnBeforeDeposit()
       {
           return true;
       }

       protected virtual void OnAfterDeposit() { }

       public void Withdraw(decimal amount)
       {
           if (OnBeforeWithdraw())
               Balance -= amount;
           OnAfterWithdraw();
       }

       protected virtual bool OnBeforeWithdraw()
       {
           return true;
       }

       protected virtual void OnAfterWithdraw() { }

       public void Close()
       {
           if (OnBeforeClose())
               Active = false;
           OnAfterClose();
       }

       protected virtual bool OnBeforeClose()
       {
           return true;
       }

       protected virtual void OnAfterClose() { }
   }
}&lt;/pre&gt;

&lt;p&gt;If you expand the previous block of code you will see that the implementation of IAccount is only doing business stuff. There is no other responsibility in this class than the one that is meant for. We can clearly see “Template Method” design pattern here. All “On&lt;em&gt;Something&lt;/em&gt;()” method are protected and any derided class can add implementation around the process. All “&lt;em&gt;Before”&lt;/em&gt; method can cancel the process if the return value is false. This allow extension classes to add some specific behaviour.&lt;/p&gt;

&lt;p&gt;But one of the main thing missing in this class is “validation”. We will use the decorator pattern to do that. A decorator class is a class thst implement all the member of an abstraction and forward all the calls to an internal instance of a real implementation that abstraction. In our case the abstraction is “IAccount” so we have to make a decorator that implement that interface.&lt;/p&gt;

&lt;pre class="brush: csharp;"&gt;namespace Model.Decorator
{
   public abstract class AccountDecorator : IAccount
   {
       private readonly IAccount _account;

       protected IAccount Account
       {
           get { return _account; }
       }

       protected AccountDecorator(IAccount account)
       {
           _account = account;
       }

       public string AccountNumber
       {
           get { return Account.AccountNumber; }
       }

       public decimal Balance
       {
           get { return Account.Balance; }
       }

       public bool Active
       {
           get { return Account.Active; }
       }

       public virtual void Deposit(decimal amount)
       {
           Account.Deposit(amount);
       }

       public virtual void Withdraw(decimal amount)
       {
           Account.Withdraw(amount);
       }

       public virtual void Close()
       {
           Account.Close();
       }
   }
}&lt;/pre&gt;

&lt;p&gt;As you can see the constructor of the decorator takes an instance of “IAccount”. All method forward their call to that instance. This base class simplifies the process of creating concrete decorator by allowing other decorator to implement some but not all members of the interface.&lt;/p&gt;

&lt;p&gt;Now is the time to start implementing our validation class structure. For that purpose we will create a base validation class that will be responsible of applying the validation the IAccount instance.&lt;/p&gt;

&lt;pre class="brush: csharp;"&gt;using System.Collections.Generic;
using Model.Decorator;

namespace Model.Validator
{
   public abstract class AccountValidatorBase : AccountDecorator
   {
       protected abstract IEnumerable&amp;lt;IValidation&amp;gt; GetValidations(decimal amount);

       protected AccountValidatorBase(IAccount account) : base(account) {}

       protected void Validate(decimal amount)
       {
           foreach (var validation in GetValidations(amount))
               if (!validation.IsValid)
                   throw validation.Exception;
       }
   }
}&lt;/pre&gt;

&lt;p&gt;This simple base class define a “GetValidations” method that all derived class must override to add a list of validation to perform on method call.&lt;/p&gt;

&lt;p&gt;Now to implement the “Deposit” validation we have to create this class:&lt;/p&gt;

&lt;pre class="brush: csharp;"&gt;using System.Collections.Generic;
using Model.Validation;

namespace Model.Validator
{
   public class AccountDepositValidator : AccountValidatorBase
   {
       public AccountDepositValidator(IAccount account) : base(account) {}

       protected override IEnumerable&amp;lt;IValidation&amp;gt; GetValidations(decimal amount)
       {
           return new List&amp;lt;IValidation&amp;gt;
           {
               new AmountGreaterThanZeroValidation(amount),
               new AmountShouldHaveOnlyTwoDecimals(amount),
               new AccountMustBeActiveValidation(Account),
               new DepositAmountNotExceedMaxValidation(Account, amount)
           };
       }

       public override void Deposit(decimal amount)
       {
           Validate(amount);
           Account.Deposit(amount);
       }
   }
}&lt;/pre&gt;

&lt;p&gt;This class is responsible for creating all validation instances. The “Deposit” method is overridden to call the base “Validate” method before doing the actual deposit. &lt;/p&gt;

&lt;p&gt;To implement those validation we need to define the “IValidation” interface. &lt;/p&gt;

&lt;pre class="brush: csharp;"&gt;using System;

namespace Model.Validator
{
   public interface IValidation
   {
       bool IsValid { get; }
       Exception Exception { get; }
   }
}&lt;/pre&gt;

&lt;p&gt;Here is a sample implementation:&lt;/p&gt;

&lt;pre class="brush: csharp;"&gt;using System;
using Model.Validator;

namespace Model.Validation
{
   public class AmountGreaterThanZeroValidation : IValidation
   {
       public AmountGreaterThanZeroValidation(decimal amount)
       {
           Amount = amount;
       }

       public decimal Amount { get; set; }

       public bool IsValid
       {
           get { return Amount &amp;gt; 0; }
       }

       public Exception Exception
       {
           get { return new ArgumentOutOfRangeException("amount", Amount, "Deposit amount should be greater than 0."); }
       }
   }
}&lt;/pre&gt;

&lt;p&gt;All other validations used in “AccountDepositValidator” can be described the same way. &lt;/p&gt;

&lt;p&gt;The last step is to create an actual “IAccount” that will implement all this stuff. To do that we will need a Bank class. A bank is responsible of creating account. It will also be responsible of decorating it with all necessary decorators.&lt;/p&gt;

&lt;pre class="brush: csharp;"&gt;using System;
using System.Collections.Generic;
using Model.Logging;
using Model.Validator;

namespace Model
{
   public static class Bank
   {
       static readonly SortedDictionary&amp;lt;string, IAccount&amp;gt; _accounts = new SortedDictionary&amp;lt;string, IAccount&amp;gt;();
       private static int _accountSequence = 1;

       public static IAccount CreateAccount(decimal balance)
       {
           string accountNumber = String.Format("A{0:0000}", _accountSequence++);
           IAccount account = new Account(accountNumber, balance);
           account = new AccountDepositValidator(account);
           _accounts[account.AccountNumber] = account;
           return account;
       }
   }
}&lt;/pre&gt;

&lt;p&gt;To illustrate this process in action here is a sequence diagram:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://lh3.ggpht.com/_F9mN1vFyteY/SsYAHo12S-I/AAAAAAAAG3w/_9Yedaq70mE/s1600-h/Validation%20with%20Decorator%5B24%5D.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Validation with Decorator" border="0" alt="Validation with Decorator" src="http://lh5.ggpht.com/_F9mN1vFyteY/SsYAIM7eOjI/AAAAAAAAG30/VA6a_qBkwwA/Validation%20with%20Decorator_thumb%5B20%5D.png?imgmax=800" width="666" height="326" /&gt;&lt;/a&gt; &lt;/p&gt;

&lt;ol&gt;
 &lt;li&gt;Call Bank.CreateAccount. &lt;/li&gt;

 &lt;li&gt;The Bank instantiate an Account class. &lt;/li&gt;

 &lt;li&gt;The Bank create an AccountDepositValidator and wrap Account with it &lt;/li&gt;

 &lt;li&gt;The Bank return an instance of IAccount. &lt;/li&gt;

 &lt;li&gt;Deposit is called on IAccount which is an instance of AccountDepositValidator &lt;/li&gt;

 &lt;li&gt;AccountDepositValidator call Validate &lt;/li&gt;

 &lt;li&gt;AccountDepositValidator call GetValidations to retrieve the list of validation to evaluate &lt;/li&gt;

 &lt;li&gt;An AmountGreaterThaZeroValidation is created &lt;/li&gt;

 &lt;li&gt;IsValid returns true &lt;/li&gt;

 &lt;li&gt;AccountDepositValidator call base Deposit method &lt;/li&gt;

 &lt;li&gt;Balance value is updated &lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;Next&lt;/h4&gt;

&lt;p&gt;With all this in place the only thing left to do is to implement all the other validators for all method of “IAccount”.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=lh2tfS7sMdU:EAoXbiACOao:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=lh2tfS7sMdU:EAoXbiACOao:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?i=lh2tfS7sMdU:EAoXbiACOao:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=lh2tfS7sMdU:EAoXbiACOao:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=lh2tfS7sMdU:EAoXbiACOao:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?i=lh2tfS7sMdU:EAoXbiACOao:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=lh2tfS7sMdU:EAoXbiACOao:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=lh2tfS7sMdU:EAoXbiACOao:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/EricDeCarufelsBlog/~4/lh2tfS7sMdU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.decarufel.net/feeds/4607926898832952878/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2212558652617325901&amp;postID=4607926898832952878&amp;isPopup=true" title="6 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2212558652617325901/posts/default/4607926898832952878?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2212558652617325901/posts/default/4607926898832952878?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/EricDeCarufelsBlog/~3/lh2tfS7sMdU/using-decorator-or-wrapper-design.html" title="Using Decorator (or Wrapper) Design Patterns to add Validation to an object" /><author><name>Eric De C#</name><uri>http://www.blogger.com/profile/01046447681968794782</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_F9mN1vFyteY/STk80ggsyRI/AAAAAAAAD5g/XiVQebXFt_0/S220/Eric_De_Carufel_120x160.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh4.ggpht.com/_F9mN1vFyteY/SsYAGjOH96I/AAAAAAAAG38/ELhxiAmLdvw/s72-c/Decorator_thumb%5B33%5D.png?imgmax=800" height="72" width="72" /><thr:total>6</thr:total><feedburner:origLink>http://blog.decarufel.net/2009/09/using-decorator-or-wrapper-design.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0YASX05eCp7ImA9WxNREEQ.&quot;"><id>tag:blogger.com,1999:blog-2212558652617325901.post-8814369394782100917</id><published>2009-09-04T15:04:00.001-04:00</published><updated>2009-09-04T15:05:48.320-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-04T15:05:48.320-04:00</app:edited><title>Coder une application d'affaire avec Silverlight (Montreal event)</title><content type="html">&lt;h2 style="margin: 0.25em 0px 0px"&gt;   &lt;div&gt;&lt;a href="http://guy.dotnet-expertise.com/PermaLink,guid,36187db1-b9da-4804-aa1c-2734710230c9.aspx"&gt;Coder une application d'affaire avec Silverlight (Montreal event)&lt;/a&gt;&lt;/div&gt; &lt;/h2&gt;  &lt;div style="margin-bottom: 0.5em"&gt;via &lt;a class="f" href="http://guy.dotnet-expertise.com/"&gt;Guy Barrette's Blog&lt;/a&gt; by Guy Barrette on 9/4/09&lt;/div&gt;  &lt;br style="display: none" /&gt;  &lt;p&gt;La Communauté .NET de Montréal organise une journée de formation Silverlight samedi le 24 octobre prochain.&amp;#160; Pour plus d'information et pour vous enregistrer, veuillez consulter le site suivant: &lt;/p&gt;  &lt;p&gt;&lt;a title="http://samedidotnet2009.eventbrite.com/" href="http://guy.dotnet-expertise.com/ct.ashx?id=36187db1-b9da-4804-aa1c-2734710230c9&amp;amp;url=http%3a%2f%2fsamedidotnet2009.eventbrite.com%2f"&gt;http://samedidotnet2009.eventbrite.com/&lt;/a&gt;&lt;/p&gt;  &lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=eQDbM9DdGb4:kjf8xztZFj0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=eQDbM9DdGb4:kjf8xztZFj0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?i=eQDbM9DdGb4:kjf8xztZFj0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=eQDbM9DdGb4:kjf8xztZFj0:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=eQDbM9DdGb4:kjf8xztZFj0:gIN9vFwOqvQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?i=eQDbM9DdGb4:kjf8xztZFj0:gIN9vFwOqvQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=eQDbM9DdGb4:kjf8xztZFj0:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?a=eQDbM9DdGb4:kjf8xztZFj0:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/EricDeCarufelsBlog?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/EricDeCarufelsBlog/~4/eQDbM9DdGb4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://blog.decarufel.net/feeds/8814369394782100917/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=2212558652617325901&amp;postID=8814369394782100917&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/2212558652617325901/posts/default/8814369394782100917?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/2212558652617325901/posts/default/8814369394782100917?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/EricDeCarufelsBlog/~3/eQDbM9DdGb4/coder-une-application-d-avec.html" title="Coder une application d&amp;#39;affaire avec Silverlight (Montreal event)" /><author><name>Eric De C#</name><uri>http://www.blogger.com/profile/01046447681968794782</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="24" height="32" src="http://2.bp.blogspot.com/_F9mN1vFyteY/STk80ggsyRI/AAAAAAAAD5g/XiVQebXFt_0/S220/Eric_De_Carufel_120x160.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://blog.decarufel.net/2009/09/coder-une-application-d-avec.html</feedburner:origLink></entry></feed>
