<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>pushbomb &#187; Software Design</title>
	<atom:link href="http://team.pushbomb.com/category/software-as-strategic/software-design-software-as-strategic/feed/" rel="self" type="application/rss+xml" />
	<link>http://team.pushbomb.com</link>
	<description>tv programmed by the collective</description>
	<lastBuildDate>Tue, 05 Jan 2010 22:49:48 +0000</lastBuildDate>
	<generator>http://wordpress.com/</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<cloud domain='team.pushbomb.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://www.gravatar.com/blavatar/a08732ed34e6814d5a5513fe8cde5696?s=96&#038;d=http://s2.wp.com/i/buttonw-com.png</url>
		<title>pushbomb &#187; Software Design</title>
		<link>http://team.pushbomb.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://team.pushbomb.com/osd.xml" title="pushbomb" />
	<atom:link rel='hub' href='http://team.pushbomb.com/?pushpress=hub'/>
		<item>
		<title>Silverlight Bing Maps &#8211; Now with StreetSide!!</title>
		<link>http://team.pushbomb.com/2009/12/17/silverlight_finally_gets_streetside_view_in_maps/</link>
		<comments>http://team.pushbomb.com/2009/12/17/silverlight_finally_gets_streetside_view_in_maps/#comments</comments>
		<pubDate>Thu, 17 Dec 2009 18:32:24 +0000</pubDate>
		<dc:creator>Damon Wilder Carr</dc:creator>
				<category><![CDATA[Deep Earth]]></category>
		<category><![CDATA[Digital Media]]></category>
		<category><![CDATA[Framework Design]]></category>
		<category><![CDATA[Geographic Apps]]></category>
		<category><![CDATA[HD Video]]></category>
		<category><![CDATA[Linq]]></category>
		<category><![CDATA[Multithreading]]></category>
		<category><![CDATA[PlugIns & Extensibility (MEF)]]></category>
		<category><![CDATA[Prism]]></category>
		<category><![CDATA[Siverlight]]></category>
		<category><![CDATA[Smooth Streaming]]></category>
		<category><![CDATA[Software Design]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Tips and Tricks]]></category>
		<category><![CDATA[silverlight 3]]></category>
		<category><![CDATA[software as strategic]]></category>
		<category><![CDATA[tangent.ux media platform]]></category>

		<guid isPermaLink="false">http://dcarr.wordpress.com/2009/12/17/silverlight_finally_gets_streetside_view_in_maps/</guid>
		<description><![CDATA[This is pretty awesome. I have been deep into Bing Maps as well as the Deep Earth project and have ported it to Prism as well as the brand spanking new extension DLL for StreetSide view.<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=1940&subd=dcarr&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>This is pretty awesome. I have been deep into Bing Maps as well as the Deep Earth project and have ported it to Prism as well as the brand spanking new extension DLL for StreetSide view.</p>
<p>&#160;</p>
<p>&#160;</p>
<p>Here is what my old apartment looks like for example (and click the link to play yourself – routes, free form drawing of geometries, reverse geo-code, etc. etc.</p>
<p>&#160;</p>
<p>&#160;</p>
<p><a href="http://go.pushbomb.com/deepearthnext.html"><img style="display:inline;border-width:0;" title="silverlightstreetview" border="0" alt="silverlightstreetview" src="http://dcarr.files.wordpress.com/2009/12/silverlightstreetview.png?w=644&#038;h=375" width="644" height="375" /></a> </p>
<p>&#160;</p>
<p>&#160;</p>
<p>&#160;</p>
<p><a href="http://go.pushbomb.com/deepearthnext.html">Here is the link.</a></p>
<p>&#160;</p>
<p>So how is this possible? I’ll keep this short and if anyone needs more I’d be happy to help.</p>
<p>&#160;</p>
<p><a href="http://dcarr.files.wordpress.com/2009/12/highlevel.png"><img style="display:inline;border-width:0;" title="highlevel" border="0" alt="highlevel" src="http://dcarr.files.wordpress.com/2009/12/highlevel_thumb.png?w=640&#038;h=198" width="640" height="198" /></a></p>
<p>&#160;</p>
<p>&#160;</p>
<p>&#160;</p>
<p>&#160;</p>
<p>Look close at the versions. You need the new CTP of Extended Modes and the 1.0.1.0 of the two map controls.</p>
<p>&#160;</p>
<p>&#160;</p>
<p>And using Prism makes Deep Earth a joy to work with:</p>
<p>&#160;</p>
<div style="padding:5px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:8fb3aceb-4367-4763-b112-6d19970baf70" class="wlWriterEditableSmartContent">
<div style="border:#000080 1px solid;font-family:'Courier New', Courier, Monospace;font-size:10pt;">
<div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;">Code Snippet</div>
<div style="background:#ddd;max-height:300px;overflow:scroll;padding:0;">
<ol style="background:#000000;white-space:wrap;margin:0 0 0 35px;">
<li> <span style="background:#000000;color:#ffffff;">&lt;</span><span style="color:#f9caca;">UserControl</span><span style="color:#ff6464;"> x</span><span style="color:#ffffff;">:</span><span style="color:#ff6464;">Class</span><span style="color:#ffffff;">=</span><span style="color:#9797ff;">&#8220;pushbomb.geo.poc.Page&#8221;</li>
<li style="background:#0c0c0c;"> </span><span style="color:#ffffff;">   </span><span style="color:#ff6464;"> xmlns</span><span style="color:#ffffff;">=</span><span style="color:#9797ff;">&#8220;http://schemas.microsoft.com/winfx/2006/xaml/presentation&#8221;</span><span style="color:#ffffff;"> </li>
<li>    </span><span style="color:#ff6464;"> xmlns</span><span style="color:#ffffff;">:</span><span style="color:#ff6464;">x</span><span style="color:#ffffff;">=</span><span style="color:#9797ff;">&#8220;http://schemas.microsoft.com/winfx/2006/xaml&#8221;</span><span style="color:#ff6464;"> xmlns</span><span style="color:#ffffff;">:</span><span style="color:#ff6464;">Regions</span><span style="color:#ffffff;">=</span><span style="color:#9797ff;">&#8220;clr-namespace:Microsoft.Practices.Composite.Presentation.Regions;assembly=Microsoft.Practices.Composite.Presentation&#8221;</span><span style="color:#ffffff;">&gt;</li>
<li style="background:#0c0c0c;"> </li>
<li> </li>
<li style="background:#0c0c0c;"> </span><span style="color:#808080;">    </span><span style="color:#ffffff;">&lt;</span><span style="color:#f9caca;">UserControl.Resources</span><span style="color:#ffffff;">&gt;</li>
<li> </li>
<li style="background:#0c0c0c;"> </span><span style="color:#808080;">        </span><span style="color:#ffffff;">&lt;</span><span style="color:#f9caca;">ResourceDictionary</span><span style="color:#ffffff;">&gt;</li>
<li> </span><span style="color:#808080;">            </span><span style="color:#ffffff;">&lt;</span><span style="color:#f9caca;">ResourceDictionary.MergedDictionaries</span><span style="color:#ffffff;">&gt;</li>
<li style="background:#0c0c0c;"> </span><span style="color:#808080;">                </span><span style="color:#ffffff;">&lt;</span><span style="color:#f9caca;">ResourceDictionary</span><span style="color:#ff6464;"> Source</span><span style="color:#ffffff;">=</span><span style="color:#9797ff;">&#8220;/DeepEarth.BingMapsToolkit.Client.Common;component/resources/CommonStyles.xaml&#8221;</span><span style="color:#ffffff;"> /&gt;</li>
<li> </span><span style="color:#808080;">            </span><span style="color:#ffffff;">&lt;/</span><span style="color:#f9caca;">ResourceDictionary.MergedDictionaries</span><span style="color:#ffffff;">&gt;</li>
<li style="background:#0c0c0c;"> </li>
<li> </span><span style="color:#808080;">        </span><span style="color:#ffffff;">&lt;/</span><span style="color:#f9caca;">ResourceDictionary</span><span style="color:#ffffff;">&gt;</li>
<li style="background:#0c0c0c;"> </li>
<li> </span><span style="color:#808080;">    </span><span style="color:#ffffff;">&lt;/</span><span style="color:#f9caca;">UserControl.Resources</span><span style="color:#ffffff;">&gt;</li>
<li style="background:#0c0c0c;"> </li>
<li> </span><span style="color:#808080;">    </span><span style="color:#ffffff;">&lt;</span><span style="color:#f9caca;">Grid</span><span style="color:#ff6464;"> x</span><span style="color:#ffffff;">:</span><span style="color:#ff6464;">Name</span><span style="color:#ffffff;">=</span><span style="color:#9797ff;">&#8220;LayoutRoot&#8221;</span><span style="color:#ff6464;"> Background</span><span style="color:#ffffff;">=</span><span style="color:#9797ff;">&#8220;Black&#8221;</span><span style="color:#ffffff;">&gt;</li>
<li style="background:#0c0c0c;"> </li>
<li> </span><span style="color:#808080;">        </span><span style="color:#ffffff;">&lt;</span><span style="color:#f9caca;">ContentControl</span><span style="color:#ffffff;">  </span><span style="color:#ff6464;"> Content</span><span style="color:#ffffff;">=&#8221;{</span><span style="color:#f8c7c7;">Binding</span><span style="color:#ff0000;"> Map</span><span style="color:#ffffff;">}</span><span style="color:#9797ff;">&#8220;</span><span style="color:#ff6464;"> HorizontalContentAlignment</span><span style="color:#ffffff;">=</span><span style="color:#9797ff;">&#8220;Stretch&#8221;</span><span style="color:#ff6464;"> VerticalContentAlignment</span><span style="color:#ffffff;">=</span><span style="color:#9797ff;">&#8220;Stretch&#8221;</span><span style="color:#ffffff;"> &gt;</li>
<li style="background:#0c0c0c;"> </li>
<li> </li>
<li style="background:#0c0c0c;"> </span><span style="color:#808080;">        </span><span style="color:#ffffff;">&lt;/</span><span style="color:#f9caca;">ContentControl</span><span style="color:#ffffff;">&gt;</li>
<li> </li>
<li style="background:#0c0c0c;"> </span><span style="color:#808080;">        </span><span style="color:#ffffff;">&lt;</span><span style="color:#f9caca;">ItemsControl</span><span style="color:#ffffff;"> </span><span style="color:#ff6464;"> Regions</span><span style="color:#ffffff;">:</span><span style="color:#ff6464;">RegionManager.RegionName</span><span style="color:#ffffff;">=</span><span style="color:#9797ff;">&#8220;WidgetsRegion&#8221;</span><span style="color:#ffffff;"> /&gt;</li>
<li> </li>
<li style="background:#0c0c0c;"> </li>
<li> </li>
<li style="background:#0c0c0c;"> </span><span style="color:#808080;">    </span><span style="color:#ffffff;">&lt;/</span><span style="color:#f9caca;">Grid</span><span style="color:#ffffff;">&gt;</li>
<li> &lt;/</span><span style="color:#f9caca;">UserControl</span><span style="color:#ffffff;">&gt;</li>
<li style="background:#0c0c0c;"> </span></li>
</ol>
</div>
</div>
</div>
<p>&#160;</p>
<p>&#160;</p>
<div style="padding:5px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:a37f21ad-567f-4847-b586-ccdf4ab4d658" class="wlWriterEditableSmartContent">
<div style="border:#000080 1px solid;font-family:'Courier New', Courier, Monospace;font-size:10pt;">
<div style="background:#000080;color:#fff;font-family:Verdana, Tahoma, Arial, sans-serif;font-weight:bold;padding:2px 5px;">Code Snippet</div>
<div style="background:#ddd;max-height:300px;overflow:scroll;padding:0;">
<ol style="background:#000000;white-space:wrap;margin:0 0 0 35px;">
<li> <span style="background:#000000;color:#3e60fd;">using</span><span style="color:#ffffff;"> System</span><span style="color:#00ffff;">.</span><span style="color:#ffffff;">Windows;</li>
<li style="background:#0c0c0c;"> </span><span style="color:#3e60fd;">using</span><span style="color:#ffffff;"> Microsoft</span><span style="color:#00ffff;">.</span><span style="color:#ffffff;">Maps</span><span style="color:#00ffff;">.</span><span style="color:#ffffff;">MapControl</span><span style="color:#00ffff;">.</span><span style="color:#ffffff;">Core;</li>
<li> </span><span style="color:#3e60fd;">using</span><span style="color:#ffffff;"> Microsoft</span><span style="color:#00ffff;">.</span><span style="color:#ffffff;">Practices</span><span style="color:#00ffff;">.</span><span style="color:#ffffff;">Unity;</li>
<li style="background:#0c0c0c;"> </span><span style="color:#3e60fd;">using</span><span style="color:#ffffff;"> pushbomb</span><span style="color:#00ffff;">.</span><span style="color:#ffffff;">composite</span><span style="color:#00ffff;">.</span><span style="color:#ffffff;">core</span><span style="color:#00ffff;">.</span><span style="color:#ffffff;">Infrastructure;</li>
<li> </span><span style="color:#3e60fd;">using</span><span style="color:#ffffff;"> pushbomb</span><span style="color:#00ffff;">.</span><span style="color:#ffffff;">composite</span><span style="color:#00ffff;">.</span><span style="color:#ffffff;">core</span><span style="color:#00ffff;">.</span><span style="color:#ffffff;">Interfaces;</li>
<li style="background:#0c0c0c;"> </li>
<li> </span><span style="color:#3e60fd;">namespace</span><span style="color:#ffffff;"> pushbomb</span><span style="color:#00ffff;">.</span><span style="color:#ffffff;">geo</span><span style="color:#00ffff;">.</span><span style="color:#ffffff;">poc</li>
<li style="background:#0c0c0c;"> {</li>
<li>     </span><span style="color:#3e60fd;">public</span><span style="color:#ffffff;"> </span><span style="color:#3e60fd;">class</span><span style="color:#ffffff;"> </span><span style="color:#2b91af;">MapViewModel</span><span style="color:#ffffff;"> : </span><span style="color:#2b91af;">ViewModelBase</span><span style="color:#ffffff;">, </span><span style="color:#2b91af;">IMapViewContainer</li>
<li style="background:#0c0c0c;"> </span><span style="color:#ffffff;">    {</li>
<li>         </span><span style="color:#3e60fd;">private</span><span style="color:#ffffff;"> </span><span style="color:#3e60fd;">readonly</span><span style="color:#ffffff;"> </span><span style="color:#2b91af;">InnerViewContainer</span><span style="color:#00ffff;">&lt;</span><span style="color:#2b91af;">MapShellView</span><span style="color:#00ffff;">&gt;</span><span style="color:#ffffff;"> _inner;</li>
<li style="background:#0c0c0c;"> </li>
<li> </li>
<li style="background:#0c0c0c;">         </span><span style="color:#3e60fd;">public</span><span style="color:#ffffff;"> MapViewModel(</span><span style="color:#2b91af;">IApplicationContext</span><span style="color:#ffffff;"> context, [</span><span style="color:#2b91af;">Dependency</span><span style="color:#ffffff;">(</span><span style="color:#808080;">"Shell"</span><span style="color:#ffffff;">)] </span><span style="color:#2b91af;">FrameworkElement</span><span style="color:#ffffff;"> view)</li>
<li>             : </span><span style="color:#3e60fd;">base</span><span style="color:#ffffff;">(context, view)</li>
<li style="background:#0c0c0c;">         {</li>
<li>             _inner </span><span style="color:#00ffff;">=</span><span style="color:#ffffff;"> </span><span style="color:#3e60fd;">new</span><span style="color:#ffffff;"> </span><span style="color:#2b91af;">InnerViewContainer</span><span style="color:#00ffff;">&lt;</span><span style="color:#2b91af;">MapShellView</span><span style="color:#00ffff;">&gt;</span><span style="color:#ffffff;">(view, </span><span style="color:#3e60fd;">this</span><span style="color:#ffffff;">);</li>
<li style="background:#0c0c0c;">         }</li>
<li> </li>
<li style="background:#0c0c0c;"> </span><span style="color:#ff0000;">        #region</span><span style="color:#ffffff;"> IMapViewContainer Members</li>
<li> </li>
<li style="background:#0c0c0c;">         </span><span style="color:#3e60fd;">public</span><span style="color:#ffffff;"> </span><span style="color:#2b91af;">MapBase</span><span style="color:#ffffff;"> Map</li>
<li>         {</li>
<li style="background:#0c0c0c;">             </span><span style="color:#3e60fd;">get</span><span style="color:#ffffff;"> { </span><span style="color:#3e60fd;">return</span><span style="color:#ffffff;"> AppContext</span><span style="color:#00ffff;">.</span><span style="color:#ffffff;">Map; }</li>
<li>         }</li>
<li style="background:#0c0c0c;"> </li>
<li> </span><span style="color:#ff0000;">        #endregion</li>
<li style="background:#0c0c0c;"> </li>
<li> </span><span style="color:#ffffff;">        </span><span style="color:#3e60fd;">public</span><span style="color:#ffffff;"> </span><span style="color:#3e60fd;">override</span><span style="color:#ffffff;"> </span><span style="color:#3e60fd;">void</span><span style="color:#ffffff;"> Initialize()</li>
<li style="background:#0c0c0c;">         {</li>
<li>             InvokePropertyChanged(() </span><span style="color:#00ffff;">=&gt;</span><span style="color:#ffffff;"> Map);</li>
<li style="background:#0c0c0c;">         }</li>
<li>     }</li>
<li style="background:#0c0c0c;"> \</span></li>
</ol>
</div>
</div>
</div>
<br />Posted in Deep Earth, Digital Media, Framework Design, Geographic Apps, HD Video, Linq, Multithreading, PlugIns &amp; Extensibility (MEF), Prism, silverlight 3, Siverlight, Smooth Streaming, software as strategic, Software Design, tangent.ux media platform, Technology, Tips and Tricks  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/dcarr.wordpress.com/1940/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/dcarr.wordpress.com/1940/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/dcarr.wordpress.com/1940/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/dcarr.wordpress.com/1940/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/dcarr.wordpress.com/1940/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/dcarr.wordpress.com/1940/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/dcarr.wordpress.com/1940/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/dcarr.wordpress.com/1940/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/dcarr.wordpress.com/1940/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/dcarr.wordpress.com/1940/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=1940&subd=dcarr&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://team.pushbomb.com/2009/12/17/silverlight_finally_gets_streetside_view_in_maps/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7b572cbcda5a17fe984e7dd1ddc9c3d6?s=96&#38;d=&#38;r=PG" medium="image">
			<media:title type="html">pushbomb</media:title>
		</media:content>

		<media:content url="http://dcarr.files.wordpress.com/2009/12/silverlightstreetview.png" medium="image">
			<media:title type="html">silverlightstreetview</media:title>
		</media:content>

		<media:content url="http://dcarr.files.wordpress.com/2009/12/highlevel_thumb.png" medium="image">
			<media:title type="html">highlevel</media:title>
		</media:content>
	</item>
		<item>
		<title>Silverlight 3 Media The Complete Story with Advanced Sample</title>
		<link>http://team.pushbomb.com/2009/07/24/silverlight_3_digital_media_complete_information_media_platform/</link>
		<comments>http://team.pushbomb.com/2009/07/24/silverlight_3_digital_media_complete_information_media_platform/#comments</comments>
		<pubDate>Sat, 25 Jul 2009 00:04:00 +0000</pubDate>
		<dc:creator>Damon Wilder Carr</dc:creator>
				<category><![CDATA[Adobe Video Formats]]></category>
		<category><![CDATA[Art and Animation]]></category>
		<category><![CDATA[C# 3.0 Enhancements]]></category>
		<category><![CDATA[Digital Media]]></category>
		<category><![CDATA[HD Video]]></category>
		<category><![CDATA[Industry News]]></category>
		<category><![CDATA[Live Smooth Streaming]]></category>
		<category><![CDATA[PlugIns & Extensibility (MEF)]]></category>
		<category><![CDATA[SilverLight]]></category>
		<category><![CDATA[Smooth Streaming]]></category>
		<category><![CDATA[Software Design]]></category>
		<category><![CDATA[Software Futures]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Tips and Tricks]]></category>
		<category><![CDATA[silverlight 3]]></category>
		<category><![CDATA[acceleration]]></category>
		<category><![CDATA[acquisition]]></category>
		<category><![CDATA[adaptive]]></category>
		<category><![CDATA[adobe]]></category>
		<category><![CDATA[advantage]]></category>
		<category><![CDATA[agencies]]></category>
		<category><![CDATA[Analytics]]></category>
		<category><![CDATA[animation]]></category>
		<category><![CDATA[audiences]]></category>
		<category><![CDATA[Audio]]></category>
		<category><![CDATA[authentication]]></category>
		<category><![CDATA[authorization]]></category>
		<category><![CDATA[bandwidth]]></category>
		<category><![CDATA[Blend]]></category>
		<category><![CDATA[bridge]]></category>
		<category><![CDATA[broadcasters]]></category>
		<category><![CDATA[browser]]></category>
		<category><![CDATA[Bureau]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[codecs]]></category>
		<category><![CDATA[Compatible]]></category>
		<category><![CDATA[component]]></category>
		<category><![CDATA[components]]></category>
		<category><![CDATA[computer]]></category>
		<category><![CDATA[congestion]]></category>
		<category><![CDATA[conversion]]></category>
		<category><![CDATA[cost]]></category>
		<category><![CDATA[Datacenter]]></category>
		<category><![CDATA[demo]]></category>
		<category><![CDATA[Developers]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[Digital]]></category>
		<category><![CDATA[distribution]]></category>
		<category><![CDATA[ecosystem]]></category>
		<category><![CDATA[Encoder]]></category>
		<category><![CDATA[encryption]]></category>
		<category><![CDATA[Expression]]></category>
		<category><![CDATA[extensions]]></category>
		<category><![CDATA[features]]></category>
		<category><![CDATA[Individualization]]></category>
		<category><![CDATA[innovation]]></category>
		<category><![CDATA[Integration]]></category>
		<category><![CDATA[Learn]]></category>
		<category><![CDATA[leverage]]></category>
		<category><![CDATA[libraries]]></category>
		<category><![CDATA[Live]]></category>
		<category><![CDATA[Management]]></category>
		<category><![CDATA[Manager]]></category>
		<category><![CDATA[measurement]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[Migration]]></category>
		<category><![CDATA[Monetize]]></category>
		<category><![CDATA[Mono]]></category>
		<category><![CDATA[Motion]]></category>
		<category><![CDATA[Motor]]></category>
		<category><![CDATA[Movie]]></category>
		<category><![CDATA[Multicast]]></category>
		<category><![CDATA[navigation]]></category>
		<category><![CDATA[needs]]></category>
		<category><![CDATA[norm]]></category>
		<category><![CDATA[Novell]]></category>
		<category><![CDATA[Online]]></category>
		<category><![CDATA[options]]></category>
		<category><![CDATA[organizations]]></category>
		<category><![CDATA[Overview]]></category>
		<category><![CDATA[owners]]></category>
		<category><![CDATA[Pack]]></category>
		<category><![CDATA[partners]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[photo]]></category>
		<category><![CDATA[Picture]]></category>
		<category><![CDATA[pipeline]]></category>
		<category><![CDATA[platforms]]></category>
		<category><![CDATA[Play]]></category>
		<category><![CDATA[playback]]></category>
		<category><![CDATA[player]]></category>
		<category><![CDATA[players]]></category>
		<category><![CDATA[Playlists]]></category>
		<category><![CDATA[PlayReady]]></category>
		<category><![CDATA[processor]]></category>
		<category><![CDATA[Providers]]></category>
		<category><![CDATA[QUMU]]></category>
		<category><![CDATA[RTMP]]></category>
		<category><![CDATA[scenarios]]></category>
		<category><![CDATA[Services]]></category>
		<category><![CDATA[Smooth]]></category>
		<category><![CDATA[SMPTE]]></category>
		<category><![CDATA[Standard]]></category>
		<category><![CDATA[Studio]]></category>
		<category><![CDATA[subscriptions]]></category>
		<category><![CDATA[Support]]></category>
		<category><![CDATA[supports]]></category>
		<category><![CDATA[talent]]></category>
		<category><![CDATA[technique]]></category>
		<category><![CDATA[techniques]]></category>
		<category><![CDATA[technologies]]></category>
		<category><![CDATA[Television]]></category>
		<category><![CDATA[template]]></category>
		<category><![CDATA[templates]]></category>
		<category><![CDATA[tools]]></category>
		<category><![CDATA[Toyota]]></category>
		<category><![CDATA[Trailer]]></category>
		<category><![CDATA[Video]]></category>
		<category><![CDATA[Visual]]></category>
		<category><![CDATA[XAML]]></category>

		<guid isPermaLink="false">http://dcarr.wordpress.com/2009/07/25/silverlight_3_digital_media_complete_information_media_platform/</guid>
		<description><![CDATA[Silverlight 3 is an amazing release but perhaps mostly for digital media. Here is the full explanation of what is new as well as our commentary on what we are using in our new Silverlight 3 Media Platform. The demo which shows off most of below (and much more including deep zoom) check out the Movie Trailer sample of our platform. This platform can be used by anyone as a site template for media, a personal app, and is fully customizable either as Expression Encoder 3 templates (no support for 2) or controls with template parts/skin exposed customizations just like Microsoft controls.<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=1472&subd=dcarr&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>Silverlight 3 is an amazing release but perhaps mostly for digital media. Here is the full explanation of what is new as well as our commentary on what we are using in our new Silverlight 3 Media Platform.</p>
<p>The demo which shows off most of below (and much more including deep zoom) check out the Movie Trailer sample of our platform. This platform can be used by anyone as a site template for media, a personal app, and is fully customizable either as Expression Encoder 3 templates (no support for 2) or controls with template parts/skin exposed customizations just like Microsoft controls.</p>
<p><strong><code><div id="x-video-0" class="video-player">
<embed id="video0" src="http://v.wordpress.com/wp-content/plugins/video/flvplayer.swf?ver=1.18&#038;guid=B04BewKm&#038;width=510&#038;height=382&#038;locksize=no&#038;qc_publisherId=p-18-mFEk4J448M" type="application/x-shockwave-flash" width="510" height="382" seamlesstabbing="true" allowfullscreen="true" allowscriptaccess="always" overstretch="true"" title="tangent.ux Silverlight 3 Media Platform"></embed>
</div></code></strong></p>
<p align="right">
<p align="right"><a href="http://www.tangentux.com/">http://www.tangentux.com/</a></p>
<ul>
<li>
<h6>True HD video</h6>
</li>
<li>
<h6>Smooth Streaming</h6>
</li>
<li>
<h6>Go out of browser</h6>
</li>
<li>
<h6>Mac, Windows, and Linux</h6>
</li>
<li>
<h6>Millions of skilled developers to help you</h6>
</li>
<li>
<h6>Seamless Designer-Developer workflow</h6>
</li>
<li>
<h6>Monetize your assets</h6>
</li>
<li>
<h6>Silverlight DRM, Powered by PlayReady</h6>
</li>
<li>
<h6>Compatible with Windows Media DRM 10</h6>
</li>
<li>
<h6>Third Party DRM Providers</h6>
</li>
<li>
<h6>Advertising</h6>
</li>
<li>
<h6>Lower delivery costs</h6>
</li>
<li>
<h6>Internet Information Services (IIS) 7.0 Media Services</h6>
</li>
<li>
<h6>Windows Media Services 2008</h6>
</li>
<li>
<h6>Multicast Support for Silverlight</h6>
</li>
</ul>
<p><a href="http://www.tangentux.com/"></a></p>
<h4>True HD video</h4>
<p>Customers can enjoy 720/1080p true HD-quality video using H.264 (MP4/F4V) or WMV/VC-1. Use your existing Windows Media library or add support for third-party codecs.</p>
<p>Silverlight 3 now supports H.264 natively for playback of MP4 or F4V files. Silverlight also supports Windows Media Video (WMV) 9, which is Microsoft&#8217;s implementation of the Society of Motion Picture and Television Engineers (SMPTE) VC-1 codec standard. In addition to WMA and WMA Pro audio codecs, Silverlight supports MP3 audio and with Silverlight 3 supports MP4 standard AAC audio.</p>
<p>With Silverlight 3 it’s easy to add in support for managed codecs. Developers can deliver non-native Silverlight codecs via an application, and using the new Raw AV pipeline audio or video is then rendered in Silverlight.</p>
<p>Leveraging graphics processor unit (GPU) hardware acceleration, Silverlight experiences can now be delivered in true full-screen HD (720p+). The GPU can be used for windowed or full-screen video scaling enabling smoother playback.</p>
<p>Silverlight&#8217;s support for VC-1 and legacy Windows Media Video formats means that existing WMV content libraries are Silverlight-ready. Video encoded for Silverlight can be simultaneously delivered to other Windows Media compatible players on a variety of platforms and devices.</p>
<h4><a name="smooth"></a>Smooth Streaming</h4>
<p>Extend viewing times using Smooth Streaming. Adjust the quality in real-time based upon the consumer’s changing bandwidth and CPU conditions. Get minimal buffering and quick start-up time using HTTP-based adaptive streaming.</p>
<p>Smooth Streaming is a new extension for Internet Information Services (IIS) 7.0 Media Services, enabling adaptive streaming of media to Silverlight clients via HTTP.</p>
<p>Smooth Streaming dynamically detects and seamlessly switches, in real time, the video quality of a media file that a Silverlight player receives based on local bandwidth and CPU conditions. Consumers with high bandwidth connections can experience HD quality streaming while others with lower bandwidth speeds receive the appropriate stream for their connectivity, allowing consumers across the board to enjoy a compelling, uninterrupted streaming experience which leads to extended audience engagement.</p>
<p>Media companies can boost advertising and subscription revenues by using true HD (720p+) video with uninterrupted delivery to extend viewing times. By using Smooth Streaming, leverage the massive scale of existing HTTP infrastructure. Proprietary streaming networks have much fewer resources than HTTP and network congestion can limit access to popular content.</p>
<p>Live Smooth Streaming (in-beta) also enables PVR-style access and navigation to live video streams. Join events in progress and quickly seek to the beginning, rewind the highlights and enjoy the Silverlight experience in your own way.</p>
<h4><a name="goout"></a>Go out of browser</h4>
<p>Play video whether you are connected via the Web or not. Save content locally for disconnected scenarios and update when you connect.</p>
<h4><a name="macwindow"></a>Mac, Windows, and Linux</h4>
<p>When you create applications for Silverlight you’re actually creating one application that will run equally on Internet Explorer, Firefox and Safari on Windows, Mac and Linux. Silverlight on different platforms and browsers has exactly the same functionality, ensuring the same experience for all your users. Microsoft is working with Novell to offer Silverlight support for the Linux platform. The Mono Project is an open-source initiative hosted at <a href="http://www.mono-project.com/Moonlight">http://www.mono-project.com/Moonlight</a>. This is available for all major Linux distributions. Moonlight 2.0 supports C# and other Dynamic Languages, and includes controls, layout and media.</p>
<h4><a name="millions"></a>Millions of skilled developers to help you</h4>
<p>Tap into the talent pool of six million .NET developers to find the expertise you need. A vibrant ecosystem means it’s easy to find partners and pre-built components.</p>
<h4><a name="seamless"></a>Seamless Designer-Developer workflow</h4>
<p>Accelerate time to market as designers collaborate with developers using the integration between Expression Studio’s creative tools and the Visual Studio family of development tools.</p>
<p>Talk to anyone building interactive applications, and they will tell you about the promise and the frustration of user experience design. Concepts that look great in photo editing tools rarely lend themselves well to actual implementation, while tools that mash together designer and developer disciplines often fall short. In organizations lucky enough to have dedicated designers, they are often forced to spend more time on programming than on actual design. While the integration of developer and designer disciplines is increasing, it is hardly the norm. This is why Microsoft® Expression® Studio was created.</p>
<p>Whether developing applications for the desktop or the Web, the Expression products will allow designers to fully engage with developers to finally bridge the gap in the designer/developer workflow. This will bring together the best minds in design and development to create applications and sites with a focus on great User Experience (UX).</p>
<p>Expression Blend shares project format, XAML, and .NET development with Visual Studio for Designer-Developer workflow; and has added support for Silverlight. This means that the designer can work on the same project as the developer, and thus requires no re-writing of code or use of exporters or clunky add-ins. It also means that developer practices can be applied to the UI mark-up, such as diff’ing and source control.</p>
<h4><a name="monetize"></a>Monetize your assets</h4>
<p>Silverlight offers a choice of content protection techniques for subscriptions: End-user authentication, SSL, Web playlists, Silverlight DRM, and Windows Media DRM.</p>
<p>With the explosive growth in streaming online video and rich internet experiences, it’s critical to ensure your content and your business models are secure. The new peaks in online video audiences not only create a great opportunity to explore new revenue opportunities, but to also expose the challenges in managing and protecting valuable media assets. A variety of content protection schemes, including Digital Rights Management (DRM); end-user authentication and authorization; Web Playlists; and SSL ensure that content owners can fully monetize and protect their media assets.</p>
<h4><a name="drm"></a>Silverlight DRM, Powered by PlayReady</h4>
<p>Silverlight DRM, Powered by PlayReady is a content encryption technology designed and optimized to enable key Silverlight online content distribution scenarios including live streaming, on-demand streaming, progressive download, and adaptive streaming (e.g., IIS7 Smooth Streaming). Unlike simple stream or link encryption technologies (e.g., Adobe’s RTMP/e), Silverlight DRM, encrypts the video and audio in a secure wrapper ensuring content, including advertising, stays protected from server to Silverlight plug-in until it is decompressed during playback.</p>
<p>Silverlight DRM is a small, cross-platform version of the PlayReady client used exclusively by the Silverlight Web browser plug-in. Analogous to other online content services, a Silverlight service that offers protected content uses the PlayReady Server SDK (or alternatively, the WM Rights Manager 10.1 SDK) to first package (encrypt) the Windows Media Audio (WMA) and Windows Media Video (WMV) content. When a consumer then wants to play that content a license is requested and obtained from a license acquisition server that uses the PlayReady Server SDK.</p>
<p>The Silverlight plug-in includes an individualized PlayReady client acquired from an online service, hosted by Microsoft. Individualization binds the run-time client to the computer on which the client was initially installed. Every end-user is given an individualized Playready component and different certified license keys. This significantly reduces the danger of global breaks. If a specific version of a PlayReady client becomes compromised, it can be barred from acquiring licenses for new digital media files unless the latest version of the PlayReady client is downloaded that is robust against the circumvention.</p>
<h4><a name="compatible-drm"></a>Compatible with Windows Media DRM 10</h4>
<p>Silverlight DRM allows content owners to deliver their protected content using either legacy WMDRM10 or new PlayReady encryption. This enables content owners to deliver existing libraries of WMDRM10 content to Silverlight without having to re-encrypt anything and means that the same protected content can be played back in both Silverlight and Windows Media based-clients.</p>
<h4><a name="third-party-drm"></a>Third Party DRM Providers</h4>
<p>With the extensibility and openness of Silverlight, third-parties are able to build content protection solutions, extending customer choice and opening up infrastructure options.</p>
<p>SKY player in Silverlight using Silverlight DRM, Powered by PlayReady</p>
<h4><a name="instream"></a>Advertising</h4>
<p>Silverlight, approved by the Interactive Advertising Bureau (IAB), supports all leading advertising scenarios, including linear pre-rolls, post-rolls, interstitials as well as non-linear tickers, bugs and transparent overlays.</p>
<p>As the market for online advertising continues to grow, the technology powering rich media-based ads needs to be up for the challenge. Complex business needs and creative capabilities demand more than simple animation and basic tagging – which is where Silverlight comes in. Silverlight enables lightning-fast development through familiar markup and controls based on XML that, combined with integrated productivity tools such as Expression Studio and Visual Studio, helps designers and developers work better together and push the limits of interactive innovation.</p>
<p>When designers and developers work together to bring advertising ideas to life, campaigns can be more nimble, more powerful and more effective. Silverlight enables agencies and advertisers to create, launch, measure, and quickly respond to online advertising campaigns through powerful controls and fully integrated tools.</p>
<p>Benefits of Silverlight for Rich Media and In-stream Advertising</p>
<ul>
<li><strong>User Engagement </strong><br />
Silverlight powers the most compelling media experiences on the Web for rich media and in-stream advertising, offering the most effective engagement and conversion opportunities for advertisers</li>
<li><strong>Discoverability </strong><br />
Silverlight is the most discoverable rich media ad platform with superior SEO capabilities</li>
<li><strong>Analytics </strong><br />
Silverlight supports robust and complex online advertising reporting and analytics to enable effective campaign response and measurement</li>
</ul>
<p>Online campaigns created with Silverlight can be more engaging, discoverable, and accountable than with other technologies</p>
<h4>Lower delivery costs</h4>
<p>Leverage existing HTTP infrastructure and improve delivery over proprietary streaming servers. Use multicast for Intranet-based executive broadcasts and online training.</p>
<p>Windows Server helps content providers realize new levels of reliability and scalability, all with lower-cost content delivery. Windows Server represents a significant competitive edge when delivering streaming media and/or applications cross-platform and cross-device, and is already in use by most major broadcasters around the world. Windows Server now powers HTTP-based adaptive streaming via Smooth Streaming.</p>
<h4><a name="iis"></a>Internet Information Services (IIS) 7.0 Media Services</h4>
<p>IIS Media Services is the new name (previously IIS Media Pack) for the media-relevant extensions for IIS. With IIS Media Services, Microsoft is offering an integrated media delivery platform for customers interested in delivering media over HTTP-based adaptive streaming, a new hybrid technique for content delivery. IIS Media Services provides an easy to deploy and manage set of capabilities for companies interested in taking advantage of the inherent scale and availability advantages that come with using standards-based HTTP as a media delivery protocol.</p>
<p>IIS Media Services provides the fundamental features of a proprietary streaming solution: bit rate throttling, secure playlists and logging capabilities that are required for cost effectively delivering, measuring and monetizing media content. On top of these basic media delivery features, IIS Media Services offers enhanced media delivery capabilities such as on-demand and live adaptive streaming (Smooth Streaming) which makes true HD (720p+) media experiences practical as well as real-time logging and analytics capabilities for measuring and maximizing return on your media investment.</p>
<h4><a name="wms"></a>Windows Media Services 2008</h4>
<p>Windows Media Services, like all of Windows Server 2008, is significantly more secure, reliable, and robust — and it is already considered by many customers to be the best in the market for live and n-demand streaming delivery using “traditional” streaming. The latest improvements provide twice the scalability over Windows Media Services 9.0.</p>
<p>In addition to its proven scalability and reliability, Windows Media Services now supports a Server Core installation, enabling reduced footprints for fixed-function streaming server scenarios, offering embedded appliance-like performance. Additionally, a cache/proxy plug-in is built in, making it easier to configure WMS for edge network enterprise and Internet topologies. Many features of Windows Media Services that were previously available only on Windows Server Enterprise and Datacenter are now available on Windows Server Standard, and all Standard features are now also available on Windows Web Server 2008. This makes the power of Windows Media Services 2008 available to a broader set of users at a lower cost.</p>
<h4><a name="multicast"></a>Multicast Support for Silverlight</h4>
<p>Windows Media Services, together with Silverlight and a third-party open-source plug-in from QUMU, can support multicast-enabled scenarios for executive broadcasts and training scenarios behind the firewall.</p>
<br />Posted in Adobe Video Formats, Art and Animation, C# 3.0 Enhancements, Digital Media, HD Video, Industry News, Live Smooth Streaming, PlugIns &amp; Extensibility (MEF), SilverLight, silverlight 3, Smooth Streaming, Software Design, Software Futures, Technology, Tips and Tricks Tagged: acceleration, acquisition, adaptive, adobe, advantage, agencies, Analytics, animation, audiences, Audio, authentication, authorization, bandwidth, Blend, bridge, broadcasters, browser, Bureau, code, codecs, Compatible, component, components, computer, congestion, conversion, cost, Datacenter, demo, Developers, development, Digital, distribution, ecosystem, Encoder, encryption, Expression, extensions, features, Individualization, innovation, Integration, Learn, leverage, libraries, Live, Management, Manager, measurement, Microsoft, Migration, Monetize, Mono, Motion, Motor, Movie, Multicast, navigation, needs, norm, Novell, Online, options, organizations, Overview, owners, Pack, partners, performance, photo, Picture, pipeline, platforms, Play, playback, player, players, Playlists, PlayReady, processor, Providers, QUMU, RTMP, scenarios, Services, Smooth, SMPTE, Standard, Studio, subscriptions, Support, supports, talent, technique, techniques, technologies, Technology, Television, template, templates, tools, Toyota, Trailer, Video, Visual, XAML <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/dcarr.wordpress.com/1472/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/dcarr.wordpress.com/1472/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/dcarr.wordpress.com/1472/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/dcarr.wordpress.com/1472/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/dcarr.wordpress.com/1472/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/dcarr.wordpress.com/1472/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/dcarr.wordpress.com/1472/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/dcarr.wordpress.com/1472/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/dcarr.wordpress.com/1472/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/dcarr.wordpress.com/1472/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=1472&subd=dcarr&ref=&feed=1" /><div><a href="http://team.pushbomb.com/2009/07/24/silverlight_3_digital_media_complete_information_media_platform/"><img alt="tangent.ux Silverlight 3 Media Platform" src="http://cdn.videos.wordpress.com/B04BewKm/silverlightmedia_std.original.jpg" width="160" height="120" /></a></div>]]></content:encoded>
			<wfw:commentRss>http://team.pushbomb.com/2009/07/24/silverlight_3_digital_media_complete_information_media_platform/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	<enclosure url="http://cdn.videos.wordpress.com/B04BewKm/silverlightmedia_std.mp4" length="9577472" type="video/mp4" />

		<media:content url="http://1.gravatar.com/avatar/7b572cbcda5a17fe984e7dd1ddc9c3d6?s=96&#38;d=&#38;r=PG" medium="image">
			<media:title type="html">pushbomb</media:title>
		</media:content>

		<media:group>
			<media:content url="http://cdn.videos.wordpress.com/B04BewKm/silverlightmedia_std.mp4" fileSize="9577472" type="video/mp4" medium="video" isDefault="true" duration="94" width="400" height="300" />

			<media:content url="http://cdn.videos.wordpress.com/B04BewKm/silverlightmedia_fmt1.ogv" fileSize="9577472" type="video/ogg" medium="video" isDefault="false" duration="94" width="400" height="300" />

			<media:rating scheme="urn:mpaa">g</media:rating>
			<media:title type="plain">tangent.ux Silverlight 3 Media Platform</media:title>
			<media:description type="plain">Watch the power of deep zoom when combined with the most demanding video. Normally you&#039;d be waiting and waiting. Finally now this is delivered at the speed of thought via the cloud (we support Amazon , Google, Azure, etc.)</media:description>
			<media:thumbnail url="http://cdn.videos.wordpress.com/B04BewKm/silverlightmedia_std.original.jpg" width="256" height="192" />
			<media:player url="http://v.wordpress.com/B04BewKm" width="400" height="300" />
		</media:group>
	</item>
		<item>
		<title>JetBrains Resharper 4.5 is out</title>
		<link>http://team.pushbomb.com/2009/04/16/resharper_4_5_rocks_for_dot_net_c_sharp_silverlight_devs/</link>
		<comments>http://team.pushbomb.com/2009/04/16/resharper_4_5_rocks_for_dot_net_c_sharp_silverlight_devs/#comments</comments>
		<pubDate>Fri, 17 Apr 2009 02:12:43 +0000</pubDate>
		<dc:creator>Damon Wilder Carr</dc:creator>
				<category><![CDATA[C# 3.0 Enhancements]]></category>
		<category><![CDATA[C# 3.0 for Internal DSL]]></category>
		<category><![CDATA[Cannot live Without]]></category>
		<category><![CDATA[Functional Programming]]></category>
		<category><![CDATA[Industry News]]></category>
		<category><![CDATA[Linq]]></category>
		<category><![CDATA[Siverlight]]></category>
		<category><![CDATA[Software Design]]></category>
		<category><![CDATA[Software Futures]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Tips and Tricks]]></category>
		<category><![CDATA[Visual Studio 2010]]></category>
		<category><![CDATA[Windows Presentation Foundation]]></category>
		<category><![CDATA[concepts implemented]]></category>
		<category><![CDATA[resharper]]></category>
		<category><![CDATA[software as strategic]]></category>
		<category><![CDATA[.NET 3.5. software craftsman]]></category>
		<category><![CDATA[best addin]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Must-Have]]></category>
		<category><![CDATA[Refactoring]]></category>
		<category><![CDATA[Resharper]]></category>
		<category><![CDATA[SilverLight]]></category>
		<category><![CDATA[Visual Studio 2008]]></category>

		<guid isPermaLink="false">http://dcarr.wordpress.com/2009/04/16/resharper_4_5_rocks_for_dot_net_c_sharp_silverlight_devs/</guid>
		<description><![CDATA[9 our of 10 studies prove: Resharper make your your hair grow back, your dog come home (yes even if he died), your wife will love you again and your kids will listen to you.<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=1339&subd=dcarr&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p align="center">&#160;</p>
<p align="center"><a href="http://www.domaindotnet.com/resharper/whatsnew45.html" target="_blank">Click Here</a> to Watch What’s New </p>
<h5>9 our of 10 studies prove: Resharper make your your hair grow back, your dog come home (yes even if he died), your wife will love you again and your kids will listen to you.</h5>
<p>OK perhaps it is not a country music song played backwards. </p>
<blockquote><p>BUT your nuts to even think about wasting all that time not using it. For someone who knows it is people not tools that always win, this is my only exception in 20 years that I will stand behind.</p>
</blockquote>
<p>&#160;</p>
<p>Why stare at a keyboard for hours wondering how to navigate a nasty tangled refactoring you know you must do when you can do the right thing AND make the 5:30 train.</p>
<p>Me? I hit the shift-ctrl-space repeatedly and am shocked when nothing happens. Then I install it and life is good again.</p>
<h4>ReSharper 4.5 Released</h4>
<p>April 8, 2009</p>
<h6>In This Issue</h6>
<p><a href="http://www.jetbrains.com/news/dotnet/news.html#rs45Intro">Introduction</a>     <br /><a href="http://www.jetbrains.com/news/dotnet/news.html#rs45-1">Performance and Memory Usage Improvements</a>     <br /><a href="http://www.jetbrains.com/news/dotnet/news.html#rs45-2">Solution-Wide Code Inspections</a></p>
<p><a href="http://www.jetbrains.com/news/dotnet/news.html#rs45-3">VB9 Support</a>     <br /><a href="http://www.jetbrains.com/news/dotnet/news.html#rs45-4">Extended Naming Style Configuration</a>     <br /><a href="http://www.jetbrains.com/news/dotnet/news.html#rs45-5">Other Enhancements</a></p>
<h5>Introduction</h5>
<p><b>ReSharper 4.5</b> is finally out, so your next productivity upgrade is just a mouse click away!</p>
<p>As announced, the new version features major improvements in performance and memory usage. After all, what is a productivity tool for if not for being agile, robust and responsive?</p>
<p>In addition to focusing on performance enhancements, we also added a number of intelligence features and improvements.</p>
<p>We&#8217;ve prepared a short <a href="http://www.jetbrains.com/resharper/documentation/presentation/rs45/whatsnew-rs45.html">Flash movie</a> to introduce the new features in ReSharper 4.5. Get the hang of things in just a few minutes! </p>
<p>For users of older versions we have a ReSharper 3.0 vs. ReSharper 4.5 <a href="http://www.jetbrains.com/resharper/features/resharper3_vs_resharper45.html">Comparison matrix</a>. <a href="http://dcarr.files.wordpress.com/2009/04/image.png"><img style="display:inline;border-width:0;margin:2px 0;" title="image" border="0" alt="image" align="right" src="http://dcarr.files.wordpress.com/2009/04/image-thumb.png?w=243&#038;h=244" width="243" height="244" /></a></p>
<p>However, if you believe a thousand words say more than a picture does, or even a movie, go ahead and read the descriptions below :)</p>
<p>&#160;</p>
<p>&#160;</p>
<p>&#160;</p>
<p>&#160;</p>
<p>&#160;</p>
<p>&#160;</p>
<p align="right"><strong>Alex Morozov      <br /></strong>NET product marketing manager&#160; <br />JetBrains</p>
<h5>Performance and Memory Usage Improvements</h5>
<p>We have managed to make ReSharper load and work faster and more smoothly in general, particularly on big (and we mean BIG) solutions:</p>
<ul>
<li>Wall-time measurements of solution loading show 20 to 40 percent acceleration until the solution is ready for code editing. </li>
<li>Web site loading time has also been reduced by a third. </li>
<li>For instance, a certain mixed-language solution consisting of about 15 thousand classes now takes only 70 seconds to load, and this includes making every ReSharper feature available. </li>
</ul>
<p>The list of significantly accelerated operations includes:</p>
<ul>
<li>renaming symbols </li>
<li>finding commonly used symbols </li>
<li>creating symbols from usage </li>
<li>analyzing large XAML files. </li>
</ul>
<p>We&#8217;ve also cut down the volume of memory resources required to analyze jumbo autogenerated code files, which should especially benefit those who work with ASP.NET and LINQ to SQL. </p>
<h5>Solution-Wide Code Inspections</h5>
<p>To enable you to detect unused non-private members on the fly, we have enlisted the help of our ever-improving solution-wide analysis. We have introduced a set of specialized code inspections that only work when you let ReSharper analyze your whole solution. They help you discover:</p>
<ul>
<li>Unused non-private declarations </li>
<li>Unused return values of non-private methods </li>
<li>Unaccessed non-private fields </li>
<li>Unused parameters in non-private members </li>
<li>Abstract or virtual events that are never invoked </li>
<li>Unassigned fields </li>
<li>Members and types that can be made internal instead of public </li>
</ul>
<p>Look for these inspections in your code and on the Marker Bar, highlighted as warnings or suggestions. In addition, new code annotations are available that you can use to mark certain unused non-private types and members to prevent ReSharper from fussing about them.</p>
<h5>VB9 Support – We can forgive this transgression (Damon)</h5>
<p> Visual Basic .NET developers can now benefit from VB9 language support that includes implicitly typed local variables, object initializers, anonymous types, extension methods, lambda expressions, partial methods, and embedded XML. VB9 support is all around you, courtesy of new context actions, code completion, refactorings, and Parameter Info, among other supporting features.<br />
<h5>Extended Naming Style Configuration</h5>
<p>Now you can define custom naming style settings for different languages and symbols including:</p>
<ul>
<li>types </li>
<li>namespaces </li>
<li>interfaces </li>
<li>parameters </li>
<li>method properties and events </li>
<li>static and instance fields, etc. </li>
</ul>
<p>For every kind of symbol, you can configure one of five casing options, prefixes and suffixes, variations for different access rights, abbreviations to preserve, or enable naming inspections. As a result, you can precisely align the way ReSharper completes and generates code with your specific coding guidelines.</p>
<h5>Other Enhancements</h5>
<ul>
<li><b>Go to Implementation</b> &#8211; This new navigation feature lets you jump from usage of a base type or member to any of its end implementations, bypassing intermediate steps in the inheritance chain. </li>
<li><b>New and Improved Refactorings</b> &#8211; ReSharper 4.5 has added Inline Field to its family of Inline refactorings. Rename refactoring now provides name completion, and some of the other refactorings were thoroughly refactored themselves, to make them perform faster. </li>
<li><b>Native MSTest Support</b> &#8211; Initially available through VstsUnit Plugin and then Gallio, MSTest support has finally made its way to being provided natively in ReSharper, on par with nUnit. </li>
<li><b>Wider Cross-Language Capabilities</b> &#8211; Quick-fixes and context actions work better in many cross-language scenarios: for example, you can extend a control written in VB.NET+XAML by choosing &quot;create from usage&quot; right from a C# usage. Add increased coverage for XAML and ASP.NET, and you get a substantial package of improvements. </li>
<li><b>Smoother Language and Framework Support</b> &#8211; Following the tradition of ReSharper 4.1, we have improved compatibility with F#, Compact Framework, Silverlight 2, and other languages and tools. </li>
</ul>
<p>Grab your all-new productivity &#8211; download ReSharper 4.5 now at <a href="http://www.jetbrains.com/resharper/download/index.html">http://www.jetbrains.com/resharper/download</a>. </p>
<p>ReSharper 4.5 is provided as a free upgrade from ReSharper 4.0. If you own an older version, please contact us to check your upgrade availability at <a href="mailto:sales@jetbrains.com">sales@jetbrains.com</a>. </p>
<p>&#160;</p>
<h4>JetBrains Team</h4>
<ul>
<li>
<p><a href="http://www.jetbrains.com/company/people/Anchipolevsky_Sergey.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Sergey_Anchipolevsky_small.gif" />Sergey           <br />Anchipolevsky</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Alshannikov_Igor.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Alshannikov_Igor_small.gif" />Igor           <br />Alshannikov</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Anisimov_Alexander.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Anisimov_Alexander_small.gif" />Alexander           <br />Anisimov</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Avdeev_Dmitry.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Avdeev_Dmitry_small.gif" />Dmitry           <br />Avdeev</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Baranov_Sergey.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Sergey_Baranov_small.gif" />Sergey           <br />Baranov</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Belyaev_Yury.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Yury_Belyaev_small.gif" />Yury           <br />Belyaev</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Belyaeva_Natalia.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Natalia_Belyaeva_small.gif" />Natalia           <br />Belyaeva</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Bukreeva_Elena.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Bukreeva_Elena_small.gif" />Elena           <br />Bukreeva</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Bulenkov_Konstantin.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Bulenkov_Konstantin_small.gif" />Bulenkov           <br />Konstantin</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Charif_Jana.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Jana_Charif_small.gif" />Jana           <br />Charif</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Chashnikov_Nikolay.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Nikolay_Chashnikov_small.gif" />Nikolay           <br />Chashnikov</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Alexander_Chernikov.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/soon.gif" />Alexander           <br />Chernikov</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Chernyatchik_Roman.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Roman_Chernyatchik_small.gif" />Roman           <br />Chernyatchik</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Coox_Sergey.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Coox_Sergey_small.gif" />Sergey           <br />Coox</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Dmitriev_Sergey.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Sergey_Dmitriev_small.gif" />Sergey           <br />Dmitriev</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Dumov_Ilia.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Ilia_Dumov_small.gif" />Ilia           <br />Dumov</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Falk_Kirill.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Kirill_Falk_small.gif" />Kirill           <br />Falk</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Gerasimov_Michael.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Michael_Gerasimov_small.gif" />Michael           <br />Gerasimov</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Golovachev_Sergey.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Sergey_Golovachev_small.gif" />Sergey           <br />Golovachev</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Gopachenko_Alexey.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Alexey_Gopachenko_small.gif" />Alexey           <br />Gopachenko</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Gromov_Peter.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Gromov_Peter_small.gif" />Peter           <br />Gromov</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Michaela_Hroncova.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Michaela_Hroncova_small.gif" />Michaela           <br />Hroncová</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Jemerov_Dmitry.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Dmitry_Jemerov_small.gif" />Dmitry           <br />Jemerov</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Khalusova_Maria.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Khalusova_Maria_small.gif" />Maria           <br />Khalusova</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Kipiatkov_Valentin.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Valentin_Kipiatkov_small.gif" />Valentin           <br />Kipiatkov</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Konopko_Cyril.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Konopko_Kirill_small.gif" />Cyril           <br />Konopko</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Kozlova_Anna.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/soon.gif" />Anna           <br />Kozlova</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Kropotov_Mikhail.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Mikhail_Kropotov_small.gif" />Mikhail           <br />Kropotov</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Kudelevsky_Eugene.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Kudelevsky_Eugene_small.gif" />Eugene           <br />Kudelevsky</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Kudravtsev_Alexey.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Alexey_Kudravtsev_small.gif" />Alexey           <br />Kudravtsev</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Lobacheva_Olga.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Lobacheva_Olga_small.gif" />Olga           <br />Lobacheva</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Lukianov_Vyacheslav.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Vyacheslav_Lukianov_small.gif" />Vyacheslav           <br />Lukianov</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Makeev_Anton.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Anton_Makeev_small.gif" />Anton           <br />Makeev</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Malishev_Egor.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Malishev_Egor_small.gif" />Egor           <br />Malyshev</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Marakulina_Maria.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Maria_Marakulina_small.gif" />Maria           <br />Marakulina</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Maximov_Kirill.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Kirill_Maximov_small.gif" />Kirill           <br />Maximov</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Maximova_Sasha.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Sasha_Maximova_small.gif" />Sasha           <br />Maximova</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Megorskaya_Irina.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/soon.gif" />Irina           <br />Megorskaya</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Morawiecova_Lucie.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Morawiecova_Lucie_small.gif" />Lucie           <br />Morawiecova</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Morozov_Alexander.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Morozov_Alexander_small.gif" />Alexander           <br />Morozov</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Mossienko_Maxim.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Mossienko_Maxim_small.gif" />Maxim           <br />Mossienko</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Musienko_Ekaterina.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Musienko_Ekaterina_small.gif" />Ekaterina           <br />Musienko</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Oreshnikova_Ann.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Ann_Oreshnikova_small.gif" />Ann           <br />Oreshnikova</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Pasynkov_Eugene.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Eugene_Pasynkov_small.gif" />Eugene           <br />Pasynkov</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Pech_Vaclav.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Vaclav_Pech_small.gif" />Vaclav           <br />Pech</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Pegov_Alexey.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Alexey_Pegov_small.gif" />Alexey           <br />Pegov</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Petrenko_Eugene.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Petrenko_Eugene_small.gif" />Eugene           <br />Petrenko</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Petrovskaya_Irina.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Irina_Petrovskaya_small.gif" />Irina           <br />Petrovskaya</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Pilin_Mikhail.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Mikhail_Pilin_small.gif" />Mikhail           <br />Pilin</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Repina_Julia.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Julia_Repina_small.gif" />Julia           <br />Repina</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Revyakina_Elizaveta.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Elizaveta_Revyakina_small.gif" />Elizaveta           <br />Revyakina</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Ryzhenkov_Ilya.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Ryzhenkov_Ilya_small.gif" />Ilya           <br />Ryzhenkov</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Serebryansky_Andrew.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Serebryansky_Andrew_small.gif" />Andrew           <br />Serebryansky</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Sergey_Ilya.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Sergey_Ilya_small.gif" />Ilya           <br />Sergey</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Shafirov_Maxim.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Maxim_Shafirov_small.gif" />Maxim           <br />Shafirov</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Slavina_Tatiana.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Tatiana_Slavina_small.gif" />Tatiana           <br />Slavina</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Smirnova_Olesya.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Olesya_Smirnova_small.gif" />Olesya           <br />Smirnova</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Solomatov_Konstantin.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Konstantin_Solomatov_small.gif" />Konstantin           <br />Solomatov</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Stepanov_Oleg.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Oleg_Stepanov_small.gif" />Oleg           <br />Stepanov</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Sher_Pavel.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Sher_Pavel_small.gif" />Pavel           <br />Sher</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Shliakhovetskaja_Ekaterina.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Shliakhovetskaja_Ekaterina_small.gif" />Ekaterina           <br />Shliakhovetskaja</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Shpynov_Oleg.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Shpynov_Oleg_small.gif" />Oleg           <br />Shpynov</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Shrago_Gregory.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Shrago_Gregory_small.gif" />Gregory           <br />Shrago</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Toporov_Eugene.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Eugene_Toporov_small.gif" />Eugene           <br />Toporov</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Udov_George.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Udov_George_small.gif" />George           <br />Udov</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Vasiliev_Sergey.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Sergey_Vasiliev_small.gif" />Sergey           <br />Vasiliev</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Yaremych_Natalie.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Natalie_Yaremych_small.gif" />Natalie           <br />Yaremych</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Yarko_Yegor.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Yarko_Yegor_small.gif" />Yegor           <br />Yarko</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Zambalayev_Timur.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Zambalayev_Timur_small.gif" />Timur           <br />Zambalayev</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Zhukov_Sergey.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Sergey_Zhukov_small.gif" />Sergey           <br />Zhukov</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Zhuravlev_Eugene.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Eugene_Zhuravlev_small.gif" />Eugene           <br />Zhuravlev</a></p>
</li>
<li>
<p><a href="http://www.jetbrains.com/company/people/Alexander_Zverev.html"><img alt="photo" src="http://www.jetbrains.com/company/people/photos/Alexander_Zverev_small.gif" />Alexander           <br />Zverev</a></p>
</li>
</ul>
<div class="wlWriterHeaderFooter" style="text-align:right;margin:0;padding:4px 0;"><a href="http://digg.com/submit?url=http%3a%2f%2fdcarr.wordpress.com%2f2009%2f04%2f16%2fresharper_4_5_rocks_for_dot_net_c_sharp_silverlight_devs%2f&amp;title=JetBrains+Resharper+4.5+is+out"><img src="http://digg.com/img/badges/100x20-digg-button.png" width="100" height="20" alt="Digg This" title="Digg This" border="0" style="border:0;" /></a></div>
<br />Posted in C# 3.0 Enhancements, C# 3.0 for Internal DSL, Cannot live Without, concepts implemented, Functional Programming, Industry News, Linq, resharper, Siverlight, software as strategic, Software Design, Software Futures, Technology, Tips and Tricks, Visual Studio 2010, Windows Presentation Foundation Tagged: .NET 3.5. software craftsman, best addin, C#, Must-Have, Refactoring, Resharper, SilverLight, Visual Studio 2008 <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/dcarr.wordpress.com/1339/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/dcarr.wordpress.com/1339/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/dcarr.wordpress.com/1339/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/dcarr.wordpress.com/1339/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/dcarr.wordpress.com/1339/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/dcarr.wordpress.com/1339/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/dcarr.wordpress.com/1339/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/dcarr.wordpress.com/1339/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/dcarr.wordpress.com/1339/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/dcarr.wordpress.com/1339/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=1339&subd=dcarr&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://team.pushbomb.com/2009/04/16/resharper_4_5_rocks_for_dot_net_c_sharp_silverlight_devs/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7b572cbcda5a17fe984e7dd1ddc9c3d6?s=96&#38;d=&#38;r=PG" medium="image">
			<media:title type="html">pushbomb</media:title>
		</media:content>

		<media:content url="http://dcarr.files.wordpress.com/2009/04/image-thumb.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Sergey_Anchipolevsky_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Alshannikov_Igor_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Anisimov_Alexander_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Avdeev_Dmitry_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Sergey_Baranov_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Yury_Belyaev_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Natalia_Belyaeva_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Bukreeva_Elena_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Bulenkov_Konstantin_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Jana_Charif_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Nikolay_Chashnikov_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/soon.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Roman_Chernyatchik_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Coox_Sergey_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Sergey_Dmitriev_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Ilia_Dumov_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Kirill_Falk_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Michael_Gerasimov_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Sergey_Golovachev_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Alexey_Gopachenko_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Gromov_Peter_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Michaela_Hroncova_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Dmitry_Jemerov_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Khalusova_Maria_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Valentin_Kipiatkov_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Konopko_Kirill_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/soon.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Mikhail_Kropotov_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Kudelevsky_Eugene_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Alexey_Kudravtsev_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Lobacheva_Olga_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Vyacheslav_Lukianov_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Anton_Makeev_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Malishev_Egor_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Maria_Marakulina_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Kirill_Maximov_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Sasha_Maximova_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/soon.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Morawiecova_Lucie_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Morozov_Alexander_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Mossienko_Maxim_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Musienko_Ekaterina_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Ann_Oreshnikova_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Eugene_Pasynkov_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Vaclav_Pech_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Alexey_Pegov_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Petrenko_Eugene_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Irina_Petrovskaya_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Mikhail_Pilin_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Julia_Repina_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Elizaveta_Revyakina_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Ryzhenkov_Ilya_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Serebryansky_Andrew_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Sergey_Ilya_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Maxim_Shafirov_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Tatiana_Slavina_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Olesya_Smirnova_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Konstantin_Solomatov_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Oleg_Stepanov_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Sher_Pavel_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Shliakhovetskaja_Ekaterina_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Shpynov_Oleg_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Shrago_Gregory_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Eugene_Toporov_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Udov_George_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Sergey_Vasiliev_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Natalie_Yaremych_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Yarko_Yegor_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Zambalayev_Timur_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Sergey_Zhukov_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Eugene_Zhuravlev_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.com/company/people/photos/Alexander_Zverev_small.gif" medium="image">
			<media:title type="html">photo</media:title>
		</media:content>

		<media:content url="http://digg.com/img/badges/100x20-digg-button.png" medium="image">
			<media:title type="html">Digg This</media:title>
		</media:content>
	</item>
		<item>
		<title>Silverlight 3D for SharePoint MOSS 2007 &#8211; Try it Here Now</title>
		<link>http://team.pushbomb.com/2008/11/19/released-silverlight-3d-for-sharepoint-moss-2007-try-it-here-now/</link>
		<comments>http://team.pushbomb.com/2008/11/19/released-silverlight-3d-for-sharepoint-moss-2007-try-it-here-now/#comments</comments>
		<pubDate>Thu, 20 Nov 2008 04:29:48 +0000</pubDate>
		<dc:creator>Damon Wilder Carr</dc:creator>
				<category><![CDATA[C# 3.0 Enhancements]]></category>
		<category><![CDATA[Siverlight]]></category>
		<category><![CDATA[Software Design]]></category>
		<category><![CDATA[Software Futures]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[sharepoint]]></category>
		<category><![CDATA[software as strategic]]></category>
		<category><![CDATA[3D]]></category>
		<category><![CDATA[animation]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[deepzoom]]></category>
		<category><![CDATA[invention]]></category>
		<category><![CDATA[Linq]]></category>
		<category><![CDATA[SilverLight]]></category>
		<category><![CDATA[SOA]]></category>
		<category><![CDATA[taxonomy]]></category>
		<category><![CDATA[WCF]]></category>

		<guid isPermaLink="false">http://dcarr.wordpress.com/2008/11/19/released-silverlight-3d-for-sharepoint-moss-2007-try-it-here-now/</guid>
		<description><![CDATA[This effort started as an idea on a napkin (how cliché!) into what I hope will see decent use. Long story short, this is an effort to bring RIA to the SharePoint world. But not just RIA style usability, I believe we pushed the envelope even further by incorporating not only DeepZoom for ‘zoom in to the pixel’ resolution, but the 3D extensions not present by default (you have the essentials but only the amazingly talented people behind the Hard Rock Memorabilia site (vertigo) have shown this style of combined zoom/3d that we have seen in any largely deployed sample.<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=1161&subd=dcarr&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p> <br />
 Long story short, this is an effort to bring <a href="http://en.wikipedia.org/wiki/Rich_Internet_application" target="_blank">RIA </a>to the <a href="http://en.wikipedia.org/wiki/Sharepoint_" target="_blank">SharePoint </a>world.</p>
<p> </p>
<p>But not just RIA style <a href="http://en.wikipedia.org/wiki/Usability" target="_blank">usability</a>, I believe we pushed the envelope even further by incorporating not only <a href="http://en.wikipedia.org/wiki/DeepZoom" target="_blank">DeepZoom (SeaDragon) </a>for ‘zoom in to the pixel’ resolution, but the 3D extensions not present by default</p>
<p align="right">(you have the essentials but only the amazingly talented people behind the <a href="http://memorabilia.hardrock.com/" target="_blank">Hard Rock Memorabilia</a> site (vertigo) <a href="http://www.vertigo.com/DeepZoom.aspx" target="_blank">have shown this style of combined zoom/3d</a> that we have seen in any largely deployed sample).</p>
<p align="right"> </p>
<p align="center"><strong><br />
</strong></p>
<p style="text-align:center;"><a href="http://www.domaindotnet.com/ClientBin/DeepZoom3D.html"><img class="aligncenter" style="border-bottom:black 1px solid;border-left:black 1px solid;display:block;border-top:black 1px solid;border-right:black 1px solid;" title="SharepointZoom3d" src="http://dcarr.files.wordpress.com/2008/11/sharepointzoom3d3.png?w=240&#038;h=232" border="0" alt="SharepointZoom3d" width="240" height="232" /></a></p>
<p>Click the image here to launch the <a href="http://en.wikipedia.org/wiki/Silverlight" target="_blank">Silverlight</a> 2.0 cross-platform goodness.</p>
<h4><strong>NOTE: A prize goes to the first person to email us at: </strong><a href="mailto:innovate@domaindotnet.com"><strong>innovate@domaindotnet.com</strong></a><strong> the exact number of seconds it would take to complete the ‘applying attributes’ to the .gif file (you need to see the demo to understand).</strong></h4>
<div id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:1b3d19bf-9da9-439e-8cba-ffcf6c6f54f9" class="wlWriterSmartContent" style="display:inline;float:none;margin:0;padding:0;">Technorati Tags: <a rel="tag" href="http://technorati.com/tags/sharepoint">sharepoint</a>,<a rel="tag" href="http://technorati.com/tags/silverlight">silverlight</a>,<a rel="tag" href="http://technorati.com/tags/deepzoom">deepzoom</a>,<a rel="tag" href="http://technorati.com/tags/SOA">SOA</a>,<a rel="tag" href="http://technorati.com/tags/wcf">wcf</a>,<a rel="tag" href="http://technorati.com/tags/3D">3D</a>,<a rel="tag" href="http://technorati.com/tags/animation">animation</a>,<a rel="tag" href="http://technorati.com/tags/taxonomy">taxonomy</a>,<a rel="tag" href="http://technorati.com/tags/C%23">C#</a>,<a rel="tag" href="http://technorati.com/tags/Linq">Linq</a>,<a rel="tag" href="http://technorati.com/tags/WCF">WCF</a>,<a rel="tag" href="http://technorati.com/tags/invention">invention</a></div>
<p><a title="Silverlight 3D DeepZoom Navigator" href="http://www.domaindotnet.com/ClientBin/DeepZoom3D.html" target="_blank"></a></p>
<div id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:361263a2-257c-4554-b5e0-93c46a88fd08" class="wlWriterSmartContent" style="display:inline;float:none;margin:0;padding:0;">del.icio.us Tags: <a rel="tag" href="http://del.icio.us/popular/sharepoint">sharepoint</a>,<a rel="tag" href="http://del.icio.us/popular/silverlight">silverlight</a>,<a rel="tag" href="http://del.icio.us/popular/deepzoom">deepzoom</a>,<a rel="tag" href="http://del.icio.us/popular/SOA">SOA</a>,<a rel="tag" href="http://del.icio.us/popular/wcf">wcf</a>,<a rel="tag" href="http://del.icio.us/popular/3D">3D</a>,<a rel="tag" href="http://del.icio.us/popular/animation">animation</a>,<a rel="tag" href="http://del.icio.us/popular/taxonomy">taxonomy</a>,<a rel="tag" href="http://del.icio.us/popular/C%23">C#</a>,<a rel="tag" href="http://del.icio.us/popular/Linq">Linq</a>,<a rel="tag" href="http://del.icio.us/popular/WCF">WCF</a>,<a rel="tag" href="http://del.icio.us/popular/invention">invention</a></div>
<h3>Related Posts</h3>
<div class="wlw_related_posts">from tag <a href="http://del.icio.us/damoncarr/deepzoom">deepzoom</a></div>
<ul>
<li><a href="http://www.vertigo.com/deepzoom.aspx">Vertigo: DeepZoom</a></li>
</ul>
<p>from tag <a href="http://del.icio.us/damoncarr/wcf">wcf</a></p>
<ul>
<li><a href="http://www.ayende.com/Blog/archive/2007/06/12/WCF-Windsor-Integration.aspx">WCF Windsor Integration</a></li>
</ul>
<p>from tag <a href="http://del.icio.us/damoncarr/WCF">WCF</a></p>
<ul>
<li><a href="http://damon.agilefactor.com/2007/09/software-as-service-pattern-language.html">Software as a Service &#8211; A Pattern Language Approach</a></li>
</ul>
<p>from tag <a href="http://del.icio.us/damoncarr/silverlight">silverlight</a></p>
<ul>
<li><a href="http://blogs.vertigo.com/personal/willa/Blog/archive/2008/10/14/silverlight-2-birthday-widget-part-ii.aspx">Will’s Blog &#8211; Silverlight 2 Birthday Widget, Part II</a></li>
<li><a href="http://silverlight.net/GetStarted/sl2rc0.aspx">The Official Microsoft Silverlight Site</a></li>
</ul>
<p>from tag <a href="http://del.icio.us/damoncarr/SOA">SOA</a></p>
<ul>
<li><a href="http://www.slideshare.net/domaindotnetteam/advanced-concepts-in-software-as-a-service-service-oriented-architecture-presentation/">Advanced Concepts in Software as a Service / Service Oriented Architecture</a></li>
<li><a href="http://damon.agilefactor.com/2007/10/collision-of-software-project.html">The Collision of Software Project Management and Agile</a></li>
</ul>
<p>from tag <a href="http://del.icio.us/damoncarr/sharepoint">sharepoint</a></p>
<ul>
<li><a href="http://msdn2.microsoft.com/en-us/office/bb251754.aspx">Business Data Catalog</a></li>
<li><a href="http://sharepointrss.com/">SharePoint RSS Alpha</a></li>
<li><a href="http://www.microsoft.com/technet/windowsserver/sharepoint/wssapps/templates/default.mspx">Templates for SharePoint</a></li>
<li><a href="http://msdn2.microsoft.com/en-us/library/ms948927.aspx">Creating a Web Part with Custom Properties</a></li>
<li><a href="http://www.sharepoint-tips.com/2007/05/sharepoint-designer-article-2-creating.html">SharePoint Creating XSLT DataView</a></li>
<li><a href="http://www.codeplex.com/smartpart">SmartPart for SharePoint &#8211; Home</a></li>
<li><a href="http://msdn2.microsoft.com/en-us/library/bb264593.aspx">Windows SharePoint Services 3.0</a></li>
</ul>
<p>from tag <a href="http://del.icio.us/damoncarr/Linq">Linq</a></p>
<ul>
<li><a href="//speeddial/content/speeddial.xul">Speed Dial</a></li>
<li><a href="http://cifactorybuild.stelligent.com/CI%20Factory/default.aspx?_action_ViewBuildReport=true&amp;server=CI+Factory&amp;project=CI+Factory&amp;build=log20070923221806Lbuild.0.9.0.18.xml">CruiseControl.NET</a></li>
<li><a href="http://pragprog.com/">The Pragmatic Bookshelf</a></li>
<li><a href="http://www.streetmap.co.uk/newsearch.srf?mapp=newmap&amp;searchp=newsearch&amp;type=PostCode&amp;name=%s">map</a></li>
<li><a href="https://www.innerworkings.com/promotions/a5a8879b-fb5b-4f66-8182-a14fd63a3d73/msdn-code-gallery-silverlight-2-samples/register">Register &#8211; InnerWorkings</a></li>
</ul>
<br />Posted in C# 3.0 Enhancements, sharepoint, Siverlight, software as strategic, Software Design, Software Futures, Technology Tagged: 3D, animation, C#, deepzoom, invention, Linq, sharepoint, SilverLight, SOA, taxonomy, WCF <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/dcarr.wordpress.com/1161/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/dcarr.wordpress.com/1161/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/dcarr.wordpress.com/1161/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/dcarr.wordpress.com/1161/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/dcarr.wordpress.com/1161/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/dcarr.wordpress.com/1161/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/dcarr.wordpress.com/1161/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/dcarr.wordpress.com/1161/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/dcarr.wordpress.com/1161/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/dcarr.wordpress.com/1161/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=1161&subd=dcarr&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://team.pushbomb.com/2008/11/19/released-silverlight-3d-for-sharepoint-moss-2007-try-it-here-now/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7b572cbcda5a17fe984e7dd1ddc9c3d6?s=96&#38;d=&#38;r=PG" medium="image">
			<media:title type="html">pushbomb</media:title>
		</media:content>

		<media:content url="http://dcarr.files.wordpress.com/2008/11/sharepointzoom3d3.png" medium="image">
			<media:title type="html">SharepointZoom3d</media:title>
		</media:content>
	</item>
		<item>
		<title>SharePoint MOSS 2007 &#8216;DeepZoom 3D&#8217; is Here&#8230;.Click Below&#8230;</title>
		<link>http://team.pushbomb.com/2008/11/19/sharepoint-moss-3d-is-almost-ready-this-was-taken-this-morning/</link>
		<comments>http://team.pushbomb.com/2008/11/19/sharepoint-moss-3d-is-almost-ready-this-was-taken-this-morning/#comments</comments>
		<pubDate>Wed, 19 Nov 2008 15:25:56 +0000</pubDate>
		<dc:creator>Damon Wilder Carr</dc:creator>
				<category><![CDATA[C# 3.0 Enhancements]]></category>
		<category><![CDATA[Framework Design]]></category>
		<category><![CDATA[Industry News]]></category>
		<category><![CDATA[Siverlight]]></category>
		<category><![CDATA[Software Design]]></category>
		<category><![CDATA[Software Futures]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Windows Presentation Foundation]]></category>
		<category><![CDATA[agile practices]]></category>
		<category><![CDATA[concepts implemented]]></category>
		<category><![CDATA[sharepoint]]></category>
		<category><![CDATA[software as strategic]]></category>
		<category><![CDATA[.NET 3.5]]></category>
		<category><![CDATA[3D]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[domain.dot.net]]></category>
		<category><![CDATA[MOSS]]></category>
		<category><![CDATA[Opacity]]></category>
		<category><![CDATA[Perspective]]></category>
		<category><![CDATA[taxonomy]]></category>
		<category><![CDATA[Visualization]]></category>

		<guid isPermaLink="false">http://dcarr.wordpress.com/?p=1111</guid>
		<description><![CDATA[The breakthough for discovering your information in the Sharepoint world is almost here. This image is absolutely real and 100% cross-platform in the browser via Silverlight. None of us have ever seen anything like this. How about you?<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=1111&subd=dcarr&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p style="text-align:center;"> </p>
<p style="text-align:center;"> <span>can </span></p>
<p style="text-align:center;"><span>you</span></p>
<p style="text-align:center;"><span>find</span></p>
<p style="text-align:center;"><span>the</span></p>
<p style="text-align:center;"><span>ghosts?</span></p>
<div id="attachment_1112" class="wp-caption aligncenter" style="width: 250px"><a href="http://www.domaindotnet.com/ClientBin/DeepZoom3D.html"><img class="size-full wp-image-1112 " style="display:inline;border:black 2px solid;margin:0 55px 0 0;" title="sharepoint3d" src="http://dcarr.files.wordpress.com/2008/11/sharepoint3d.png?w=240&#038;h=188" alt="a PowerPoint document in our breakthrough navigation and discovery technology" width="240" height="188" align="left" /></a><p class="wp-caption-text">click me and be prepared</p></div>
<p> </p>
<p style="text-align:center;">Send a screen shot if you find them to : <a href="mailto:innovate@domaindotnet.com">innovate@domaindotnet.com</a> and the best image will recieve some swag! Non-trivial swag as well! </p>
<p style="text-align:center;"> </p>
<p style="text-align:center;"><a title="Full perspective in 3D" href="http://blog.domaindotnet.com/2008/11/07/sharepoint-moss-3d-is-almost-ready-this-was-taken-this-morning/sharepoint3d/"></a></p>
<div class="vcard"><span class="fn n"><span class="given-name">Damon</span> <span class="additional-name">Wilder</span> <span class="given-family">Carr</span> </span></div>
<div class="org">domain.dot.net</div>
<div class="org">team labs</div>
<div><a class="email" href="mailto:damon@domaindotnet.com">damon@domaindotnet.com</a></div>
<div class="adr">
<div class="tel"><a class="htc" href="646.853.3504"></a><a class="htc" href="646.853.3504"></a><a class="htc" href="646.853.3504"><a class="htc" href="646.853.3504">646.853.3504</a></a></div>
<div><a class="url" href="http://www.domaindotnet.com">http://www.domaindotnet.com</a></div>
</div>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<h3>Related Posts</h3>
<div class="wlw_related_posts">from tag <a href="http://del.icio.us/damoncarr/sharepoint">SharePoint</a></div>
<ul>
<li><a href="http://msdn2.microsoft.com/en-us/office/bb251754.aspx">Business Data Catalog</a></li>
<li><a href="http://sharepointrss.com/">SharePoint RSS Alpha</a></li>
<li><a href="http://www.microsoft.com/technet/windowsserver/sharepoint/wssapps/templates/default.mspx">Templates for SharePoint</a></li>
<li><a href="http://msdn2.microsoft.com/en-us/library/ms948927.aspx">Creating a Web Part with Custom Properties</a></li>
<li><a href="http://www.sharepoint-tips.com/2007/05/sharepoint-designer-article-2-creating.html">SharePoint Creating XSLT DataView</a></li>
<li><a href="http://www.codeplex.com/smartpart">SmartPart for SharePoint &#8211; Home</a></li>
<li><a href="http://msdn2.microsoft.com/en-us/library/bb264593.aspx">Windows SharePoint Services 3.0</a></li>
</ul>
<p>from tag <a href="http://del.icio.us/damoncarr/C#">C#</a></p>
<ul>
<li><a href="terms=video&amp;folder=103006&amp;folder=103007&amp;folder=103008&amp;folder=103009&amp;folder=103010&amp;folder=103011&amp;folder=103012&amp;sort=14&amp;queryType=1">Video Favorites</a></li>
<li><a href="http://www.codeplex.com/SharpArchitecture">S#arp Architecture: ASP.NET MVC with NHibernate &#8211; Home</a></li>
<li><a href="http://skillsmatter.com/go/open-source-dot-net">Skills Matter OPEN SOURCE .NET</a></li>
<li><a href="http://www.castleproject.org/">Home :: Castle Project</a></li>
<li><a href="http://blog.domaindotnet.com/2008/08/24/nhibernate-20-gold-released-must-wait-for-linq-to-nhibernate/">NHibernate 2.0 gold Released – Must Wait for ‘Linq to NHibernate’ « ubiquitous fluency</a></li>
</ul>
<p><a href="http://del.icio.us/damoncarr/C#">(more..)</a></p>
<br />Posted in agile practices, C# 3.0 Enhancements, concepts implemented, Framework Design, Industry News, sharepoint, Siverlight, software as strategic, Software Design, Software Futures, Technology, Windows Presentation Foundation Tagged: .NET 3.5, 3D, C#, domain.dot.net, MOSS, Opacity, Perspective, sharepoint, taxonomy, Visualization <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/dcarr.wordpress.com/1111/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/dcarr.wordpress.com/1111/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/dcarr.wordpress.com/1111/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/dcarr.wordpress.com/1111/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/dcarr.wordpress.com/1111/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/dcarr.wordpress.com/1111/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/dcarr.wordpress.com/1111/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/dcarr.wordpress.com/1111/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/dcarr.wordpress.com/1111/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/dcarr.wordpress.com/1111/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=1111&subd=dcarr&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://team.pushbomb.com/2008/11/19/sharepoint-moss-3d-is-almost-ready-this-was-taken-this-morning/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7b572cbcda5a17fe984e7dd1ddc9c3d6?s=96&#38;d=&#38;r=PG" medium="image">
			<media:title type="html">pushbomb</media:title>
		</media:content>

		<media:content url="http://dcarr.files.wordpress.com/2008/11/sharepoint3d.png" medium="image">
			<media:title type="html">sharepoint3d</media:title>
		</media:content>
	</item>
		<item>
		<title>Linq to Gac : Use Linq to Power Query your Gac via this C# Bridge to Fusion</title>
		<link>http://team.pushbomb.com/2008/09/20/fusion_c_sharp_wrapper_for_linq_to_gac_access/</link>
		<comments>http://team.pushbomb.com/2008/09/20/fusion_c_sharp_wrapper_for_linq_to_gac_access/#comments</comments>
		<pubDate>Sun, 21 Sep 2008 00:43:45 +0000</pubDate>
		<dc:creator>Damon Wilder Carr</dc:creator>
				<category><![CDATA[C# 3.0 Enhancements]]></category>
		<category><![CDATA[C# 3.0 for Internal DSL]]></category>
		<category><![CDATA[Framework Design]]></category>
		<category><![CDATA[Generics]]></category>
		<category><![CDATA[Proof Driven Development]]></category>
		<category><![CDATA[Software Design]]></category>
		<category><![CDATA[Software Futures]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[concepts implemented]]></category>
		<category><![CDATA[CSharp]]></category>
		<category><![CDATA[DomainDriven]]></category>
		<category><![CDATA[Fusion]]></category>
		<category><![CDATA[GAC]]></category>
		<category><![CDATA[Global Assembly Cache]]></category>
		<category><![CDATA[IEnumerable]]></category>
		<category><![CDATA[IEnumerator]]></category>
		<category><![CDATA[Internals]]></category>
		<category><![CDATA[Lambada]]></category>
		<category><![CDATA[Linq]]></category>
		<category><![CDATA[Linq to Gac]]></category>
		<category><![CDATA[Linq to Objects]]></category>
		<category><![CDATA[Machine]]></category>
		<category><![CDATA[Registry]]></category>

		<guid isPermaLink="false">http://dcarr.wordpress.com/2008/09/20/fusion_c_sharp_wrapper_for_linq_to_gac_access/</guid>
		<description><![CDATA[Now we attach the Gac Here we provide a full Linq to Objects IEnumerable wrapper over the Fusion API to allow you to have all the power of Linq queries over your entire GAC (as well as most other parts of you computer you can now join on!). This is a post to get you the GAC info now, as many have asked for it (and it might be the most widely used of this work). Things do get fun however when you start joining your GAC with your files with you registry....<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=928&subd=dcarr&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fblog.domaindotnet.com%2f2008%2f09%2f20%2ffusion_c_sharp_wrapper_for_linq_to_gac_access%2f"><img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fblog.domaindotnet.com%2f2008%2f09%2f20%2ffusion_c_sharp_wrapper_for_linq_to_gac_access%2f" border="0" alt="kick it on DotNetKicks.com" /></a></p>
<p><a href="http://digg.com/submit?url=http%3a%2f%2fdcarr.wordpress.com%2f2008%2f09%2f20%2ffusion_c_sharp_wrapper_for_linq_to_gac_access%2f&amp;title=%e2%80%98Linq+to+Gac%e2%80%99+%3a+Use+Linq+to+Power+Query+your+Gac+via+this+C%23+Bridge+to+Fusion"><img style="border-width:0;" title="Digg This" src="http://digg.com/img/badges/100x20-digg-button.png" border="0" alt="Digg This" width="100" /></a></p>
<h4>This post gets you <a href="http://en.wikipedia.org/wiki/Language_Integrated_Query" target="_blank">Linq</a> access to the GAC with no fuss.</h4>
<p>Fusion is wrapped for you so no need to understand the unmanaged stuff unless you want to. Your up and running with GAC as a new Linq to Objects source in minutes.</p>
<h2>The Big Picture of the Project (You can skip to the next section if you just want the GAC code)</h2>
<p>Note: The reason both the Gac and MyEnvironment IEnumerable&lt;T&gt; references below are different? See the reference on the bottom right of the picture into the entry point to all of it (ThisBox)?</p>
<h2>Introduction to the Fusion  IEnumerable Wrapper</h2>
<p>A simple case. I want to know how my GAC is broken into ‘Major Vendors’. We assume this is roughly the first part of the name. (i.e. Microsoft.System = Microsoft).</p>
<p>Oh yeah. Exclude the assemblies that only occur once. We are looking for the larger view here.</p>
<p>Here is an easy solution:</p>
<pre class="code"><span style="font-size:x-small;"><span style="background:black none repeat scroll 0 0;color:white;">        [</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Fact</span></span><span style="font-size:x-small;"><span style="background:black none repeat scroll 0 0;color:white;">]
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public void </span></span><span style="font-size:x-small;"><span style="background:black none repeat scroll 0 0;color:white;">should_show_gac_by_vendor()
        {
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">var </span><span style="background:black none repeat scroll 0 0;color:white;">result = </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">from </span><span style="background:black none repeat scroll 0 0;color:white;">matchedAssembly </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">in </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">ThisBox</span><span style="background:black none repeat scroll 0 0;color:white;">.By&lt;</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">AssemblyDetail</span></span><span style="font-size:x-small;"><span style="background:black none repeat scroll 0 0;color:white;">&gt;()
                         </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">group </span><span style="background:black none repeat scroll 0 0;color:white;">matchedAssembly </span></span><span style="background:black none repeat scroll 0 0;color:#ecc03e;"><span style="font-size:x-small;">by
                             </span></span><span style="font-size:x-small;"><span style="background:black none repeat scroll 0 0;color:white;">matchedAssembly.MajorName
                             </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">into </span></span><span style="font-size:x-small;"><span style="background:black none repeat scroll 0 0;color:white;">grouping
                             </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">where </span></span><span style="font-size:x-small;"><span style="background:black none repeat scroll 0 0;color:white;">grouping.Count() &gt; 1
                             </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">orderby </span><span style="background:black none repeat scroll 0 0;color:white;">grouping.Count() </span></span><span style="background:black none repeat scroll 0 0;color:#ecc03e;"><span style="font-size:x-small;">descending
                             select </span></span><span style="font-size:x-small;"><span style="background:black none repeat scroll 0 0;color:white;">grouping;

            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">var </span></span><span style="font-size:x-small;"><span style="background:black none repeat scroll 0 0;color:white;">TotalSum = result.Sum(ad =&gt; ad.Count());

            </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Console</span><span style="background:black none repeat scroll 0 0;color:white;">.WriteLine(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">"** ASSEMBLIES BY NAME WITH &gt; 1 REGISTERED  = {0} ***"</span></span><span style="font-size:x-small;"><span style="background:black none repeat scroll 0 0;color:white;">, TotalSum);

            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">foreach </span><span style="background:black none repeat scroll 0 0;color:white;">(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">var </span><span style="background:black none repeat scroll 0 0;color:white;">firstGroup </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">in </span></span><span style="font-size:x-small;"><span style="background:black none repeat scroll 0 0;color:white;">result)
            {
                </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">var </span></span><span style="font-size:x-small;"><span style="background:black none repeat scroll 0 0;color:white;">groupCount = firstGroup.Count();
                </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Console</span><span style="background:black none repeat scroll 0 0;color:white;">.WriteLine(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">"Group '{0}' Assemblies={1} Percent={2} Public Keys Used={3}"</span></span><span style="background:black none repeat scroll 0 0;color:white;"><span style="font-size:x-small;">,
                                    firstGroup.Key,
                                    groupCount,
                                    groupCount.ToPctString(TotalSum),
                                    firstGroup.Select(ad =&gt; ad.PublicKey).Distinct().Count()
                                    );
            }
        }</span></span></pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<h2>** ASSEMBLIES BY NAME WITH &gt; 1 REGISTERED  = 664 ***</h2>
<p>Group &#8216;Microsoft&#8217; Assemblies=466 Percent=70.18% Public Keys Used=5<br />
Group &#8216;DevExpress&#8217; Assemblies=73 Percent=10.99% Public Keys Used=2<br />
Group &#8216;System&#8217; Assemblies=71 Percent=10.69% Public Keys Used=4<br />
Group &#8216;Policy&#8217; Assemblies=14 Percent=2.11% Public Keys Used=2<br />
Group &#8216;FSharp&#8217; Assemblies=11 Percent=1.66% Public Keys Used=1<br />
Group &#8216;VLinq&#8217; Assemblies=10 Percent=1.51% Public Keys Used=1<br />
Group &#8216;policy&#8217; Assemblies=6 Percent=0.9% Public Keys Used=2<br />
Group &#8216;PresentationFramework&#8217; Assemblies=5 Percent=0.75% Public Keys Used=1<br />
Group &#8216;mscorcfg&#8217; Assemblies=2 Percent=0.3% Public Keys Used=1<br />
Group &#8216;WebDev&#8217; Assemblies=2 Percent=0.3% Public Keys Used=1<br />
Group &#8216;VSTADTEProvider&#8217; Assemblies=2 Percent=0.3% Public Keys Used=1<br />
Group &#8216;VsWebSite&#8217; Assemblies=2 Percent=0.3% Public Keys Used=1</p>
<p><span style="font-size:x-small;"><span style="font-size:x-small;">Try that with GacUtil (grin)..</span></span></p>
<h2>C# GAC IEnumerable&lt;Assembly&gt; implementation</h2>
<p>Ah yes the GAC Fusion wrapper code.  Thanks to <a href="http://dotnetjunkies.com/WebLog/debasish/" target="_blank">Debasish Bose</a> for his help here.</p>
<h1>C# Fusion Gac Enumerable : <a href="http://blog.domaindotnet.com/">Domain.Dot.Net</a> Team</h1>
<p><a href="http://dcarr.files.wordpress.com/2008/09/classdiagram21.png"><img style="display:inline;border-width:0;" title="ClassDiagram2" src="http://dcarr.files.wordpress.com/2008/09/classdiagram2-thumb1.png?w=684" border="0" alt="ClassDiagram2" width="684" /></a></p>
<pre class="code"><span style="background:black none repeat scroll 0 0;color:white;">    </span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;summary&gt;
    /// </span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">Just to have some room to breath
    </span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;/summary&gt;
    </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public class </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">AssemblyDetail </span><span style="background:black none repeat scroll 0 0;color:white;">: </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">AssemblyDetailBase
    </span><span style="background:black none repeat scroll 0 0;color:white;">{
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public </span><span style="background:black none repeat scroll 0 0;color:white;">AssemblyDetail(</span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IAssemblyName </span><span style="background:black none repeat scroll 0 0;color:white;">currentAssembly) : </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">base</span><span style="background:black none repeat scroll 0 0;color:white;">(currentAssembly) {}

        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public override </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">String </span><span style="background:black none repeat scroll 0 0;color:white;">FullName
        {
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">get
            </span><span style="background:black none repeat scroll 0 0;color:white;">{
                </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">return </span><span style="background:black none repeat scroll 0 0;color:white;">_fullName;
            }
        }
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public override string </span><span style="background:black none repeat scroll 0 0;color:white;">Version
        {
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">get
            </span><span style="background:black none repeat scroll 0 0;color:white;">{
                </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">return </span><span style="background:black none repeat scroll 0 0;color:white;">_versionString;
            }
        }
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public override int </span><span style="background:black none repeat scroll 0 0;color:white;">Major
        {
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">get
            </span><span style="background:black none repeat scroll 0 0;color:white;">{
                </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">return </span><span style="background:black none repeat scroll 0 0;color:white;">VersionComponent(0);
            }
        }
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public override int </span><span style="background:black none repeat scroll 0 0;color:white;">Minor
        {
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">get
            </span><span style="background:black none repeat scroll 0 0;color:white;">{
                </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">return </span><span style="background:black none repeat scroll 0 0;color:white;">VersionComponent(1);
            }
        }
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public override int </span><span style="background:black none repeat scroll 0 0;color:white;">Revision
        {
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">get
            </span><span style="background:black none repeat scroll 0 0;color:white;">{
                </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">return </span><span style="background:black none repeat scroll 0 0;color:white;">VersionComponent(2);
            }
        }
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public override int </span><span style="background:black none repeat scroll 0 0;color:white;">Build
        {
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">get
            </span><span style="background:black none repeat scroll 0 0;color:white;">{
                </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">return </span><span style="background:black none repeat scroll 0 0;color:white;">VersionComponent(3);
            }
        }

        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public override string </span><span style="background:black none repeat scroll 0 0;color:white;">PublicKey
        {
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">get
            </span><span style="background:black none repeat scroll 0 0;color:white;">{
                </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">return </span><span style="background:black none repeat scroll 0 0;color:white;">_pkey;
            }
        }
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public override string </span><span style="background:black none repeat scroll 0 0;color:white;">MajorName
        {
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">get
            </span><span style="background:black none repeat scroll 0 0;color:white;">{
                </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">return </span><span style="background:black none repeat scroll 0 0;color:white;">_majorName;
            }
        }
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">String </span><span style="background:black none repeat scroll 0 0;color:white;">Name
        {
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">get
            </span><span style="background:black none repeat scroll 0 0;color:white;">{
                </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">return </span><span style="background:black none repeat scroll 0 0;color:white;">_fullName;
            }
        }

        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">int </span><span style="background:black none repeat scroll 0 0;color:white;">VersionComponent(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">int </span><span style="background:black none repeat scroll 0 0;color:white;">position)
        {
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">return </span><span style="background:black none repeat scroll 0 0;color:white;">_version.Length &lt;= position + 1
                           ? </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Convert</span><span style="background:black none repeat scroll 0 0;color:white;">.ToInt32(_version[position]) : 0;
        }
    }</span></pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<pre class="code"><span style="background:black none repeat scroll 0 0;color:white;">    #region

    </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">using </span><span style="background:black none repeat scroll 0 0;color:white;">System;
    </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">using </span><span style="background:black none repeat scroll 0 0;color:white;">System.Runtime.InteropServices;

    #endregion

    </span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;summary&gt;
    /// </span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">Alpha - Comment and Add Regressions
    </span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;/summary&gt;
    </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public abstract class </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">AssemblyDetailBase
    </span><span style="background:black none repeat scroll 0 0;color:white;">{
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">protected string </span><span style="background:black none repeat scroll 0 0;color:white;">_fullName;
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">protected string </span><span style="background:black none repeat scroll 0 0;color:white;">_majorName;
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">string</span><span style="background:black none repeat scroll 0 0;color:white;">[] _nameSplit;
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">protected string </span><span style="background:black none repeat scroll 0 0;color:white;">_pkey;
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">string </span><span style="background:black none repeat scroll 0 0;color:white;">_rawname;
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">protected string</span><span style="background:black none repeat scroll 0 0;color:white;">[] _version;
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">protected string </span><span style="background:black none repeat scroll 0 0;color:white;">_versionString;

        </span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;summary&gt;
        /// </span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">Initializes a new instance of the </span><span style="background:black none repeat scroll 0 0;color:gray;">&lt;see cref=</span><span style="background:black none repeat scroll 0 0;color:#9feca5;">"AssemblyDetailBase"</span><span style="background:black none repeat scroll 0 0;color:gray;">/&gt; </span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">class.
        </span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;/summary&gt;
        /// &lt;param name=</span><span style="background:black none repeat scroll 0 0;color:#9feca5;">"Current"</span><span style="background:black none repeat scroll 0 0;color:gray;">&gt;</span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">The current.</span><span style="background:black none repeat scroll 0 0;color:gray;">&lt;/param&gt;
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">protected </span><span style="background:black none repeat scroll 0 0;color:white;">AssemblyDetailBase(</span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IAssemblyName </span><span style="background:black none repeat scroll 0 0;color:white;">Current)
        {
            ExtractParsedDetail(Current);
        }

        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public abstract string </span><span style="background:black none repeat scroll 0 0;color:white;">FullName
        {
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">get</span><span style="background:black none repeat scroll 0 0;color:white;">;
        }
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public abstract string </span><span style="background:black none repeat scroll 0 0;color:white;">Version
        {
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">get</span><span style="background:black none repeat scroll 0 0;color:white;">;
        }
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public abstract int </span><span style="background:black none repeat scroll 0 0;color:white;">Major
        {
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">get</span><span style="background:black none repeat scroll 0 0;color:white;">;
        }
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public abstract int </span><span style="background:black none repeat scroll 0 0;color:white;">Minor
        {
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">get</span><span style="background:black none repeat scroll 0 0;color:white;">;
        }
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public abstract int </span><span style="background:black none repeat scroll 0 0;color:white;">Revision
        {
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">get</span><span style="background:black none repeat scroll 0 0;color:white;">;
        }
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public abstract int </span><span style="background:black none repeat scroll 0 0;color:white;">Build
        {
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">get</span><span style="background:black none repeat scroll 0 0;color:white;">;
        }
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public abstract string </span><span style="background:black none repeat scroll 0 0;color:white;">PublicKey
        {
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">get</span><span style="background:black none repeat scroll 0 0;color:white;">;
        }
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public abstract string </span><span style="background:black none repeat scroll 0 0;color:white;">MajorName
        {
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">get</span><span style="background:black none repeat scroll 0 0;color:white;">;
        }

        </span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;summary&gt;
        /// </span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">I do not want to persist the IAssemblyName
        </span><span style="background:black none repeat scroll 0 0;color:gray;">/// </span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">as it might introduce a COM reference when
        </span><span style="background:black none repeat scroll 0 0;color:gray;">/// </span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">we just can extract what we need and let it
        </span><span style="background:black none repeat scroll 0 0;color:gray;">/// </span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">pass away into whatever...
        </span><span style="background:black none repeat scroll 0 0;color:gray;">///
        /// </span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">Extracts the parsed detail.
        </span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;/summary&gt;
        /// &lt;param name=</span><span style="background:black none repeat scroll 0 0;color:#9feca5;">"Current"</span><span style="background:black none repeat scroll 0 0;color:gray;">&gt;</span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">The current.</span><span style="background:black none repeat scroll 0 0;color:gray;">&lt;/param&gt;
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">void </span><span style="background:black none repeat scroll 0 0;color:white;">ExtractParsedDetail(</span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IAssemblyName </span><span style="background:black none repeat scroll 0 0;color:white;">Current)
        {
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">const int </span><span style="background:black none repeat scroll 0 0;color:white;">stongKeyPosition = 3;
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">const int </span><span style="background:black none repeat scroll 0 0;color:white;">versionPosition = 1;

            </span><span style="background:black none repeat scroll 0 0;color:#bcf5c9;">// Main Work Happens Here
            </span><span style="background:black none repeat scroll 0 0;color:white;">_fullName = GetDisplayName(Current);

            </span><span style="background:black none repeat scroll 0 0;color:#bcf5c9;">// Simply parse the ", " that seperates the full
            // name
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">var </span><span style="background:black none repeat scroll 0 0;color:white;">_parsedDetails = _fullName.Split(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">new</span><span style="background:black none repeat scroll 0 0;color:white;">[]
                                                 {
                                                         </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">", "
                                                 </span><span style="background:black none repeat scroll 0 0;color:white;">}, </span><span style="background:black none repeat scroll 0 0;color:#b8a223;">StringSplitOptions</span><span style="background:black none repeat scroll 0 0;color:white;">.RemoveEmptyEntries);

            ExtractVersionInfo(versionPosition, _parsedDetails);
            ExtractAddition(stongKeyPosition, _parsedDetails);
        }

        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">void </span><span style="background:black none repeat scroll 0 0;color:white;">ExtractAddition(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">int </span><span style="background:black none repeat scroll 0 0;color:white;">stongKeyPosition, </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">string</span><span style="background:black none repeat scroll 0 0;color:white;">[] parsedDetails)
        {
            _pkey = parsedDetails[stongKeyPosition];
            _rawname = parsedDetails[0].Trim();
            _nameSplit = _rawname.Split(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">'.'</span><span style="background:black none repeat scroll 0 0;color:white;">);
            _majorName = _nameSplit[0].Trim();
        }

        </span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;summary&gt;
        /// </span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">Gets the display name from the unmanaged pointer
        </span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;/summary&gt;
        /// &lt;param name=</span><span style="background:black none repeat scroll 0 0;color:#9feca5;">"aName"</span><span style="background:black none repeat scroll 0 0;color:gray;">&gt;</span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">A name.</span><span style="background:black none repeat scroll 0 0;color:gray;">&lt;/param&gt;
        /// &lt;returns&gt;&lt;/returns&gt;
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">static string </span><span style="background:black none repeat scroll 0 0;color:white;">GetDisplayName(</span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IAssemblyName </span><span style="background:black none repeat scroll 0 0;color:white;">aName)
        {
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">var </span><span style="background:black none repeat scroll 0 0;color:white;">displayFlags = </span><span style="background:black none repeat scroll 0 0;color:#b8a223;">AssemblyNameDisplayFlags</span><span style="background:black none repeat scroll 0 0;color:white;">.ALL;

            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">uint </span><span style="background:black none repeat scroll 0 0;color:white;">uiLen = 0;

            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">string </span><span style="background:black none repeat scroll 0 0;color:white;">_displayAssemblyName = </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">null</span><span style="background:black none repeat scroll 0 0;color:white;">;

            </span><span style="background:black none repeat scroll 0 0;color:#bcf5c9;">// Get the length
            </span><span style="background:black none repeat scroll 0 0;color:white;">aName.GetDisplayName(</span><span style="background:black none repeat scroll 0 0;color:#76a38a;">IntPtr</span><span style="background:black none repeat scroll 0 0;color:white;">.Zero, </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">ref </span><span style="background:black none repeat scroll 0 0;color:white;">uiLen, (</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">uint</span><span style="background:black none repeat scroll 0 0;color:white;">) displayFlags);

            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">if </span><span style="background:black none repeat scroll 0 0;color:white;">(uiLen &gt; 0)
            {
                </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">var </span><span style="background:black none repeat scroll 0 0;color:white;">byteBuffer = </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">new byte</span><span style="background:black none repeat scroll 0 0;color:white;">[(uiLen + 1)*2];
                </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">unsafe </span><span style="background:black none repeat scroll 0 0;color:#bcf5c9;">//turn on sunsafe in project properties
                </span><span style="background:black none repeat scroll 0 0;color:white;">{
                    </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">fixed </span><span style="background:black none repeat scroll 0 0;color:white;">(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">byte</span><span style="background:black none repeat scroll 0 0;color:white;">* numRef1 = byteBuffer)
                    {
                        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">var </span><span style="background:black none repeat scroll 0 0;color:white;">ptr1 = </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">new </span><span style="background:black none repeat scroll 0 0;color:#76a38a;">IntPtr</span><span style="background:black none repeat scroll 0 0;color:white;">(numRef1);
                        aName.GetDisplayName(ptr1, </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">ref </span><span style="background:black none repeat scroll 0 0;color:white;">uiLen, (</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">uint</span><span style="background:black none repeat scroll 0 0;color:white;">) displayFlags);
                        _displayAssemblyName = </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Marshal</span><span style="background:black none repeat scroll 0 0;color:white;">.PtrToStringUni(ptr1);
                    }
                }
            }

            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">return </span><span style="background:black none repeat scroll 0 0;color:white;">_displayAssemblyName;
        }

        </span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;summary&gt;
        /// </span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">Extracts the version info.
        </span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;/summary&gt;
        /// &lt;param name=</span><span style="background:black none repeat scroll 0 0;color:#9feca5;">"versionPosition"</span><span style="background:black none repeat scroll 0 0;color:gray;">&gt;</span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">The version position.</span><span style="background:black none repeat scroll 0 0;color:gray;">&lt;/param&gt;
        /// &lt;param name=</span><span style="background:black none repeat scroll 0 0;color:#9feca5;">"parsedDetails"</span><span style="background:black none repeat scroll 0 0;color:gray;">&gt;</span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">The parsed details.</span><span style="background:black none repeat scroll 0 0;color:gray;">&lt;/param&gt;
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">void </span><span style="background:black none repeat scroll 0 0;color:white;">ExtractVersionInfo(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">int </span><span style="background:black none repeat scroll 0 0;color:white;">versionPosition, </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">string</span><span style="background:black none repeat scroll 0 0;color:white;">[] parsedDetails)
        {
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">var </span><span style="background:black none repeat scroll 0 0;color:white;">versionLiteral = parsedDetails[versionPosition];
            _versionString = ToCoreVersion(versionPosition, versionLiteral);
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">if </span><span style="background:black none repeat scroll 0 0;color:white;">(_versionString != </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">String</span><span style="background:black none repeat scroll 0 0;color:white;">.Empty)
                _version = _versionString.Split(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">'.'</span><span style="background:black none repeat scroll 0 0;color:white;">);
        }

        </span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;summary&gt;
        /// </span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">Gets the nice clean x.x.x.x string
        </span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;/summary&gt;
        /// &lt;param name=</span><span style="background:black none repeat scroll 0 0;color:#9feca5;">"versionPosition"</span><span style="background:black none repeat scroll 0 0;color:gray;">&gt;</span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">The version position.</span><span style="background:black none repeat scroll 0 0;color:gray;">&lt;/param&gt;
        /// &lt;param name=</span><span style="background:black none repeat scroll 0 0;color:#9feca5;">"versionLiteral"</span><span style="background:black none repeat scroll 0 0;color:gray;">&gt;</span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">The version literal.</span><span style="background:black none repeat scroll 0 0;color:gray;">&lt;/param&gt;
        /// &lt;returns&gt;&lt;/returns&gt;
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">static string </span><span style="background:black none repeat scroll 0 0;color:white;">ToCoreVersion(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">int </span><span style="background:black none repeat scroll 0 0;color:white;">versionPosition, </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">string </span><span style="background:black none repeat scroll 0 0;color:white;">versionLiteral)
        {
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">var </span><span style="background:black none repeat scroll 0 0;color:white;">returnVal = </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">String</span><span style="background:black none repeat scroll 0 0;color:white;">.Empty;

            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">if </span><span style="background:black none repeat scroll 0 0;color:white;">(!</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">String</span><span style="background:black none repeat scroll 0 0;color:white;">.IsNullOrEmpty(versionLiteral))
            {
                </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">var </span><span style="background:black none repeat scroll 0 0;color:white;">_indexOf = versionLiteral.IndexOf(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">"="</span><span style="background:black none repeat scroll 0 0;color:white;">);

                </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">if </span><span style="background:black none repeat scroll 0 0;color:white;">(_indexOf != -1)
                    returnVal = versionLiteral.Substring(_indexOf + versionPosition);
            }

            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">return </span><span style="background:black none repeat scroll 0 0;color:white;">returnVal;
        }
    }</span></pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<pre class="code"><span style="background:black none repeat scroll 0 0;color:white;">#region

</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">using </span><span style="background:black none repeat scroll 0 0;color:white;">System.Runtime.InteropServices;

#endregion

</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">class </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">GAC
</span><span style="background:black none repeat scroll 0 0;color:white;">{
    GAC() {}

    [</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">DllImport</span><span style="background:black none repeat scroll 0 0;color:white;">(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">"Fusion.dll"</span><span style="background:black none repeat scroll 0 0;color:white;">, CharSet = </span><span style="background:black none repeat scroll 0 0;color:#b8a223;">CharSet</span><span style="background:black none repeat scroll 0 0;color:white;">.Auto)]
    </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public static extern int </span><span style="background:black none repeat scroll 0 0;color:white;">CreateAssemblyEnum(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">out </span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IAssemblyEnum </span><span style="background:black none repeat scroll 0 0;color:white;">ppEnum,
                                                </span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IApplicationContext </span><span style="background:black none repeat scroll 0 0;color:white;">pAppCtx,
                                                </span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IAssemblyName </span><span style="background:black none repeat scroll 0 0;color:white;">pName, </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">uint </span><span style="background:black none repeat scroll 0 0;color:white;">dwFlags,
                                                </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">int </span><span style="background:black none repeat scroll 0 0;color:white;">pvReserved);
}</span></pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<pre class="code"><span style="background:black none repeat scroll 0 0;color:white;">#region

</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">using </span><span style="background:black none repeat scroll 0 0;color:white;">System.Runtime.InteropServices;
</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">using </span><span style="background:black none repeat scroll 0 0;color:white;">System.Security;

#endregion

[</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">SuppressUnmanagedCodeSecurity</span><span style="background:black none repeat scroll 0 0;color:white;">, </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">ComImport</span><span style="background:black none repeat scroll 0 0;color:white;">, </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Guid</span><span style="background:black none repeat scroll 0 0;color:white;">(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">"7C23FF90-33AF-11D3-95DA-00A024A85B51"</span><span style="background:black none repeat scroll 0 0;color:white;">),
 </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">InterfaceType</span><span style="background:black none repeat scroll 0 0;color:white;">(1)]
</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public interface </span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IApplicationContext
</span><span style="background:black none repeat scroll 0 0;color:white;">{
    </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">void </span><span style="background:black none repeat scroll 0 0;color:white;">SetContextNameObject(</span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IAssemblyName </span><span style="background:black none repeat scroll 0 0;color:white;">pName);

    </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">void </span><span style="background:black none repeat scroll 0 0;color:white;">GetContextNameObject([</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Out</span><span style="background:black none repeat scroll 0 0;color:white;">] </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">out </span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IAssemblyName </span><span style="background:black none repeat scroll 0 0;color:white;">ppName);

    </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">void </span><span style="background:black none repeat scroll 0 0;color:white;">Set([</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">MarshalAs</span><span style="background:black none repeat scroll 0 0;color:white;">(</span><span style="background:black none repeat scroll 0 0;color:#b8a223;">UnmanagedType</span><span style="background:black none repeat scroll 0 0;color:white;">.LPWStr)] </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">string </span><span style="background:black none repeat scroll 0 0;color:white;">szName, </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">int </span><span style="background:black none repeat scroll 0 0;color:white;">pvValue, </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">uint </span><span style="background:black none repeat scroll 0 0;color:white;">cbValue,
             </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">uint </span><span style="background:black none repeat scroll 0 0;color:white;">dwFlags);

    </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">void </span><span style="background:black none repeat scroll 0 0;color:white;">Get([</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">MarshalAs</span><span style="background:black none repeat scroll 0 0;color:white;">(</span><span style="background:black none repeat scroll 0 0;color:#b8a223;">UnmanagedType</span><span style="background:black none repeat scroll 0 0;color:white;">.LPWStr)] </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">string </span><span style="background:black none repeat scroll 0 0;color:white;">szName, [</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Out</span><span style="background:black none repeat scroll 0 0;color:white;">] </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">out int </span><span style="background:black none repeat scroll 0 0;color:white;">pvValue,
             </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">ref uint </span><span style="background:black none repeat scroll 0 0;color:white;">pcbValue, </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">uint </span><span style="background:black none repeat scroll 0 0;color:white;">dwFlags);

    </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">void </span><span style="background:black none repeat scroll 0 0;color:white;">GetDynamicDirectory([</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Out</span><span style="background:black none repeat scroll 0 0;color:white;">] </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">out int </span><span style="background:black none repeat scroll 0 0;color:white;">wzDynamicDir, </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">ref uint </span><span style="background:black none repeat scroll 0 0;color:white;">pdwSize);
}</span></pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<pre class="code"><span style="background:black none repeat scroll 0 0;color:white;">#region

</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">using </span><span style="background:black none repeat scroll 0 0;color:white;">System;
</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">using </span><span style="background:black none repeat scroll 0 0;color:white;">System.Runtime.InteropServices;
</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">using </span><span style="background:black none repeat scroll 0 0;color:white;">System.Security;
</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">using </span><span style="background:black none repeat scroll 0 0;color:white;">System.Text;

#endregion

</span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;summary&gt;
/// </span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">IAssemblyName from Fusion
</span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;/summary&gt;
</span><span style="background:black none repeat scroll 0 0;color:white;">[</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">SuppressUnmanagedCodeSecurity</span><span style="background:black none repeat scroll 0 0;color:white;">, </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">ComImport</span><span style="background:black none repeat scroll 0 0;color:white;">, </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Guid</span><span style="background:black none repeat scroll 0 0;color:white;">(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">"CD193BC0-B4BC-11D2-9833-00C04FC31D2E"</span><span style="background:black none repeat scroll 0 0;color:white;">),
 </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">InterfaceType</span><span style="background:black none repeat scroll 0 0;color:white;">(1)]
</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public interface </span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IAssemblyName
</span><span style="background:black none repeat scroll 0 0;color:white;">{
    [</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">PreserveSig</span><span style="background:black none repeat scroll 0 0;color:white;">]
    </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">int </span><span style="background:black none repeat scroll 0 0;color:white;">SetProperty(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">uint </span><span style="background:black none repeat scroll 0 0;color:white;">PropertyId, </span><span style="background:black none repeat scroll 0 0;color:#76a38a;">IntPtr </span><span style="background:black none repeat scroll 0 0;color:white;">pvProperty, </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">uint </span><span style="background:black none repeat scroll 0 0;color:white;">cbProperty);

    [</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">PreserveSig</span><span style="background:black none repeat scroll 0 0;color:white;">]
    </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">int </span><span style="background:black none repeat scroll 0 0;color:white;">GetProperty(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">uint </span><span style="background:black none repeat scroll 0 0;color:white;">PropertyId, </span><span style="background:black none repeat scroll 0 0;color:#76a38a;">IntPtr </span><span style="background:black none repeat scroll 0 0;color:white;">pvProperty, </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">ref uint </span><span style="background:black none repeat scroll 0 0;color:white;">pcbProperty);

    [</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">PreserveSig</span><span style="background:black none repeat scroll 0 0;color:white;">]
    </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">int </span><span style="background:black none repeat scroll 0 0;color:white;">Finalize();

    [</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">PreserveSig</span><span style="background:black none repeat scroll 0 0;color:white;">]
    </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">int </span><span style="background:black none repeat scroll 0 0;color:white;">GetDisplayName(</span><span style="background:black none repeat scroll 0 0;color:#76a38a;">IntPtr </span><span style="background:black none repeat scroll 0 0;color:white;">szDisplayName, </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">ref uint </span><span style="background:black none repeat scroll 0 0;color:white;">pccDisplayName, </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">uint </span><span style="background:black none repeat scroll 0 0;color:white;">dwDisplayFlags);

    [</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">PreserveSig</span><span style="background:black none repeat scroll 0 0;color:white;">]
    </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">int </span><span style="background:black none repeat scroll 0 0;color:white;">BindToObject(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">object </span><span style="background:black none repeat scroll 0 0;color:white;">refIID, </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">object </span><span style="background:black none repeat scroll 0 0;color:white;">pAsmBindSink,
                     </span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IApplicationContext </span><span style="background:black none repeat scroll 0 0;color:white;">pApplicationContext,
                     [</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">MarshalAs</span><span style="background:black none repeat scroll 0 0;color:white;">(</span><span style="background:black none repeat scroll 0 0;color:#b8a223;">UnmanagedType</span><span style="background:black none repeat scroll 0 0;color:white;">.LPWStr)] </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">string </span><span style="background:black none repeat scroll 0 0;color:white;">szCodeBase, </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">long </span><span style="background:black none repeat scroll 0 0;color:white;">llFlags,
                     </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">int </span><span style="background:black none repeat scroll 0 0;color:white;">pvReserved, </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">uint </span><span style="background:black none repeat scroll 0 0;color:white;">cbReserved, [</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Out</span><span style="background:black none repeat scroll 0 0;color:white;">] </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">out int </span><span style="background:black none repeat scroll 0 0;color:white;">ppv);

    [</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">PreserveSig</span><span style="background:black none repeat scroll 0 0;color:white;">]
    </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">int </span><span style="background:black none repeat scroll 0 0;color:white;">GetName(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">ref uint </span><span style="background:black none repeat scroll 0 0;color:white;">lpcwBuffer,
                [</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Out</span><span style="background:black none repeat scroll 0 0;color:white;">, </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">MarshalAs</span><span style="background:black none repeat scroll 0 0;color:white;">(</span><span style="background:black none repeat scroll 0 0;color:#b8a223;">UnmanagedType</span><span style="background:black none repeat scroll 0 0;color:white;">.LPWStr)] </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">StringBuilder </span><span style="background:black none repeat scroll 0 0;color:white;">pwzName);

    [</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">PreserveSig</span><span style="background:black none repeat scroll 0 0;color:white;">]
    </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">int </span><span style="background:black none repeat scroll 0 0;color:white;">GetVersion([</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Out</span><span style="background:black none repeat scroll 0 0;color:white;">] </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">out uint </span><span style="background:black none repeat scroll 0 0;color:white;">pdwVersionHi, [</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Out</span><span style="background:black none repeat scroll 0 0;color:white;">] </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">out uint </span><span style="background:black none repeat scroll 0 0;color:white;">pdwVersionLow);

    [</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">PreserveSig</span><span style="background:black none repeat scroll 0 0;color:white;">]
    </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">int </span><span style="background:black none repeat scroll 0 0;color:white;">IsEqual(</span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IAssemblyName </span><span style="background:black none repeat scroll 0 0;color:white;">pName, </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">uint </span><span style="background:black none repeat scroll 0 0;color:white;">dwCmpFlags);

    [</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">PreserveSig</span><span style="background:black none repeat scroll 0 0;color:white;">]
    </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">int </span><span style="background:black none repeat scroll 0 0;color:white;">Clone([</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Out</span><span style="background:black none repeat scroll 0 0;color:white;">] </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">out </span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IAssemblyName </span><span style="background:black none repeat scroll 0 0;color:white;">pName);
}</span></pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p><a href="http://11011.net/software/vspaste"></a></p>
<pre class="code"><span style="background:black none repeat scroll 0 0;color:white;">#region

</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">using </span><span style="background:black none repeat scroll 0 0;color:white;">System.Runtime.InteropServices;
</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">using </span><span style="background:black none repeat scroll 0 0;color:white;">System.Security;

#endregion

[</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">SuppressUnmanagedCodeSecurity</span><span style="background:black none repeat scroll 0 0;color:white;">, </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">ComImport</span><span style="background:black none repeat scroll 0 0;color:white;">, </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Guid</span><span style="background:black none repeat scroll 0 0;color:white;">(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">"21B8916C-F28E-11D2-A473-00C04F8EF448"</span><span style="background:black none repeat scroll 0 0;color:white;">),
 </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">InterfaceType</span><span style="background:black none repeat scroll 0 0;color:white;">(1)]
</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">interface </span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IAssemblyEnum
</span><span style="background:black none repeat scroll 0 0;color:white;">{
    [</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">PreserveSig</span><span style="background:black none repeat scroll 0 0;color:white;">]
    </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">int </span><span style="background:black none repeat scroll 0 0;color:white;">GetNextAssembly([</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Out</span><span style="background:black none repeat scroll 0 0;color:white;">] </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">out </span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IApplicationContext </span><span style="background:black none repeat scroll 0 0;color:white;">ppAppCtx,
                        [</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Out</span><span style="background:black none repeat scroll 0 0;color:white;">] </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">out </span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IAssemblyName </span><span style="background:black none repeat scroll 0 0;color:white;">ppName, </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">uint </span><span style="background:black none repeat scroll 0 0;color:white;">dwFlags);

    [</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">PreserveSig</span><span style="background:black none repeat scroll 0 0;color:white;">]
    </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">int </span><span style="background:black none repeat scroll 0 0;color:white;">Reset();

    [</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">PreserveSig</span><span style="background:black none repeat scroll 0 0;color:white;">]
    </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">int </span><span style="background:black none repeat scroll 0 0;color:white;">Clone([</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Out</span><span style="background:black none repeat scroll 0 0;color:white;">] </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">out </span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IAssemblyEnum </span><span style="background:black none repeat scroll 0 0;color:white;">ppEnum);
}</span></pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p><a href="http://11011.net/software/vspaste"></a></p>
<pre class="code"><span style="background:black none repeat scroll 0 0;color:white;">#region

</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">using </span><span style="background:black none repeat scroll 0 0;color:white;">System.Collections;
</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">using </span><span style="background:black none repeat scroll 0 0;color:white;">System.Collections.Generic;
</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">using </span><span style="background:black none repeat scroll 0 0;color:white;">System.Runtime.InteropServices;

#endregion

</span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;summary&gt;
/// </span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">Fairly basic stuff once the
</span><span style="background:black none repeat scroll 0 0;color:gray;">/// </span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">unmanaged stuff is all mapped
</span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;/summary&gt;
</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public class </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">GacEnumerable </span><span style="background:black none repeat scroll 0 0;color:white;">: </span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IEnumerator</span><span style="background:black none repeat scroll 0 0;color:white;">&lt;</span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IAssemblyName</span><span style="background:black none repeat scroll 0 0;color:white;">&gt;, </span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IEnumerable</span><span style="background:black none repeat scroll 0 0;color:white;">&lt;</span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IAssemblyName</span><span style="background:black none repeat scroll 0 0;color:white;">&gt;
{
    </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">readonly </span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IAssemblyEnum </span><span style="background:black none repeat scroll 0 0;color:white;">_enumeration;
    </span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IAssemblyName </span><span style="background:black none repeat scroll 0 0;color:white;">_enumCurrentAssembly;

    GacEnumerable()
    {
        HandleCom(</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">GAC</span><span style="background:black none repeat scroll 0 0;color:white;">.CreateAssemblyEnum(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">out </span><span style="background:black none repeat scroll 0 0;color:white;">_enumeration, </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">null</span><span style="background:black none repeat scroll 0 0;color:white;">, </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">null</span><span style="background:black none repeat scroll 0 0;color:white;">,
                                         (</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">uint</span><span style="background:black none repeat scroll 0 0;color:white;">) </span><span style="background:black none repeat scroll 0 0;color:#b8a223;">AssemblyCacheFlags</span><span style="background:black none repeat scroll 0 0;color:white;">.GAC, 0));
    }

    </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public static </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">GacEnumerable </span><span style="background:black none repeat scroll 0 0;color:white;">New
    {
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">get
        </span><span style="background:black none repeat scroll 0 0;color:white;">{
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">return new </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">GacEnumerable</span><span style="background:black none repeat scroll 0 0;color:white;">();
        }
    }

    #region IEnumerable&lt;IAssemblyName&gt; Members

    </span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;summary&gt;
    /// </span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">Returns an enumerator that iterates through the collection.
    </span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;/summary&gt;
    /// &lt;returns&gt;
    /// </span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">A </span><span style="background:black none repeat scroll 0 0;color:gray;">&lt;see cref=</span><span style="background:black none repeat scroll 0 0;color:#9feca5;">"T:System.Collections.Generic.IEnumerator`1"</span><span style="background:black none repeat scroll 0 0;color:gray;">/&gt; </span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">that can be used to iterate through the collection.
    </span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;/returns&gt;
    </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public </span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IEnumerator</span><span style="background:black none repeat scroll 0 0;color:white;">&lt;</span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IAssemblyName</span><span style="background:black none repeat scroll 0 0;color:white;">&gt; GetEnumerator()
    {
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">return this</span><span style="background:black none repeat scroll 0 0;color:white;">;
    }

    </span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;summary&gt;
    /// </span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">Returns an enumerator that iterates through a collection.
    </span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;/summary&gt;
    /// &lt;returns&gt;
    /// </span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">An </span><span style="background:black none repeat scroll 0 0;color:gray;">&lt;see cref=</span><span style="background:black none repeat scroll 0 0;color:#9feca5;">"T:System.Collections.IEnumerator"</span><span style="background:black none repeat scroll 0 0;color:gray;">/&gt; </span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">object that can be used to iterate through the collection.
    </span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;/returns&gt;
    </span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IEnumerator IEnumerable</span><span style="background:black none repeat scroll 0 0;color:white;">.GetEnumerator()
    {
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">return </span><span style="background:black none repeat scroll 0 0;color:white;">GetEnumerator();
    }

    #endregion

    #region IEnumerator&lt;IAssemblyName&gt; Members

    </span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;summary&gt;
    /// </span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">Advances the enumerator to the next element of the collection.
    </span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;/summary&gt;
    /// &lt;returns&gt;
    /// </span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">true if the enumerator was successfully advanced to the next element; false if the enumerator has passed the end of the collection.
    </span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;/returns&gt;
    /// &lt;exception cref=</span><span style="background:black none repeat scroll 0 0;color:#9feca5;">"T:System.InvalidOperationException"</span><span style="background:black none repeat scroll 0 0;color:gray;">&gt;</span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">The collection was modified after the enumerator was created. </span><span style="background:black none repeat scroll 0 0;color:gray;">&lt;/exception&gt;
    </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">bool </span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IEnumerator</span><span style="background:black none repeat scroll 0 0;color:white;">.MoveNext()
    {
        </span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IApplicationContext </span><span style="background:black none repeat scroll 0 0;color:white;">context1;
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">return </span><span style="background:black none repeat scroll 0 0;color:white;">(0 ==
                _enumeration.GetNextAssembly(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">out </span><span style="background:black none repeat scroll 0 0;color:white;">context1, </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">out </span><span style="background:black none repeat scroll 0 0;color:white;">_enumCurrentAssembly, 0));
    }

    </span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;summary&gt;
    /// </span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">Sets the enumerator to its initial position, which is before the first element in the collection.
    </span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;/summary&gt;
    /// &lt;exception cref=</span><span style="background:black none repeat scroll 0 0;color:#9feca5;">"T:System.InvalidOperationException"</span><span style="background:black none repeat scroll 0 0;color:gray;">&gt;</span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">The collection was modified after the enumerator was created. </span><span style="background:black none repeat scroll 0 0;color:gray;">&lt;/exception&gt;
    </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">void </span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IEnumerator</span><span style="background:black none repeat scroll 0 0;color:white;">.Reset()
    {
        _enumeration.Reset();
    }

    </span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;summary&gt;
    /// </span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">IAssemblyName is a Fusion interface
    </span><span style="background:black none repeat scroll 0 0;color:gray;">/// </span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">Gets the element in the collection at the current position of the enumerator.
    </span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;/summary&gt;
    /// &lt;value&gt;&lt;/value&gt;
    /// &lt;returns&gt;</span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">The element in the collection at the current position of the enumerator.</span><span style="background:black none repeat scroll 0 0;color:gray;">&lt;/returns&gt;
    </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public </span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IAssemblyName </span><span style="background:black none repeat scroll 0 0;color:white;">Current
    {
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">get
        </span><span style="background:black none repeat scroll 0 0;color:white;">{
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">return </span><span style="background:black none repeat scroll 0 0;color:white;">_enumCurrentAssembly;
        }
    }
    </span><span style="background:black none repeat scroll 0 0;color:#bcf5c9;">// Properties
    </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">object </span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IEnumerator</span><span style="background:black none repeat scroll 0 0;color:white;">.Current
    {
        </span><span style="background:black none repeat scroll 0 0;color:#bcf5c9;">// Go to the other darn Current not this one
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">get
        </span><span style="background:black none repeat scroll 0 0;color:white;">{
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">return </span><span style="background:black none repeat scroll 0 0;color:white;">Current;
        }
    }
    </span><span style="background:black none repeat scroll 0 0;color:#bcf5c9;">// Fields
    </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public void </span><span style="background:black none repeat scroll 0 0;color:white;">Dispose()
    {
        _enumCurrentAssembly = </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">null</span><span style="background:black none repeat scroll 0 0;color:white;">;
    }

    #endregion

    </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">internal static void </span><span style="background:black none repeat scroll 0 0;color:white;">HandleCom(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">int </span><span style="background:black none repeat scroll 0 0;color:white;">hResult)
    {
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">if </span><span style="background:black none repeat scroll 0 0;color:white;">(hResult &lt; 0)
            </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Marshal</span><span style="background:black none repeat scroll 0 0;color:white;">.ThrowExceptionForHR(hResult);
    }
}</span></pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p><span style="font-size:x-small;"> </span></p>
<pre class="code"><span style="font-family:Consolas;"><span style="background:black none repeat scroll 0 0;color:white;">[</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Flags</span></span><span style="font-family:Consolas;"><span style="background:black none repeat scroll 0 0;color:white;">]
</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">enum </span></span><span style="background:black none repeat scroll 0 0;color:#b8a223;"><span style="font-size:x-small;font-family:Consolas;">AssemblyCacheFlags
</span></span><span style="background:black none repeat scroll 0 0;color:white;"><span style="font-size:x-small;font-family:Consolas;">{
    NGenCache = 0x1,
    GAC = 0x2,
    DownloadCache = 0x4
}</span></span></pre>
<p><span style="font-size:x-small;"><br />
</span></p>
<pre class="code"><span style="font-family:Consolas;"><span style="background:black none repeat scroll 0 0;color:white;">[</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Flags</span></span><span style="font-family:Consolas;"><span style="background:black none repeat scroll 0 0;color:white;">]
</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public enum </span></span><span style="background:black none repeat scroll 0 0;color:#b8a223;"><span style="font-size:x-small;font-family:Consolas;">AssemblyNameDisplayFlags
</span></span><span style="background:black none repeat scroll 0 0;color:white;"><span style="font-size:x-small;font-family:Consolas;">{
    VERSION = 0x01,
    CULTURE = 0x02,
    PUBLIC_KEY_TOKEN = 0x04,
    PROCESSORARCHITECTURE = 0x20,
    RETARGETABLE = 0x80,
    ALL = VERSION |
        CULTURE | PROCESSORARCHITECTURE |
        PUBLIC_KEY_TOKEN | RETARGETABLE
}</span></span></pre>
<h2>More to Come</h2>
<p>This is the tip of the iceberg so to speak. Here is a test case to show you what this now is doing and perhaps you can give us ideas where to take it. There is a lot of code. Should it be up on CodePlex? Google Code?  Your Environment Variables:</p>
<pre class="code"><span style="background:black none repeat scroll 0 0;color:white;">    <span style="font-size:x-small;font-family:Consolas;">   [</span></span><span style="background:black none repeat scroll 0 0;color:#2b91af;"><span style="font-size:x-small;font-family:Consolas;">Fact</span></span><span style="font-family:Consolas;"><span style="background:black none repeat scroll 0 0;color:white;">]
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public void </span></span><span style="font-family:Consolas;"><span style="background:black none repeat scroll 0 0;color:white;">should_show_my_env()
        {
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">var </span><span style="background:black none repeat scroll 0 0;color:white;">sw = </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Stopwatch</span></span><span style="font-family:Consolas;"><span style="background:black none repeat scroll 0 0;color:white;">.StartNew();
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">var </span><span style="background:black none repeat scroll 0 0;color:white;">dirs = </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">from </span><span style="background:black none repeat scroll 0 0;color:white;">env </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">in </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">ThisBox</span><span style="background:black none repeat scroll 0 0;color:white;">.By&lt;</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">EnvironmentVariable</span></span><span style="font-family:Consolas;"><span style="background:black none repeat scroll 0 0;color:white;">&gt;()
                       </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">select </span></span><span style="font-family:Consolas;"><span style="background:black none repeat scroll 0 0;color:white;">env;
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">foreach </span><span style="background:black none repeat scroll 0 0;color:white;">(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">var </span><span style="background:black none repeat scroll 0 0;color:white;">s </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">in </span></span><span style="font-family:Consolas;"><span style="background:black none repeat scroll 0 0;color:white;">dirs)
            {
                </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Console</span><span style="background:black none repeat scroll 0 0;color:white;">.WriteLine(s.TypeOfEnv + </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">" " </span></span><span style="font-family:Consolas;"><span style="background:black none repeat scroll 0 0;color:white;">+ s.KeyName);
                </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Console</span><span style="background:black none repeat scroll 0 0;color:white;">.WriteLine(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">"  ==&gt;" </span></span><span style="font-family:Consolas;"><span style="background:black none repeat scroll 0 0;color:white;">+ s.Value);
            }
            </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Console</span><span style="background:black none repeat scroll 0 0;color:white;">.WriteLine(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">"Count : " </span></span><span style="font-family:Consolas;"><span style="background:black none repeat scroll 0 0;color:white;">+ dirs.Count());
            </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Console</span><span style="background:black none repeat scroll 0 0;color:white;">.WriteLine(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">"Search Took : " </span><span style="background:black none repeat scroll 0 0;color:white;">+ sw.ElapsedMilliseconds + </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">" ms"</span></span><span style="background:black none repeat scroll 0 0;color:white;"><span style="font-size:x-small;font-family:Consolas;">);
            sw.Stop();
        }</span></span></pre>
<p><span style="font-size:x-small;font-family:Consolas;">Let’s join our GAC with our registry!</span></p>
<p><span style="font-size:x-small;font-family:Consolas;">NOTE: we get 592 hits in 20 or so seconds… </span></p>
<pre class="code"><span style="font-family:Consolas;"><span style="background:black none repeat scroll 0 0;color:white;">        [</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Fact</span></span><span style="font-family:Consolas;"><span style="background:black none repeat scroll 0 0;color:white;">]
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public void </span></span><span style="font-family:Consolas;"><span style="background:black none repeat scroll 0 0;color:white;">should_join_policy_registry_section()
        {
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">var </span><span style="background:black none repeat scroll 0 0;color:white;">sw = </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Stopwatch</span></span><span style="font-family:Consolas;"><span style="background:black none repeat scroll 0 0;color:white;">.StartNew();

            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">var </span><span style="background:black none repeat scroll 0 0;color:white;">result = </span></span><span style="font-family:Consolas;"><span style="background:black none repeat scroll 0 0;color:#ecc03e;">from
                             </span><span style="background:black none repeat scroll 0 0;color:white;">gac </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">in </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">ThisBox</span><span style="background:black none repeat scroll 0 0;color:white;">.By&lt;</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">AssemblyDetail</span></span><span style="background:black none repeat scroll 0 0;color:white;"><span style="font-size:x-small;font-family:Consolas;">&gt;()
                         </span></span><span style="font-family:Consolas;"><span style="background:black none repeat scroll 0 0;color:#ecc03e;">join
                             </span><span style="background:black none repeat scroll 0 0;color:white;">registryKey </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">in </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">ThisBox</span><span style="background:black none repeat scroll 0 0;color:white;">.By&lt;</span><span style="background:black none repeat scroll 0 0;color:#2b91af;">RegistryKey</span></span><span style="font-family:Consolas;"><span style="background:black none repeat scroll 0 0;color:white;">&gt;() 

                         </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">on </span><span style="background:black none repeat scroll 0 0;color:white;">gac.MajorName </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">equals </span></span><span style="background:black none repeat scroll 0 0;color:white;"><span style="font-size:x-small;font-family:Consolas;">registryKey.FirstRegValue()

                         </span></span><span style="background:black none repeat scroll 0 0;color:#ecc03e;"><span style="font-size:x-small;font-family:Consolas;">select new
                                </span></span><span style="font-family:Consolas;"><span style="background:black none repeat scroll 0 0;color:white;">{
                                        gac, RegVal=registryKey.FirstRegValue()
                                };

            </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Console</span><span style="background:black none repeat scroll 0 0;color:white;">.WriteLine(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">"Count : " </span></span><span style="font-family:Consolas;"><span style="background:black none repeat scroll 0 0;color:white;">+ result.Count());
            sw.Stop();
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">foreach </span><span style="background:black none repeat scroll 0 0;color:white;">(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">var </span><span style="background:black none repeat scroll 0 0;color:white;">a </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">in </span></span><span style="font-family:Consolas;"><span style="background:black none repeat scroll 0 0;color:white;">result)
            {
                </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Console</span><span style="background:black none repeat scroll 0 0;color:white;">.WriteLine(a.gac.MajorName + </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">" == " </span></span><span style="font-family:Consolas;"><span style="background:black none repeat scroll 0 0;color:white;">+ a.RegVal);
                </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Console</span><span style="background:black none repeat scroll 0 0;color:white;">.WriteLine(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">" ==&gt;" </span></span><span style="font-family:Consolas;"><span style="background:black none repeat scroll 0 0;color:white;">+ a.gac.FullName);
            }

            </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Console</span><span style="background:black none repeat scroll 0 0;color:white;">.WriteLine(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">"Search Took : " </span><span style="background:black none repeat scroll 0 0;color:white;">+ sw.ElapsedMilliseconds + </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">" ms"</span></span><span style="background:black none repeat scroll 0 0;color:white;"><span style="font-size:x-small;font-family:Consolas;">);
        }</span>
</span></pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<h2>Appendix : A Few Extension Methods we Use<span style="background:black none repeat scroll 0 0;color:white;"> </span></h2>
<pre class="code"><span style="background:black none repeat scroll 0 0;color:white;">  </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">static class </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">LinqProviderTestExtensions
    </span><span style="background:black none repeat scroll 0 0;color:white;">{
        </span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;summary&gt;
        /// </span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">Will perform each action for each
        </span><span style="background:black none repeat scroll 0 0;color:gray;">/// </span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">'row' in the included collection
        </span><span style="background:black none repeat scroll 0 0;color:gray;">/// </span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">Each 'row' is of Type TTreeNode
        </span><span style="background:black none repeat scroll 0 0;color:gray;">/// </span><span style="background:black none repeat scroll 0 0;color:#9ff5fd;">Will typically only be one action
        </span><span style="background:black none repeat scroll 0 0;color:gray;">/// &lt;/summary&gt;
        /// &lt;typeparam name=</span><span style="background:black none repeat scroll 0 0;color:#9feca5;">"T"</span><span style="background:black none repeat scroll 0 0;color:gray;">&gt;&lt;/typeparam&gt;
        /// &lt;param name=</span><span style="background:black none repeat scroll 0 0;color:#9feca5;">"items"</span><span style="background:black none repeat scroll 0 0;color:gray;">&gt;&lt;/param&gt;
        /// &lt;param name=</span><span style="background:black none repeat scroll 0 0;color:#9feca5;">"actions"</span><span style="background:black none repeat scroll 0 0;color:gray;">&gt;&lt;/param&gt;
        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">static internal void </span><span style="background:black none repeat scroll 0 0;color:white;">ForEach&lt;T&gt;(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">this </span><span style="background:black none repeat scroll 0 0;color:#9185fa;">IEnumerable</span><span style="background:black none repeat scroll 0 0;color:white;">&lt;T&gt; items, </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">params </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Action</span><span style="background:black none repeat scroll 0 0;color:white;">&lt;T&gt;[] actions)
        {
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">foreach </span><span style="background:black none repeat scroll 0 0;color:white;">(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">var </span><span style="background:black none repeat scroll 0 0;color:white;">t </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">in </span><span style="background:black none repeat scroll 0 0;color:white;">items)
                </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">foreach </span><span style="background:black none repeat scroll 0 0;color:white;">(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">var </span><span style="background:black none repeat scroll 0 0;color:white;">act </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">in </span><span style="background:black none repeat scroll 0 0;color:white;">actions)
                    act.Invoke(t);
        }

        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public static string </span><span style="background:black none repeat scroll 0 0;color:white;">FirstRegValue(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">this </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">RegistryKey </span><span style="background:black none repeat scroll 0 0;color:white;">registryKey)
        {
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">return </span><span style="background:black none repeat scroll 0 0;color:white;">registryKey.ValueCount &gt; 0
                           ? (</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">string</span><span style="background:black none repeat scroll 0 0;color:white;">) registryKey.GetValueNames().GetValue(0) : </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">String</span><span style="background:black none repeat scroll 0 0;color:white;">.Empty;
        }

        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public static double </span><span style="background:black none repeat scroll 0 0;color:white;">ToPercent(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">this int </span><span style="background:black none repeat scroll 0 0;color:white;">target, </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">int </span><span style="background:black none repeat scroll 0 0;color:white;">total)
        {
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">return </span><span style="background:black none repeat scroll 0 0;color:white;">target.ToPercent((</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">double</span><span style="background:black none repeat scroll 0 0;color:white;">) total);
        }

        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public static </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">String </span><span style="background:black none repeat scroll 0 0;color:white;">ToPctString(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">this int </span><span style="background:black none repeat scroll 0 0;color:white;">target, </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">int </span><span style="background:black none repeat scroll 0 0;color:white;">total)
        {
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">return </span><span style="background:black none repeat scroll 0 0;color:white;">target.ToPercent((</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">double</span><span style="background:black none repeat scroll 0 0;color:white;">) total) + </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">"%"</span><span style="background:black none repeat scroll 0 0;color:white;">;
        }

        </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">public static double </span><span style="background:black none repeat scroll 0 0;color:white;">ToPercent(</span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">this int </span><span style="background:black none repeat scroll 0 0;color:white;">target, </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">double </span><span style="background:black none repeat scroll 0 0;color:white;">total)
        {
            </span><span style="background:black none repeat scroll 0 0;color:#ecc03e;">return </span><span style="background:black none repeat scroll 0 0;color:#2b91af;">Math</span><span style="background:black none repeat scroll 0 0;color:white;">.Round((target/total)*100, 2);
        }
    }</span></pre>
<pre class="code"><span style="background:black none repeat scroll 0 0;color:white;">A huge Thanks:</span></pre>
<pre class="code"><a title="http://dotnetjunkies.com/WebLog/debasish/" href="http://dotnetjunkies.com/WebLog/debasish/" target="_blank">Debasish Bose</a></pre>
<pre class="code">
<div id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:4996f79e-bdd5-4823-85e8-11fd4c706280" class="wlWriterSmartContent" style="display:inline;float:none;margin:0;padding:0;">del.icio.us Tags: <a rel="tag" href="http://del.icio.us/popular/Advanced+C%23">Advanced C#</a>,<a rel="tag" href="http://del.icio.us/popular/C%23+Unmanaged+Wrapper">C# Unmanaged Wrapper</a>,<a rel="tag" href="http://del.icio.us/popular/Fusion">Fusion</a>,<a rel="tag" href="http://del.icio.us/popular/GAC">GAC</a>,<a rel="tag" href="http://del.icio.us/popular/Global+Assembly+Cache">Global Assembly Cache</a>,<a rel="tag" href="http://del.icio.us/popular/IEnumerable">IEnumerable</a>,<a rel="tag" href="http://del.icio.us/popular/IEnumerator">IEnumerator</a>,<a rel="tag" href="http://del.icio.us/popular/Internals">Internals</a>,<a rel="tag" href="http://del.icio.us/popular/Lambada">Lambada</a>,<a rel="tag" href="http://del.icio.us/popular/Linq+to+Gac">Linq to Gac</a>,<a rel="tag" href="http://del.icio.us/popular/Linq+to+Objects">Linq to Objects</a>,<a rel="tag" href="http://del.icio.us/popular/Machine">Machine</a>,<a rel="tag" href="http://del.icio.us/popular/Registry">Registry</a></div>
<div id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:d890b055-0d6b-4680-a4e0-6f7fb6c20546" class="wlWriterSmartContent" style="display:inline;float:none;margin:0;padding:0;">Technorati Tags: <a rel="tag" href="http://technorati.com/tags/Advanced+C%23">Advanced C#</a>,<a rel="tag" href="http://technorati.com/tags/C%23+Unmanaged+Wrapper">C# Unmanaged Wrapper</a>,<a rel="tag" href="http://technorati.com/tags/Fusion">Fusion</a>,<a rel="tag" href="http://technorati.com/tags/GAC">GAC</a>,<a rel="tag" href="http://technorati.com/tags/Global+Assembly+Cache">Global Assembly Cache</a>,<a rel="tag" href="http://technorati.com/tags/IEnumerable">IEnumerable</a>,<a rel="tag" href="http://technorati.com/tags/IEnumerator">IEnumerator</a>,<a rel="tag" href="http://technorati.com/tags/Internals">Internals</a>,<a rel="tag" href="http://technorati.com/tags/Lambada">Lambada</a>,<a rel="tag" href="http://technorati.com/tags/Linq+to+Gac">Linq to Gac</a>,<a rel="tag" href="http://technorati.com/tags/Linq+to+Objects">Linq to Objects</a>,<a rel="tag" href="http://technorati.com/tags/Machine">Machine</a>,<a rel="tag" href="http://technorati.com/tags/Registry">Registry</a></div>
</pre>
<h3>Related Posts</h3>
<div class="wlw_related_posts">from tag <a href="http://del.icio.us/damoncarr/Fusion">Fusion</a></p>
<ul>
<li><a href="http://blog.domaindotnet.com/2008/09/20/fusion_c_sharp_wrapper_for_linq_to_gac_access/">Linq to Gac : Use Linq to Power Query your Gac via this C# Bridge to Fusion « team domain.dot.net</a></li>
</ul>
<p>from tag <a href="http://del.icio.us/damoncarr/Lambada">Lambada</a></p>
<ul>
<li><a href="http://blog.domaindotnet.com/2008/07/24/linq-c-30-enumerable-extension-method-reference/">Linq C# 3.0 Enumerable Extension Method Reference « don’t give up on software just yet</a></li>
</ul>
<p>from tag <a href="http://del.icio.us/damoncarr/Linq">Linq</a></p>
<ul>
<li><a href="http://www.istartedsomething.com/20061029/royale-noir/">Royale Noir: secret XP theme uncovered (download) &#8211; istartedsomething</a></li>
<li><a href="/cifs/opt">linux</a></li>
<li><a href="http://www.google.co.uk/search?hl=en&amp;ie=UTF-8&amp;q=%s&amp;meta=cr%3DcountryUK%7CcountryGB">guk</a></li>
<li><a href="http://msdn2.microsoft.com/en-us/library/ms345135.aspx">Managed Data Access Inside SQL Server with ADO.NET and SQLCLR</a></li>
<li><a href="http://damon.agilefactor.com/feed">where(dev=&gt; Is.Broken(dev)).tryinject(commonsense)</a></li>
<li><a href="http://www.daveandal.net/articles/esbdocs/">Microsoft ESB Guidance (August 2007 CTP Release)</a></li>
<li><a href="http://pinguy.infogami.com/blog/210ee">What to Install After a Fresh XP Install (PinGUY&#8217;s Website)</a></li>
<li><a href="http://evanhoff.com/archive/2007/07/23/39.aspx">NHibernate SysCache Issues &#8211; Solved</a></li>
<li><a href="http://nightweed.com/printableusavotefacts.html">20 Amazing Facts About  Voting in the USA</a></li>
<li><a href="http://cdimage.ubuntu.com/kubuntu-kde4/releases/8.04/release/kubuntu-kde4-8.04.1-desktop-i386.iso">http://cdimage.ubuntu.com/kubuntu-kde4/releases/8.04/release/kubuntu-kde4-8.04.1-desktop-i386.iso</a></li>
<li><a href="http://feeds.feedburner.com/adaptiveblue/feed">BlueBlog</a></li>
<li><a href="http://damoncarr.freepolls.com/cgi-bin/util/site_admin">free Web polls</a></li>
<li><a href="http://code.google.com/">Developer Home &#8211; Google Code</a></li>
<li><a href="http://www.xmllab.net/mvpxml/">Mvp.Xml Library Documentation &#8211; Mvp.Xml.Common Namespace</a></li>
<li><a href="http://www.codeplex.com/esb">patterns &amp; practices Enterprise Service Bus Guidance &#8211; Home</a></li>
<li><a href="http://www.ifcfilms.com/">IFC Entertainment</a></li>
<li><a href="http://www.buildinglink.com/default.asp">BuildingLink</a></li>
<li><a href="http://msdn.microsoft.com/msdnmag/issues/07/02/SQLRegex/default.aspx">SQL Server 2005 Regular Expressions Make Pattern Matching</a></li>
</ul>
<p><a href="http://del.icio.us/damoncarr/Linq">(more..)</a></p>
</div>
<div class="wlWriterHeaderFooter" style="text-align:left;margin:0;padding:4px 0;"><a href="http://digg.com/submit?url=http%3a%2f%2fdcarr.wordpress.com%2f2008%2f09%2f20%2ffusion_c_sharp_wrapper_for_linq_to_gac_access%2f&amp;title=Linq+to+Gac+%3a+Use+Linq+to+Power+Query+your+Gac+via+this+C%23+Bridge+to+Fusion"><img style="border:0;" title="Digg This" src="http://digg.com/img/badges/100x20-digg-button.png" border="0" alt="Digg This" width="100" height="20" /></a></div>
<br />Posted in C# 3.0 Enhancements, C# 3.0 for Internal DSL, concepts implemented, Framework Design, Generics, Proof Driven Development, Software Design, Software Futures, Technology Tagged: CSharp, DomainDriven, Fusion, GAC, Global Assembly Cache, IEnumerable, IEnumerator, Internals, Lambada, Linq, Linq to Gac, Linq to Objects, Machine, Registry <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/dcarr.wordpress.com/928/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/dcarr.wordpress.com/928/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/dcarr.wordpress.com/928/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/dcarr.wordpress.com/928/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/dcarr.wordpress.com/928/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/dcarr.wordpress.com/928/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/dcarr.wordpress.com/928/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/dcarr.wordpress.com/928/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/dcarr.wordpress.com/928/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/dcarr.wordpress.com/928/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=928&subd=dcarr&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://team.pushbomb.com/2008/09/20/fusion_c_sharp_wrapper_for_linq_to_gac_access/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<georss:point>30.196311 -97.730807</georss:point>
		<geo:lat>30.196311</geo:lat>
		<geo:long>-97.730807</geo:long>
		<media:content url="http://1.gravatar.com/avatar/7b572cbcda5a17fe984e7dd1ddc9c3d6?s=96&#38;d=&#38;r=PG" medium="image">
			<media:title type="html">pushbomb</media:title>
		</media:content>

		<media:content url="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fblog.domaindotnet.com%2f2008%2f09%2f20%2ffusion_c_sharp_wrapper_for_linq_to_gac_access%2f" medium="image">
			<media:title type="html">kick it on DotNetKicks.com</media:title>
		</media:content>

		<media:content url="http://digg.com/img/badges/100x20-digg-button.png" medium="image">
			<media:title type="html">Digg This</media:title>
		</media:content>

		<media:content url="http://dcarr.files.wordpress.com/2008/09/classdiagram2-thumb1.png" medium="image">
			<media:title type="html">ClassDiagram2</media:title>
		</media:content>

		<media:content url="http://digg.com/img/badges/100x20-digg-button.png" medium="image">
			<media:title type="html">Digg This</media:title>
		</media:content>
	</item>
		<item>
		<title>Linq Framework Design Guidelines : don&#8217;t wait for the book update</title>
		<link>http://team.pushbomb.com/2008/07/27/linq-framework-design-guidelines-great-content-from-the-upcoming-book/</link>
		<comments>http://team.pushbomb.com/2008/07/27/linq-framework-design-guidelines-great-content-from-the-upcoming-book/#comments</comments>
		<pubDate>Sun, 27 Jul 2008 15:00:36 +0000</pubDate>
		<dc:creator>Damon Wilder Carr</dc:creator>
				<category><![CDATA[C# 3.0 Enhancements]]></category>
		<category><![CDATA[C# 3.0 for Internal DSL]]></category>
		<category><![CDATA[Framework Design]]></category>
		<category><![CDATA[Software Design]]></category>
		<category><![CDATA[.NET 3.0]]></category>
		<category><![CDATA[Architecture]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Domain Driven]]></category>
		<category><![CDATA[dsl]]></category>
		<category><![CDATA[Fluent API]]></category>
		<category><![CDATA[Linq]]></category>

		<guid isPermaLink="false">http://dcarr.wordpress.com/?p=557</guid>
		<description><![CDATA[Do not implement IQueryable

without understanding all the performance tradeoffs. 



·     Building and parsing expression trees is expensive and many queries can actually get slower when IQueryable

is implemented. 



·     

The trade-off is acceptable in the LINQ to SQL case, since the alternative overhead of performing queries in memory would have been far greater than the transformation of the expression to an SQL statement and the delegation of the query processing to the database server.<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=557&subd=dcarr&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>This is from the team that brought you <a href="http://www.amazon.com/dp/0321246756?tag=cwalina-20&amp;camp=14573&amp;creative=327641&amp;linkCode=as1&amp;creativeASIN=0321246756&amp;adid=16XTFVZSF2T2H97M2AWS&amp;">‘Framework Design Guidelines’</a> led by <a href="http://blogs.msdn.com/kcwalina/">Krzysztof Cwalina</a>, an individual we are not shy to recognize as an amazing mind.</p>
<p>Look for this content (as shared here from their internal work) in the next version of the book</p>
<p><span style="font-size:11pt;"><span style="font-family:batang;"> </span></span></p>
<h2>A Quick Overview</h2>
<ul>
<li>
<div><span style="color:#ffffff;"><span style="font-family:batang;">The Query Pattern, a specification of the set of methods a type must provide in order to be considered as a LINQ provider. The names of these methods can be found in </span><span>System.Linq.Enumerable</span><span style="font-family:batang;"> (found in </span><span>System.Core</span><span style="font-family:batang;">). Their signature follows a pattern that will be discussed later in this chapter.<br />
</span></span></div>
</li>
<li>
<div><span style="color:#ffffff;"><span style="font-family:batang;">A definition of a new interface,<strong> </strong></span><span><strong>IQueryable&lt;T&gt; :I Enumerable&lt;T&gt;<br />
</strong></span></span></div>
</li>
<li>
<div><span style="color:#ffffff;"><span style="font-family:symbol;"><span><span> </span></span></span><span style="font-family:batang;">New types representing generic delegates: </span><span>Func&lt;&gt; </span><span style="font-family:batang;">and </span><span>Action&lt;&gt;<br />
</span></span></div>
</li>
<li>
<div><span style="font-family:batang;"><span style="color:#ffffff;">Lambda expressions, a language feature in VB and C# for defining anonymous delegate </span></span><span style="color:#ffffff;"><span style="font-family:batang;">types representing the notion of a delay-compiled delegate, the </span><span>Expression&lt;&gt;</span><span style="font-family:batang;"> family of types.<br />
</span></span></div>
</li>
<li>
<div><span style="font-family:batang;"><span style="color:#ffffff;">An extension to the C# and VB syntax allowing for queries to be expressed in an alternative, SQL-like format. For example (C#):</span></span></div>
</li>
</ul>
<table style="height:241px;" border="1" cellspacing="5" cellpadding="5" width="841">
<tbody>
<tr>
<td width="485" valign="top"><span><span style="font-family:courier;"> </span></span><span><span style="font-family:courier;"> </span></span><span><span style="font-family:courier;"><strong> </strong></span></span></p>
<p><span><span style="font-family:courier;"><strong>//using extension methods: </strong></span></span></p>
<p><span><span style="font-family:courier;"> </span></span></p>
<p><span><span style="font-family:courier;"><strong>IEnumerable&lt;string&gt; names = set.Where(x=&gt;x.Age&gt;20).Select(x=&gt;x.Name); </strong></span></span></p>
<p><span><span style="font-family:courier;"> </span><span style="font-family:courier;"><strong> </strong></span></span><strong> </strong></p>
<p><span><span style="font-family:courier;"><strong>//using SQL-like syntax: </strong></span></span></p>
<p><span><span style="font-family:courier;"> </span></span></p>
<p><span><span style="font-family:courier;"><strong>IEnumerable&lt;string&gt; names = from x in set where x.Age&gt;20 </strong></span></span></p>
<p><span><span style="font-family:courier;"> </span></span></p>
<p><span><span style="font-family:courier;"><strong><span> </span>select x.Name; </strong></span></span></p>
<p><span><span style="font-family:courier;"> </span></span></td>
</tr>
</tbody>
</table>
<p class="DO-codefirstCxSpFirst" style="margin:5pt 0 0 30.25pt;">
<div class="DO-codefirstCxSpFirst" style="margin:5pt 0 0 30.25pt;"><span><span style="font-family:courier;"> </span></span></div>
<p><span><span style="font-family:courier;"> </span></span></p>
<p><span><span style="font-family:courier;"> </span></span><span style="font-family:courier;"> </span></p>
<blockquote><p><span>The interplay between these features is the following: any </span><span>IEnumerable&lt;&gt;</span><span style="font-family:batang;"> can be queried upon using the LINQ extension methods, most of which require one or more lambda expressions as parameters; this leads to an in-memory, generic evaluation of the queries. For cases where the set of data is not in memory (e.g. in a database), and/or queries may be optimized, the set of data is presented as an </span><span>IQueryable&lt;&gt;</span><span style="font-family:batang;">. If lambda expressions are given as parameters, they are transformed by the compiler to </span><span>Expression&lt;&gt;</span><span style="font-family:batang;"> objects. The implementation of </span><span>IQueryable&lt;&gt;</span><span style="font-family:batang;"> is responsible for processing said expressions. For example, the implementation of an </span><span>IQueryable&lt;&gt;</span><span style="font-family:batang;"> representing a database table would translate </span><span>Expression&lt;&gt;</span><span> objects to SQL queries.</span></p></blockquote>
<p class="NL" style="margin:2pt 0 0 24pt;"><span style="font-family:batang;"> </span></p>
<h2 style="margin:24pt 0 12pt .25in;"><span style="color:#4f81bd;"><span><span><span style="font-size:medium;font-family:cambria;">2.</span><span> </span></span></span><span style="font-size:medium;font-family:cambria;">Extension Methods, Func&lt;&gt;, Action&lt;&gt;, and Expression&lt;&gt;</span></span></h2>
<p class="BodyFirst" style="margin:10pt 0 0;"><span style="font-family:batang;"><strong><span style="font-size:11pt;">Extension methods</span></strong><span style="font-size:11pt;"> constitute a language feature that allows static methods to be invoked on instance variables. These methods must take at least one parameter, which represents the instance the method is to operate on. For example, in C#, this is done by using the </span></span><span style="font-size:11pt;">this</span><span style="font-size:11pt;"><span style="font-family:batang;"> modifier on such a parameter, when defining the method:</span></span></p>
<p class="BodyFirst" style="margin:10pt 0 0;">
<div class="BodyFirst" style="margin:10pt 0 0;"><span style="font-size:11pt;"> </span></div>
<p><span style="font-size:11pt;"><span style="font-family:batang;"> </span></span></p>
<p class="CodeFirstCxSpFirst" style="margin:6pt 0 0 15.1pt;">
<div class="CodeFirstCxSpFirst" style="margin:6pt 0 0 15.1pt;"><span><span style="font-family:courier;">public static bool IsPalindrome(<strong>this</strong> string s){ </span></span></div>
<p><span><span style="font-family:courier;"> </span></span></p>
<p class="CodeFirstCxSpMiddle" style="margin:0 0 0 15.1pt;">
<div class="CodeFirstCxSpMiddle" style="margin:0 0 0 15.1pt;"><span><span style="font-family:courier;"><span> </span>//implementation follows here </span></span></div>
<p><span><span style="font-family:courier;"> </span></span></p>
<p class="CodeFirstCxSpLast" style="margin:0 0 0 15.1pt;"><span><span style="font-family:courier;">}</span></span></p>
<p class="CodeFirstCxSpLast" style="margin:0 0 0 15.1pt;">
<div class="CodeFirstCxSpLast" style="margin:0 0 0 15.1pt;"><span> </span></div>
<p><span><span style="font-family:courier;"> </span></span></p>
<p class="Body" style="margin:10pt 0 6pt;">
<div class="Body" style="margin:10pt 0 6pt;"><span style="font-size:11pt;"><span style="font-family:batang;">This example allows one to write, for example: </span></span></div>
<p><span style="font-size:11pt;"><span style="font-family:batang;"> </span></span></p>
<p class="CodeFirst" style="margin:6pt 0 0 15.1pt;">
<div class="CodeFirst" style="margin:6pt 0 0 15.1pt;"><span>“some string”.IsPalindrome(); </span></div>
<p><span> </span></p>
<p class="BodyCxSpFirst" style="margin:10pt 0 0;"><span style="font-size:11pt;"><span style="font-family:batang;"> </span></span></p>
<p class="BodyCxSpMiddle" style="margin:0;"><span style="font-size:11pt;"><span style="font-family:batang;">&#8230;which in this case would result in </span></span><span style="font-size:11pt;">false</span></p>
<div class="BodyCxSpMiddle" style="margin:0;"><span style="font-size:11pt;"><span style="font-family:batang;">being displayed on the console. </span></span></div>
<p><span style="font-size:11pt;"><span style="font-family:batang;"> </span></span></p>
<p class="BodyCxSpMiddle" style="margin:0;"><span style="font-size:11pt;"><span style="font-family:batang;"> </span></span></p>
<p class="BodyCxSpMiddle" style="margin:0;">
<div class="BodyCxSpMiddle" style="margin:0;"><span style="font-size:11pt;"><span style="font-family:batang;">The class that defines such extension methods is referred to in this text as “sponsor” class, and it must be declared as static. To use extension methods, one must import the namespace defining their sponsor class. </span></span></div>
<p><span style="font-size:11pt;"><span style="font-family:batang;"> </span></span></p>
<p class="BodyCxSpMiddle" style="margin:0;"><span style="font-size:11pt;"><span style="font-family:batang;"> </span></span></p>
<p class="BodyCxSpLast" style="margin:0 0 6pt;">
<div class="BodyCxSpLast" style="margin:0 0 6pt;"><span style="font-family:batang;"><strong><span style="font-size:11pt;">Func&lt;&gt;</span></strong></p>
<div class="BodyCxSpLast" style="margin:0 0 6pt;"><span style="font-size:11pt;">objects represent a generic delegate. For example: </span></div>
<p></span></div>
<p><span style="font-family:batang;"><span style="font-size:11pt;"> </span></span></p>
<p class="CodeFirstCxSpFirst" style="margin:6pt 0 0 15.1pt;">
<div class="CodeFirstCxSpFirst" style="margin:6pt 0 0 15.1pt;"><span><span style="font-family:courier;">Func&lt;int,int,double&gt; divide=(x,y)=&gt;(double)x/(double)y; </span></span></div>
<p><span><span style="font-family:courier;"> </span></span></p>
<p class="CodeFirstCxSpLast" style="margin:0 0 0 15.1pt;">
<div class="CodeFirstCxSpLast" style="margin:0 0 0 15.1pt;"><span><span style="font-family:courier;">Console.WriteLine(divide(2,3)); </span></span></div>
<p><span><span style="font-family:courier;"> </span></span></p>
<p class="Body" style="margin:10pt 0 6pt;"><span style="font-size:11pt;"><span style="font-family:batang;">In this example, divide is a function that takes two integers and returns a double. The last parameter in the generic definition of a </span></span><span style="font-size:11pt;">Func&lt;&gt;</span><span style="font-size:11pt;"><span style="font-family:batang;"> is always the return type. To represent void-returning functions, use </span></span><span style="font-size:11pt;">Action&lt;&gt;</span></p>
<div class="Body" style="margin:10pt 0 6pt;"><span style="font-size:11pt;"><span style="font-family:batang;">instead. For example: </span></span></div>
<p><span style="font-size:11pt;"><span style="font-family:batang;"> </span></span></p>
<p class="CodeFirstCxSpFirst" style="margin:6pt 0 0 15.1pt;">
<div class="CodeFirstCxSpFirst" style="margin:6pt 0 0 15.1pt;"><span><span style="font-family:courier;">Action&lt;double&gt; write=(aDouble)=&gt;Console.WriteLine(aDouble); </span></span></div>
<p><span><span style="font-family:courier;"> </span></span></p>
<p class="CodeFirstCxSpLast" style="margin:0 0 0 15.1pt;">
<div class="CodeFirstCxSpLast" style="margin:0 0 0 15.1pt;"><span><span style="font-family:courier;">write(divide(2,3)); </span></span></div>
<p><span><span style="font-family:courier;"> </span></span></p>
<p class="Body" style="margin:10pt 0 6pt;">
<div class="Body" style="margin:10pt 0 6pt;"><span style="font-family:batang;"><strong><span style="font-size:11pt;">Expression&lt;&gt;</span></strong></p>
<div class="Body" style="margin:10pt 0 6pt;"><span style="font-size:11pt;">objects represent function definitions that can be compiled and subsequently invoked at runtime. Continuing with our example: </span></div>
<p></span></div>
<p><span style="font-family:batang;"><span style="font-size:11pt;"> </span></span></p>
<p class="CodeFirstCxSpFirst" style="margin:6pt 0 0 15.1pt;">
<div class="CodeFirstCxSpFirst" style="margin:6pt 0 0 15.1pt;"><span><span style="font-family:courier;">Expression&lt;Func&lt;int,int,double&gt;&gt; divideBody=(x,y)=&gt;(double)x/(double)y; </span></span></div>
<p><span><span style="font-family:courier;"> </span></span></p>
<p class="CodeFirstCxSpMiddle" style="margin:0 0 0 15.1pt;">
<div class="CodeFirstCxSpMiddle" style="margin:0 0 0 15.1pt;"><span><span style="font-family:courier;">Func&lt;int,int,double&gt; divide2=divideBody.Compile(); </span></span></div>
<p><span><span style="font-family:courier;"> </span></span></p>
<p class="CodeFirstCxSpLast" style="margin:0 0 0 15.1pt;">
<div class="CodeFirstCxSpLast" style="margin:0 0 0 15.1pt;"><span><span style="font-family:courier;">write(divide2(2,3)); </span></span></div>
<p><span><span style="font-family:courier;"> </span></span></p>
<p class="BodyCxSpFirst" style="margin:14pt 0 0;"><span style="font-size:11pt;"><span style="font-family:batang;">Notice how the syntax for constructing an </span></span><span style="font-size:11pt;">Expression&lt;&gt; </span><span style="font-size:11pt;"><span style="font-family:batang;">object is very similar to the one used to construct a </span></span><span style="font-size:11pt;">Func&lt;&gt; </span><span style="font-size:11pt;"><span style="font-family:batang;">object; in fact, the only difference is the static type declaration of the variable (</span></span><span style="font-size:11pt;">Expression&lt;&gt; </span><span style="font-size:11pt;"><span style="font-family:batang;">instead of </span></span><span style="font-size:11pt;">Func&lt;&gt;</span></p>
<div class="BodyCxSpFirst" style="margin:14pt 0 0;"><span style="font-size:11pt;"><span style="font-family:batang;">). </span></span></div>
<p><span style="font-size:11pt;"><span style="font-family:batang;"> </span></span></p>
<p class="BodyCxSpMiddle" style="margin:14pt 0 0;"><span style="font-size:11pt;"><span style="font-family:batang;"> </span></span></p>
<p class="BodyCxSpLast" style="margin:14pt 0 6pt;"><span style="font-size:11pt;"><span style="font-family:batang;">Expressions may also be constructed programmatically, using the predefined static methods of the non-generic </span></span><span style="font-size:11pt;">Expression</span></p>
<div class="BodyCxSpLast" style="margin:14pt 0 6pt;"><span style="font-size:11pt;"><span style="font-family:batang;">class, however, this is a topic that does not need to be covered for our purposes here. </span></span></div>
<p><span style="font-size:11pt;"><span style="font-family:batang;"> </span></span></p>
<p class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span class="DO1"><span style="font-size:11pt;color:#ff0000;font-family:wingdings;"><span>ý</span></span></span></p>
<div class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-family:batang;"><span class="DO1"><span style="font-size:11pt;color:#ff0000;"> </span></span><span class="DO1"><strong><span style="text-decoration:underline;"><span style="font-size:11pt;">Avoid</span></span></strong></span></p>
<div class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;">frivolous use of the extension methods feature when defining methods on a new type. Use the canonical, language-specific means for defining type members. </span></div>
<p></span></div>
<p><span style="font-family:batang;"><span style="font-size:11pt;"> </span></span></p>
<p class="DOFirst" style="margin:12pt 0 6pt 12.25pt;">
<div class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;"><span style="font-family:batang;">There are a few reasons for this. The main one is that liberal use of extension methods has the potential of cluttering the API of types. Another reason is that extension methods are a compile-time facility, and not all languages provide support for them. </span></span></div>
<p><span style="font-size:11pt;"><span style="font-family:batang;"> </span></span></p>
<p class="DOFirst" style="margin:12pt 0 6pt 12.25pt;">
<div class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;"><span style="font-family:batang;">There are, of course, scenarios in which extension methods should be employed. These are outlined in what follows. </span></span></div>
<p><span style="font-size:11pt;"><span style="font-family:batang;"> </span></span></p>
<p class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span class="DO1"><strong><span style="font-size:11pt;color:#00b050;font-family:wingdings;"><span>þ</span></span></strong></span></p>
<div class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-family:batang;"><span class="DO1"><strong><span style="font-size:11pt;color:#00b050;"> </span></strong></span><span class="DO1"><strong><span style="text-decoration:underline;"><span style="font-size:11pt;">Consider</span></span></strong></span></p>
<div class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;">using extension methods in any of the following scenarios: </span></div>
<p></span></div>
<p><span style="font-family:batang;"><span style="font-size:11pt;"> </span></span></p>
<p class="DOFirst" style="text-indent:-.25in;margin:12pt 0 6pt .5in;"><span style="font-size:11pt;font-family:symbol;"><span>·<span> </span></span></span><span style="font-size:11pt;"><span style="font-family:batang;">to provide helper functionality relevant to every implementation of an interface, if said functionality can be written in terms of the core interface. This is because concrete implementations cannot otherwise be assigned to interfaces. For example, the LINQ to Objects operators are implemented as extension methods for all </span></span><span style="font-size:11pt;">IEnumerable&lt;T&gt;</span><span style="font-size:11pt;"><span style="font-family:batang;"> types. Thus, any </span></span><span style="font-size:11pt;">IEnumerable&lt;&gt;</span></p>
<div class="DOFirst" style="text-indent:-.25in;margin:12pt 0 6pt .5in;"><span style="font-size:11pt;"><span style="font-family:batang;">implementation is automatically LINQ-enabled </span></span></div>
<p><span style="font-size:11pt;"><span style="font-family:batang;"> </span></span></p>
<p class="DOFirst" style="text-indent:-.25in;margin:12pt 0 6pt .5in;"><span style="font-size:11pt;font-family:symbol;"><span>·<span> </span></span></span></p>
<div class="DOFirst" style="text-indent:-.25in;margin:12pt 0 6pt .5in;"><span style="font-size:11pt;"><span style="font-family:batang;">when object model considerations would dictate taking a dependency on some assembly, but taking such a dependency would break dependency management rules. </span></span></div>
<p><span style="font-size:11pt;"><span style="font-family:batang;"> </span></span></p>
<p class="DOFirst" style="text-indent:0;margin:12pt 0 6pt .5in;"><span style="font-size:11pt;"><span style="font-family:batang;">For example, consider the domain of telecommunications. Let us consider that a core domain-specific model is that of network nodes. A library is defined for this domain, called </span></span><span style="font-size:11pt;">nodes.dll</span><span style="font-size:11pt;"><span style="font-family:batang;">. The library contains types such as </span></span><span style="font-size:11pt;">Node</span><span style="font-size:11pt;"><span style="font-family:batang;">. </span></span><span style="font-size:11pt;">Node</span><span style="font-size:11pt;"><span style="font-family:batang;"> may have properties such as “address” and “manufacturer”, etc. Now consider the problem of establishing communication paths through such a network (i.e. routing). A second library, </span></span><span style="font-size:11pt;">routing.dll</span><span style="font-size:11pt;"><span style="font-family:batang;">, is thus developed, taking a dependency on </span></span><span style="font-size:11pt;">nodes.dll</span><span style="font-size:11pt;"><span style="font-family:batang;">. Good engineering practice dictates that </span></span><span style="font-size:11pt;">nodes.dll </span><span style="font-size:11pt;"><span style="font-family:batang;">not take a dependency on </span></span><span style="font-size:11pt;">routing.dll</span><span style="font-size:11pt;"><span style="font-family:batang;">. <span> </span>However, it could be imagined that, in the domain of path routing, the model for network nodes may have new characteristics, namely, that of being or not a path endpoint, and that of being associated with a number of paths. To maintain clean dependencies, a possibility is to have static methods defined in </span></span><span style="font-size:11pt;">routing.dll</span><span style="font-size:11pt;"><span style="font-family:batang;">, e.g. </span></span><span style="font-size:11pt;">Paths.IsNodePathEndpoint(Node n)</span><span style="font-size:11pt;"><span style="font-family:batang;"> or </span></span><span style="font-size:11pt;">Paths.GetListOfPathsCrossingNode(Node n)</span><span style="font-size:11pt;"><span style="font-family:batang;">. However, it may be considered more natural to simply have methods like </span></span><span style="font-size:11pt;">IsEndpoint()</span><span style="font-size:11pt;"><span style="font-family:batang;"> defined on </span></span><span style="font-size:11pt;">Node</span></p>
<div class="DOFirst" style="text-indent:0;margin:12pt 0 6pt .5in;"><span style="font-size:11pt;"><span style="font-family:batang;">. Defining extension methods on the Node type in the paths library is, thus, the option to be considered. </span></span></div>
<p><span style="font-size:11pt;"><span style="font-family:batang;"> </span></span></p>
<p class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span class="DO1"><span style="font-size:11pt;color:#ff0000;font-family:wingdings;"><span>ý</span></span></span><span style="font-family:batang;"><span class="DO1"><span style="font-size:11pt;color:#ff0000;"> </span></span><span class="DO1"><strong><span style="text-decoration:underline;"><span style="font-size:11pt;">Avoid</span></span></strong></span><span style="font-size:11pt;"> defining extension methods on </span></span><span style="font-size:11pt;">System.Object</span></p>
<div class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;"><span style="font-family:batang;">, unless absolutely necessary. When doing so, be aware that VB users will not be able to use thus-defined extension methods and, as such, they will not be able to take advantage of usability/syntax benefits that come with extension methods. </span></span></div>
<p><span style="font-size:11pt;"><span style="font-family:batang;"> </span></span></p>
<p class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;"><span style="font-family:batang;">This is because, in VB, declaring a variable as </span></span><span style="font-size:11pt;">object</span></p>
<div class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;"><span style="font-family:batang;">forces all method invocations on it to be late bound – while bindings to extension methods are compile-time determined (early bound). For example: </span></span></div>
<p><span style="font-size:11pt;"><span style="font-family:batang;"> </span></span></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;">public static class SomeExtensions{ </span></div>
<p><span style="font-size:8pt;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;"><span> </span>static void Foo(this object o){…} </span></div>
<p><span style="font-size:8pt;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;">} </span></div>
<p><span style="font-size:8pt;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;">… </span></div>
<p><span style="font-size:8pt;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;">Object o = … </span></div>
<p><span style="font-size:8pt;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;">o.Foo(); </span></div>
<p><span style="font-size:8pt;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:11pt;"><span style="font-family:batang;">In this example, the call to </span></span><span style="font-size:11pt;">Foo</span></p>
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:11pt;"><span style="font-family:batang;">will fail in VB. Instead, the VB syntax should simply be: </span></span></div>
<p><span style="font-size:11pt;"><span style="font-family:batang;"> </span></span></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;">SomeExtensions.Foo(o) </span></div>
<p><span style="font-size:8pt;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;font-family:courier;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:11pt;"><span style="font-family:batang;">Note that the guideline applies to other languages where the same binding behavior is present, or where extension methods are not supported. </span></span></div>
<p><span style="font-size:11pt;"><span style="font-family:batang;"> </span></span></p>
<p class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span class="DO1"><span style="font-size:11pt;color:#ff0000;font-family:wingdings;"><span>ý</span></span></span></p>
<div class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-family:batang;"><span class="DO1"><span style="font-size:11pt;color:#ff0000;"> </span></span><span class="DO1"><strong><span style="text-decoration:underline;"><span style="font-size:11pt;">Do not</span></span></strong></span></p>
<div class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;">put extension methods in the same namespace as the extended type, unless it is for adding methods to interfaces, or for dependency management. In the latter case, the type would be in a different assembly. </span></div>
<p></span></div>
<p><span style="font-family:batang;"><span style="font-size:11pt;"> </span></span></p>
<p class="DO" style="margin:12pt 0 6pt 12.25pt;"><span class="DO1"><span style="font-size:11pt;color:#ff0000;font-family:wingdings;"><span>ý</span></span></span><span style="font-family:batang;"><span class="DO1"><span style="font-size:11pt;color:#ff0000;"> </span></span><span class="DO1"><strong><span style="text-decoration:underline;"><span style="font-size:11pt;">Avoid</span></span></strong></span><span style="font-size:11pt;"> redefining extension methods on a type </span></span><span style="font-size:11pt;">T</span></p>
<div class="DO" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;"><span style="font-family:batang;">with extension methods on the same type. </span></span></div>
<p><span style="font-size:11pt;"><span style="font-family:batang;"> </span></span></p>
<p class="DO" style="margin:12pt 0 6pt 12.25pt;">
<div class="DO" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;"><span style="font-family:batang;">For example, in C#, if two different namespaces defined the same extension method on the same type, it would be impossible to import both namespaces in the same file – the compiler would report an ambiguity. </span></span></div>
<p><span style="font-size:11pt;"><span style="font-family:batang;"> </span></span></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><strong><span style="font-size:8pt;">&lt;file 1&gt; </span></strong></div>
<p><strong><span style="font-size:8pt;"> </span></strong></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;">namespace A{ </span></div>
<p><span style="font-size:8pt;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;"><span> </span>public static class ExtMethodsInA{ </span></div>
<p><span style="font-size:8pt;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;"><span> </span>public static void ExtMethod(this T obj){…} </span></div>
<p><span style="font-size:8pt;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;"><span> </span>} </span></div>
<p><span style="font-size:8pt;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;">} </span></div>
<p><span style="font-size:8pt;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><strong><span style="font-size:8pt;">&lt;file 2&gt; </span></strong></div>
<p><strong><span style="font-size:8pt;"> </span></strong></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;">namespace B{ </span></div>
<p><span style="font-size:8pt;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;"><span> </span>public static class ExtMethodsInB{ </span></div>
<p><span style="font-size:8pt;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;"><span> </span>static void ExtMethod(this T obj){…} </span></div>
<p><span style="font-size:8pt;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;"><span> </span>} </span></div>
<p><span style="font-size:8pt;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;">} </span></div>
<p><span style="font-size:8pt;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><strong><span style="font-size:8pt;">&lt;file 3&gt; </span></strong></div>
<p><strong><span style="font-size:8pt;"> </span></strong></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;">using A; </span></div>
<p><span style="font-size:8pt;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;">using B; </span></div>
<p><span style="font-size:8pt;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:11pt;"><span style="font-family:batang;">This will fail at compile time, since </span></span><span style="font-size:11pt;">ExtMethod</span></p>
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:11pt;"><span style="font-family:batang;">is considered to be defined twice. This may break valid reusability scenarios; if the scenarios occur late in the development cycle, refactoring namespaces may prove costly. It is thus preferable to avoid this form of overriding methods. </span></span></div>
<p><span style="font-size:11pt;"><span style="font-family:batang;"> </span></span></p>
<p class="BodyFirst" style="margin:10pt 0 0;">
<div class="BodyFirst" style="margin:10pt 0 0;"><span style="font-family:batang;"><span style="font-size:11pt;"><span> </span></span></span></div>
<p><span style="font-family:batang;"><span style="font-size:8pt;font-family:courier;"> </span></span></p>
<table class="MsoNormalTable" style="border-collapse:collapse;margin:auto auto auto 9pt;" border="0" cellspacing="5" cellpadding="5" width="497">
<tbody>
<tr style="height:132pt;">
<td style="border:3pt solid black;background:#e6e6e6 none repeat scroll 0 0;width:351pt;height:132pt;padding:9pt;" width="485">
<p class="AnnotationHead" style="margin:6pt 0 0 .25in;"><span><span style="font-size:small;"><strong> </strong></span></span></p>
<div><span><span style="font-size:small;"></p>
<div><strong><span style="color:#000000;">Mircea Trofin </span></strong></div>
<p></span></span></div>
<p><span><span style="font-size:small;"><strong><span style="color:#000000;"> </span></strong> </span></span></p>
<div><span style="font-size:11pt;"><strong><span style="color:#000000;">Such a situation may occur when using a mix of third-party libraries. To resolve it, import in a file only one namespace defining extension methods on a type, and use fully-qualified static method calls for extension methods defined on the same type in a different namespace. </span></strong></span></div>
<p><span style="font-size:11pt;"><strong><span style="color:#000000;"> </span></strong> </span></p>
<div><span style="font-size:11pt;"><strong><span style="color:#000000;">Using the example before: </span></strong></span></div>
<p><span style="font-size:11pt;"><strong><span style="color:#000000;"> </span></strong> </span></p>
<div><span style="font-size:8pt;"></p>
<div><strong><span style="color:#000000;">&lt;file 3&gt; </span></strong></div>
<p></span></div>
<p><span style="font-size:8pt;"><strong><span style="color:#000000;"> </span></strong> </span></p>
<div><span style="font-size:8pt;"></p>
<div><strong><span style="color:#000000;">using A; </span></strong></div>
<p></span></div>
<p><span style="font-size:8pt;"><strong><span style="color:#000000;"> </span></strong> </span></p>
<div><span style="font-size:8pt;"></p>
<div><strong><span style="color:#000000;">… </span></strong></div>
<p></span></div>
<p><span style="font-size:8pt;"><strong><span style="color:#000000;"> </span></strong> </span></p>
<div><span style="font-size:8pt;"></p>
<div><strong><span style="color:#000000;">T someObj=… </span></strong></div>
<p></span></div>
<p><span style="font-size:8pt;"><strong><span style="color:#000000;"> </span></strong> </span></p>
<div><span style="font-size:8pt;"></p>
<div><strong><span style="color:#000000;">someObj.ExtMethod(); //this calls A.ExtMethodsInA.ExtMethod </span></strong></div>
<p></span></div>
<p><span style="font-size:8pt;"><strong><span style="color:#000000;"> </span></strong> </span></p>
<p><span style="font-size:8pt;"><strong><span style="color:#000000;">B.<span> B.</span>ExtMethodsInB.ExtMethod(someObj); //to avoid compilation errors of file 3, we call explicitly the extension method defined in namespace B</span></strong></span></td>
</tr>
</tbody>
</table>
<p class="NL" style="text-indent:0;margin:2pt 0 0;"><span style="font-size:8pt;"> </span></p>
<p class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span class="DO1"><strong><span style="font-size:11pt;color:#00b050;font-family:wingdings;"><span>þ</span></span></strong></span><span class="DO1"><strong><span style="font-size:11pt;color:#00b050;"> </span></strong></span><span class="DO1"><strong><span style="text-decoration:underline;"><span style="font-size:11pt;">Do</span></span></strong></span></p>
<div class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;">define extension methods in the same namespace as the extended type, if the type is an interface, and if the extension methods are meant to be used in most or all cases. </span></div>
<p><span style="font-size:11pt;"> </span></p>
<p class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span class="DO1"><span style="font-size:11pt;color:#ff0000;font-family:wingdings;"><span>ý</span></span></span><span class="DO1"><span style="font-size:11pt;color:#ff0000;"> </span></span><span class="DO1"><strong><span style="text-decoration:underline;"><span style="font-size:11pt;">Do not</span></span></strong></span></p>
<div class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;">define extension methods pertaining to a feature in namespaces normally associated with other features. Instead, define them in the namespace associated with the feature they belong to, or a namespace of it. </span></div>
<p><span style="font-size:11pt;"> </span></p>
<p class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;">For example, do not define extension methods for </span><span style="font-size:11pt;">Telecom.Node </span><span style="font-size:11pt;">in the </span><span style="font-size:11pt;">Telecom </span><span style="font-size:11pt;">namespace, but in a separate namespace, e.g. </span><span style="font-size:11pt;">Routing</span></p>
<div class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;">. </span></div>
<p><span style="font-size:11pt;"> </span></p>
<p class="DO" style="margin:12pt 0 6pt 12.25pt;"><span class="DO1"><span style="font-size:11pt;color:#ff0000;font-family:wingdings;"><span>ý</span></span></span><span class="DO1"><span style="font-size:11pt;color:#ff0000;"> </span></span><span class="DO1"><strong><span style="text-decoration:underline;"><span style="font-size:11pt;">Avoid</span></span></strong></span><span style="font-size:11pt;"> generic naming of namespaces dedicated to extension methods (e.g. “Extensions”) – rather, use a descriptive name – e.g. “</span><span style="font-size:11pt;">Routing</span></p>
<div class="DO" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;">”. </span></div>
<p><span style="font-size:11pt;"> </span></p>
<p class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span class="DO1"><strong><span style="font-size:11pt;color:#00b050;font-family:wingdings;"><span>þ</span></span></strong></span><span class="DO1"><strong><span style="font-size:11pt;color:#00b050;"> </span></strong></span><span class="DO1"><strong><span style="text-decoration:underline;"><span style="font-size:11pt;">Do</span></span></strong></span><span style="font-size:11pt;"> use the new LINQ types “</span><span style="font-size:11pt;">Func&lt;&gt;</span><span style="font-size:11pt;">” and “</span><span style="font-size:11pt;">Expression&lt;&gt;</span><span style="font-size:11pt;">” instead of custom delegates and predicates, when defining new APIs. The example below illustrates this point</span><span style="font-size:11pt;"><span style="font-family:batang;">:</span></span></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;font-family:courier;">//rather than: </span></div>
<p><span style="font-size:8pt;font-family:courier;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;font-family:courier;">delegate bool Tester(int i); </span></div>
<p><span style="font-size:8pt;font-family:courier;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;font-family:courier;">class AClass{ </span></div>
<p><span style="font-size:8pt;font-family:courier;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;font-family:courier;"><span> </span><span> </span>public Tester MyTester{get;set;} </span></div>
<p><span style="font-size:8pt;font-family:courier;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;font-family:courier;">} </span></div>
<p><span style="font-size:8pt;font-family:courier;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;font-family:courier;">//use this: </span></div>
<p><span style="font-size:8pt;font-family:courier;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;font-family:courier;">class AClass{ </span></div>
<p><span style="font-size:8pt;font-family:courier;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;font-family:courier;"><span> </span><span> </span>public Func&lt;int,bool&gt; MyTester{get;set;} </span></div>
<p><span style="font-size:8pt;font-family:courier;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;font-family:courier;">} </span></div>
<p><span style="font-size:8pt;font-family:courier;"> </span></p>
<p class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;"><span style="font-family:batang;">Benefits of using </span></span><span style="font-size:11pt;">Func&lt;&gt;</span><span style="font-size:11pt;"><span style="font-family:batang;">, in this case, include minimizing the concept count by employing an existing abstraction, as well as eliminating the dependency on the definition of </span></span><span style="font-size:11pt;">Tester</span><span style="font-size:11pt;"><span style="font-family:batang;">.</span></span></p>
<p class="DOFirst" style="margin:12pt 0 6pt 12.25pt;">
<div class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;"> </span></div>
<p><span style="font-size:11pt;"><span style="font-family:batang;"> </span></span></p>
<h2 style="margin:24pt 0 12pt .25in;"><span style="color:#4f81bd;"><span><span><span style="font-size:medium;font-family:cambria;">3.</span><span> </span></span></span><span style="font-size:medium;font-family:cambria;">Extending on LINQ</span></span></h2>
<p class="BodyFirst" style="margin:10pt 0 0;"><span style="font-size:11pt;"> </span></p>
<p class="BodyFirst" style="margin:10pt 0 0;"><span style="font-size:11pt;"><span style="font-family:batang;">There are three means by which a type can be designed to participate in LINQ queries: implementing </span></span><span style="font-size:11pt;">IEnumerable&lt;&gt;</span><span style="font-size:11pt;"><span style="font-family:batang;"> (or interfaces derived from it), implementing </span></span><span style="font-size:11pt;">IQueryable&lt;&gt;</span></p>
<div class="BodyFirst" style="margin:10pt 0 0;"><span style="font-size:11pt;"><span style="font-family:batang;">, or by defining the Query Pattern on the type, with no relationship to these two interfaces. </span></span></div>
<p><span style="font-size:11pt;"><span style="font-family:batang;"> </span></span></p>
<p class="BodyFirst" style="margin:10pt 0 0;">
<div class="BodyFirst" style="margin:10pt 0 0;"><span style="font-size:11pt;"><span style="font-family:batang;">To preface the guidelines, the choice can be made as follows: </span></span></div>
<p><span style="font-size:11pt;"><span style="font-family:batang;"> </span></span></p>
<p class="BodyCxSpFirst" style="text-indent:-.25in;margin:10pt 0 0 .5in;"><span style="font-size:11pt;"><span><span style="font-family:batang;">-</span><span> </span></span></span><span style="font-size:11pt;"><span style="font-family:batang;">Extend </span></span><span style="font-size:11pt;">IEnumerable&lt;&gt;</span></p>
<div class="BodyCxSpFirst" style="text-indent:-.25in;margin:10pt 0 0 .5in;"><span style="font-size:11pt;"><span style="font-family:batang;">(or interfaced derived from it) if the default, LINQ to Objects support provided in the framework is sufficient </span></span></div>
<p><span style="font-size:11pt;"><span style="font-family:batang;"> </span></span></p>
<p class="BodyCxSpMiddle" style="text-indent:-.25in;margin:0 0 0 1in;"><span style="font-size:11pt;"><span>o<span> </span></span></span></p>
<div class="BodyCxSpMiddle" style="text-indent:-.25in;margin:0 0 0 1in;"><span style="font-size:11pt;"><span style="font-family:batang;">Override some/all LINQ methods if optimizations are required, but access to the query expression is not necessary </span></span></div>
<p><span style="font-size:11pt;"><span style="font-family:batang;"> </span></span></p>
<p class="BodyCxSpMiddle" style="text-indent:-.25in;margin:0 0 0 .5in;"><span style="font-size:11pt;"><span><span style="font-family:batang;">-</span><span> </span></span></span><span style="font-size:11pt;"><span style="font-family:batang;">Extend </span></span><span style="font-size:11pt;">IQueryable&lt;&gt;</span></p>
<div class="BodyCxSpMiddle" style="text-indent:-.25in;margin:0 0 0 .5in;"><span style="font-size:11pt;"><span style="font-family:batang;">if access to the query expression is necessary </span></span></div>
<p><span style="font-size:11pt;"><span style="font-family:batang;"> </span></span></p>
<p class="BodyCxSpLast" style="text-indent:-.25in;margin:0 0 6pt .5in;"><span style="font-size:11pt;"><span><span style="font-family:batang;">-</span><span> </span></span></span><span style="font-size:11pt;"><span style="font-family:batang;">Define the Query Pattern on the new type if the domain makes it impossible or undesirable to implement </span></span><span style="font-size:11pt;">IEnumerable&lt;&gt;</span><span style="font-size:11pt;"><span style="font-family:batang;"> or </span></span><span style="font-size:11pt;">IQueryable&lt;&gt;</span></p>
<div class="BodyCxSpLast" style="text-indent:-.25in;margin:0 0 6pt .5in;"><span style="font-size:11pt;"> </span></div>
<p><span style="font-size:11pt;"> </span></p>
<p class="BodyFirst" style="margin:10pt 0 0;"><span style="font-size:11pt;"><span style="font-family:batang;">The query methods are those defined by the sponsor class </span></span><span style="font-size:11pt;">System.Linq.Enumerable</span><span style="font-size:11pt;"><span style="font-family:batang;">, as extension methods to </span></span><span style="font-size:11pt;">IEnumerable&lt;&gt;</span></p>
<div class="BodyFirst" style="margin:10pt 0 0;"><span style="font-size:11pt;"><span style="font-family:batang;">. Regardless of the means by which a type participates in LINQ queries, the following guideline applies: </span></span></div>
<p><span style="font-size:11pt;"><span style="font-family:batang;"> </span></span></p>
<p class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span class="DO1"><strong><span style="font-size:11pt;color:#00b050;font-family:wingdings;"><span>þ</span></span></strong></span><span style="font-family:batang;"><span class="DO1"><strong><span style="font-size:11pt;color:#00b050;"> </span></strong></span><span class="DO1"><strong><span style="text-decoration:underline;"><span style="font-size:11pt;">Do</span></span></strong></span></span><span style="font-size:11pt;"> respect the signature pattern in </span><span style="font-family:batang;">Figure <span>1</span></span></p>
<div class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;">when overriding LINQ methods. </span></div>
<p><span style="font-size:11pt;"> </span></p>
<p class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;">We use </span><span style="font-size:11pt;">S </span><span style="font-size:11pt;">with or without subscript to indicate a collection type (e.g. </span><span style="font-size:11pt;">IEnumerable&lt;&gt;</span><span style="font-size:11pt;">, </span><span style="font-size:11pt;">ICollection&lt;&gt;</span><span style="font-size:11pt;">) and </span><span style="font-size:11pt;">T</span><span style="font-size:11pt;">, with or without subscript, to indicate the type of elements in that collection. Additionally, we use </span><span>O&lt;T&gt;</span><span><span style="font-family:batang;"> </span></span><span style="font-size:11pt;">to represent subtypes of </span><span style="font-size:11pt;">S&lt;T&gt;</span><span style="font-size:11pt;"> that are ordered. For example, </span><span style="font-size:11pt;">S&lt;T&gt;</span><span style="font-size:11pt;"> is a notation that could be substituted with </span><span style="font-size:11pt;">IEnumerable&lt;int&gt;</span><span style="font-size:11pt;">. The first parameter of all the methods is the type of the object the method is applied on, and it is marked accordingly by prefixing with “</span><span style="font-size:11pt;">this</span><span style="font-size:11pt;">” – whether one chooses to implement these methods as extension methods or as member methods. Also, anywhere </span><span style="font-size:11pt;">Func&lt;&gt;</span><span style="font-size:11pt;"> is being used, one may substitute accordingly with </span><span style="font-size:11pt;">Expression&lt;Func&lt;&gt;&gt;</span></p>
<div class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;">- the guidelines indicate where that is preferable. </span></div>
<p><span style="font-size:11pt;"> </span></p>
<p class="DOFirst" style="margin:12pt 0 6pt 12.25pt;">
<div class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;">Please note that the notation is not meant to be valid code in any particular language, but simply present the type signature pattern. </span></div>
<p><span style="font-size:11pt;"> </span></p>
<table class="MsoNormalTable" style="border-right:medium none;border-top:medium none;border-left:medium none;border-bottom:medium none;border-collapse:collapse;margin:auto auto auto 24pt;" border="1" cellspacing="5" cellpadding="5" width="499">
<tbody>
<tr>
<td style="border:1pt solid black;width:361.8pt;background-color:transparent;padding:0 5.4pt;" width="487" valign="top">
<p class="DO-codelastCxSpFirst" style="margin:0 0 0 30.25pt;">
<div class="DO-codelastCxSpFirst" style="margin:0 0 0 30.25pt;"><span><span style="font-family:courier;">S&lt;T&gt; Where(this S&lt;T&gt;, Func&lt;T,bool&gt;) </span></span></div>
<p><span><span style="font-family:courier;"> </span></span></p>
<p class="DO-codelastCxSpMiddle" style="margin:0 0 0 30.25pt;">
<div class="DO-codelastCxSpMiddle" style="margin:0 0 0 30.25pt;"><span><span style="font-family:courier;">S&lt;T2&gt; Select(this S&lt;T1&gt;,Func&lt;T1,T2&gt;) </span></span></div>
<p><span><span style="font-family:courier;"> </span></span></p>
<p class="DO-codelastCxSpMiddle" style="margin:0 0 0 30.25pt;">
<p class="DO-codelastCxSpMiddle" style="margin:0 0 0 30.25pt;">
<div class="DO-codelastCxSpMiddle" style="margin:0 0 0 30.25pt;"><span><span style="font-family:courier;">O&lt;T&gt; OrderBy(this S&lt;T&gt;, Func&lt;T,K&gt;), where K is  IComparable </span></span></div>
<p><span><span style="font-family:courier;"> </span></span></p>
<p class="DO-codelastCxSpMiddle" style="margin:0 0 0 30.25pt;">
<p class="DO-codelastCxSpMiddle" style="margin:0 0 0 30.25pt;">
<div class="DO-codelastCxSpMiddle" style="margin:0 0 0 30.25pt;"><span><span style="font-family:courier;">O&lt;T&gt; ThenBy(this O&lt;T&gt;,Func&lt;T,K&gt;), where K is  IComparable </span></span></div>
<p><span><span style="font-family:courier;"> </span></span></p>
<p class="DO-codelastCxSpMiddle" style="margin:0 0 0 30.25pt;"><span><span style="font-family:courier;"> </span></span></p>
<p class="DO-codelastCxSpMiddle" style="margin:0 0 0 30.25pt;">
<div class="DO-codelastCxSpMiddle" style="margin:0 0 0 30.25pt;"><span><span style="font-family:courier;">S&lt;T&gt; Union(this S&lt;T&gt;, S&lt;T&gt;) </span></span></div>
<p><span><span style="font-family:courier;"> </span></span></p>
<p class="DO-codelastCxSpMiddle" style="margin:0 0 0 30.25pt;"><span><span style="font-family:courier;"> </span></span></p>
<p class="DO-codelastCxSpMiddle" style="margin:0 0 0 30.25pt;">
<div class="DO-codelastCxSpMiddle" style="margin:0 0 0 30.25pt;"><span><span style="font-family:courier;">S&lt;T&gt; Skip(this S&lt;T&gt;,int) </span></span></div>
<p><span><span style="font-family:courier;"> </span></span></p>
<p class="DO-codelastCxSpMiddle" style="margin:0 0 0 30.25pt;">
<div class="DO-codelastCxSpMiddle" style="margin:0 0 0 30.25pt;"><span><span style="font-family:courier;">S&lt;T&gt; Take(this S&lt;T&gt;,int) </span></span></div>
<p><span><span style="font-family:courier;"> </span></span></p>
<p class="DO-codelastCxSpMiddle" style="margin:0 0 0 30.25pt;">
<div class="DO-codelastCxSpMiddle" style="margin:0 0 0 30.25pt;"><span><span style="font-family:courier;">S&lt;T&gt; SkipWhile(this S&lt;T&gt;, Func&lt;T,bool&gt;) </span></span></div>
<p><span><span style="font-family:courier;"> </span></span></p>
<p class="DO-codelastCxSpMiddle" style="margin:0 0 0 30.25pt;">
<p class="DO-codelastCxSpMiddle" style="margin:0 0 0 30.25pt;">
<div class="DO-codelastCxSpMiddle" style="margin:0 0 0 30.25pt;"><span><span style="font-family:courier;">T ElementAt(this S&lt;T&gt;,int) </span></span></div>
<p><span><span style="font-family:courier;"> </span></span></p>
<p class="DO-codelastCxSpMiddle" style="margin:0 0 0 30.25pt;">
<p class="DO-codelastCxSpMiddle" style="margin:0 0 0 30.25pt;"><span><span style="font-family:courier;">S&lt;T3&gt; Join(this S&lt;T1&gt;, S&lt;T2&gt;,</span></span></p>
<p class="DO-codelastCxSpMiddle" style="margin:0 0 0 30.25pt;"><span><span style="font-family:courier;">Func&lt;T1,K1&gt;,Func&lt;T2,K2&gt;,</span></span></p>
<p class="DO-codelastCxSpMiddle" style="margin:0 0 0 30.25pt;">
<div class="DO-codelastCxSpMiddle" style="margin:0 0 0 30.25pt;"><span><span style="font-family:courier;">Func&lt;T1,T2,T3&gt;) </span></span></div>
<p><span><span style="font-family:courier;"> </span></span></p>
<p class="DO-codelastCxSpMiddle" style="margin:0 0 0 30.25pt;">
<p class="DO-codelastCxSpMiddle" style="margin:0 0 0 30.25pt;">
<div class="DO-codelastCxSpMiddle" style="margin:0 0 0 30.25pt;"><span><span style="font-family:courier;">S&lt;T3&gt; SelectMany(this   S&lt;T1&gt;,Func&lt;T1,S&lt;T2&gt;&gt;,Func&lt;T1,T2,T3&gt;) </span></span></div>
<p><span><span style="font-family:courier;"> </span></span></p>
<p class="DO-codelastCxSpLast" style="margin:0 0 6pt 30.25pt;">
<p class="DO-codelastCxSpLast" style="margin:0 0 6pt 30.25pt;">
<div class="DO-codelastCxSpLast" style="margin:0 0 6pt 30.25pt;"><span><span style="font-family:courier;">S&lt;T2&gt; SelectMany(this S&lt;T1&gt;,Func&lt;T1,S&lt;T2&gt;&gt;) </span></span></div>
<p><span><span style="font-family:courier;"> </span></span></td>
</tr>
</tbody>
</table>
<p class="MsoCaption" style="margin:0 0 10pt;" align="center"><a title="_Ref185215760" name="_Ref185215760"></a><strong><span style="color:#4f81bd;font-family:times new roman;">Figure </span></strong><strong><span style="color:#4f81bd;"><span style="font-family:times new roman;"><span><span>1</span></span> Query Pattern Method Signatures</span></span></strong></p>
<p class="MsoCaption" style="margin:0 0 10pt;" align="center"><strong> </strong></p>
<h3 style="margin:10pt 0 0;"><span style="font-size:small;color:#4f81bd;font-family:cambria;">Extending IEnumerable&lt;&gt;</span></h3>
<p class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span class="DO1"><strong><span style="font-size:11pt;color:#00b050;font-family:wingdings;"><span>þ</span></span></strong></span><span style="font-family:batang;"><span class="DO1"><strong><span style="font-size:11pt;color:#00b050;"> </span></strong></span><span class="DO1"><strong><span style="text-decoration:underline;"><span style="font-size:11pt;">Do</span></span></strong></span></span><span style="font-size:11pt;"> implement </span><span style="font-size:11pt;">IEnumerable&lt;T&gt; </span><span style="font-size:11pt;">to enable basic LINQ support. Such basic support should be sufficient for most in-memory data sets. The basic LINQ support will use the default -provided extension methods on </span><span style="font-size:11pt;">IEnumerable&lt;T&gt;</span></p>
<div class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;">. </span></div>
<p><span style="font-size:11pt;"> </span></p>
<p class="DOFirst" style="margin:12pt 0 6pt 12.25pt;">
<div class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;">For example, simply defining: </span></div>
<p><span style="font-size:11pt;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;">public class RangeOfInts:IEnumerable&lt;int&gt;{ </span></div>
<p><span style="font-size:8pt;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;"><span> </span>public IEnumerator&lt;int&gt; GetEnumerator() {…} </span></div>
<p><span style="font-size:8pt;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;"><span> </span>public IEnumerator GetEnumerator() {…} </span></div>
<p><span style="font-size:8pt;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;">} </span></div>
<p><span style="font-size:8pt;"> </span></p>
<p class="DOFirst" style="margin:12pt 0 6pt 12.25pt;">
<div class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;">Allows for the following code: </span></div>
<p><span style="font-size:11pt;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;">p</span><span> </span></p>
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;">var a=new RangeOfInts(); </span></div>
<p><span style="font-size:8pt;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;">var b=a.Where(x=&gt;x&gt;10); </span></div>
<p><span style="font-size:8pt;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;font-family:courier;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:11pt;">Although </span><span style="font-size:11pt;">RangeOfInts</span><span style="font-size:11pt;"> did not implement a “</span><span style="font-size:11pt;">Where</span></p>
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:11pt;">” method. </span></div>
<p><span style="font-size:11pt;"> </span></p>
<p class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span class="DO1"><strong><span style="font-size:11pt;color:#00b050;font-family:wingdings;"><span>þ</span></span></strong></span><span style="font-family:batang;"><span class="DO1"><strong><span style="font-size:11pt;color:#00b050;"> </span></strong></span><span class="DO1"><strong><span style="text-decoration:underline;"><span style="font-size:11pt;">Consider</span></span></strong></span></span><span style="font-size:11pt;"> redefining the methods in the LINQ pattern on new types implementing </span><span style="font-size:11pt;">IEnumerable&lt;T&gt;</span></p>
<div class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;">, if it is desirable to override the default implementation – e.g. for optimization. It is preferred that one redefines them as type members, rather than extension methods. </span></div>
<p><span style="font-size:11pt;"> </span></p>
<p class="DOFirst" style="margin:12pt 0 6pt 12.25pt;">
<div class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;">For example, rather than: </span></div>
<p><span style="font-size:11pt;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;">public class MyDataSet&lt;T&gt;:IEnumerable&lt;T&gt;{…} </span></div>
<p><span style="font-size:8pt;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;">… </span></div>
<p><span style="font-size:8pt;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;">public static class MyDataSetExtensions{ </span></div>
<p><span style="font-size:8pt;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;"><span> </span>public static MyDataSet&lt;T&gt; Where(this MyDataSet&lt;T&gt; o,Func&lt;T,bool&gt; f){…} </span></div>
<p><span style="font-size:8pt;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;">}; </span></div>
<p><span style="font-size:8pt;"> </span></p>
<p class="DOFirst" style="margin:12pt 0 6pt 12.25pt;">
<div class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;">Opt for this: </span></div>
<p><span style="font-size:11pt;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;">public class MyDataSet&lt;T&gt;:IEnumerable&lt;T&gt;{ </span></div>
<p><span style="font-size:8pt;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;"><span> </span>public MyDataSet&lt;T&gt; Where(Func&lt;T,bool&gt; f){…} </span></div>
<p><span style="font-size:8pt;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;">… </span></div>
<p><span style="font-size:8pt;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;">} </span></div>
<p><span style="font-size:8pt;"> </span></p>
<p class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span class="DO1"><strong><span style="font-size:11pt;color:#00b050;font-family:wingdings;"><span>þ</span></span></strong></span><span style="font-family:batang;"><span class="DO1"><strong><span style="font-size:11pt;color:#00b050;"> </span></strong></span><span class="DO1"><strong><span style="text-decoration:underline;"><span style="font-size:11pt;">Consider</span></span></strong></span></span><span style="font-size:11pt;"> implementing </span><span style="font-size:11pt;">ICollection&lt;T&gt;</span></p>
<div class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;">to improve performance of query operators. </span></div>
<p><span style="font-size:11pt;"> </span></p>
<p class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;">For example, the </span><span style="font-size:11pt;">Count&lt;&gt;</span><span style="font-size:11pt;"> method default behavior (as defined in </span><span style="font-size:11pt;">System.Linq</span><span style="font-size:11pt;">) is to simply walk the </span><span style="font-size:11pt;">IEnumerable</span></p>
<div class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;">. Collection types can optimize their implementation of this method, since they typically offer an <em>O(1)</em> &#8211; complexity mechanism for finding the size of the collection. </span></div>
<p><span style="font-size:11pt;"> </span></p>
<h3 style="margin:10pt 0 0;"><span style="font-size:small;color:#4f81bd;font-family:cambria;">Extending IQueryable&lt;&gt;</span></h3>
<p class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span class="DO1"><strong><span style="font-size:11pt;color:#00b050;font-family:wingdings;"><span>þ</span></span></strong></span><span style="font-family:batang;"><span class="DO1"><strong><span style="font-size:11pt;color:#00b050;"> </span></strong></span><span class="DO1"><strong><span style="text-decoration:underline;"><span style="font-size:11pt;">Consider</span></span></strong></span></span><span style="font-size:11pt;"> implementing </span><span style="font-size:11pt;">IQueryable&lt;T&gt;</span></p>
<div class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;">when access to the query expression is necessary. For example, this applies for types representing potentially large data sets generated by remote processes, or for certain optimizations. An example of such a dataset is a database, the filesystem, or an in-memory dictionary that needs to be optimized for searching<span> </span>for values (rather than keys). </span></div>
<p><span style="font-size:11pt;"> </span></p>
<p class="DOFirst" style="margin:12pt 0 6pt 12.25pt;">
<div class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;">The following guidelines detail this further: </span></div>
<p><span style="font-size:11pt;"> </span></p>
<p class="DO" style="margin:12pt 0 6pt 12.25pt;"><span class="DO1"><span style="font-size:11pt;color:#ff0000;font-family:wingdings;"><span>ý</span></span></span><span style="font-family:batang;"><span class="DO1"><span style="font-size:11pt;color:#ff0000;"> </span></span><span class="DO1"><strong><span style="text-decoration:underline;"><span style="font-size:11pt;">Do not</span></span></strong></span><span style="font-size:11pt;"> implement </span></span><span style="font-size:11pt;">IQueryable&lt;T&gt;</span></p>
<div class="DO" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;"><span style="font-family:batang;">without understanding all the performance tradeoffs. </span></span></div>
<p><span style="font-size:11pt;"><span style="font-family:batang;"> </span></span></p>
<p class="DO" style="text-indent:-.25in;margin:12pt 0 6pt .5in;"><span style="font-size:11pt;font-family:symbol;"><span>·<span> </span></span></span><span style="font-size:11pt;"><span style="font-family:batang;">Building and parsing expression trees is expensive and many queries can actually get slower when </span></span><span style="font-size:11pt;">IQueryable&lt;T&gt;</span></p>
<div class="DO" style="text-indent:-.25in;margin:12pt 0 6pt .5in;"><span style="font-size:11pt;"><span style="font-family:batang;">is implemented. </span></span></div>
<p><span style="font-size:11pt;"><span style="font-family:batang;"> </span></span></p>
<p class="DO" style="text-indent:-.25in;margin:12pt 0 6pt .5in;"><span style="font-size:11pt;font-family:symbol;"><span>·<span> </span></span></span></p>
<div class="DO" style="text-indent:-.25in;margin:12pt 0 6pt .5in;"><span style="font-family:batang;"><span style="font-size:11pt;">The trade-off is acceptable in the LINQ to SQL case, since the alternative overhead of performing queries in memory would have been far greater than the transformation of the expression to an SQL statement and the delegation of the query processing to the database server</span>.</p>
<p></span></div>
<p><span style="font-family:batang;"><span style="font-size:11pt;"> </span></span></p>
<p class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span class="DO1"><strong><span style="font-size:11pt;color:#00b050;font-family:wingdings;"><span>þ</span></span></strong></span><span style="font-family:batang;"><span class="DO1"><strong><span style="font-size:11pt;color:#00b050;"> </span></strong></span><span class="DO1"><strong><span style="text-decoration:underline;"><span style="font-size:11pt;">Do</span></span></strong></span></span><span style="font-size:11pt;"> throw </span><span style="font-size:11pt;">NotSupportedException</span><span style="font-size:11pt;"> from </span><span style="font-size:11pt;">IQueryable&lt;T&gt;</span></p>
<div class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;">methods that cannot be logically supported by your data source. </span></div>
<p><span style="font-size:11pt;"> </span></p>
<p class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;">For example, imagine representing a media stream (like internet radio) as an </span><span style="font-size:11pt;">IQueryable&lt;&gt;</span><span style="font-size:11pt;">. The </span><span style="font-size:11pt;">Count</span></p>
<div class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;">method is not logically supported – the stream can be considered as infinite. </span></div>
<p><span style="font-size:11pt;"> </span></p>
<h3 style="margin:10pt 0 0;"><span style="font-size:small;color:#4f81bd;font-family:cambria;">Implementing the Query Pattern</span></h3>
<p class="BodyFirst" style="margin:10pt 0 0;"><span style="font-family:batang;"><span style="font-size:11pt;">The Query Pattern refers to defining the methods in </span>Figure <span>1</span><span style="font-size:11pt;"> without implemeting the </span></span><span style="font-size:11pt;">IEnumerable&lt;&gt;</span><span style="font-size:11pt;"><span style="font-family:batang;"> or </span></span><span style="font-size:11pt;">IQueryable&lt;&gt;</span></p>
<div class="BodyFirst" style="margin:10pt 0 0;"><span style="font-size:11pt;"><span style="font-family:batang;">interfaces. </span></span></div>
<p><span style="font-size:11pt;"><span style="font-family:batang;"> </span></span></p>
<p class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span class="DO1"><strong><span style="font-size:11pt;color:#00b050;font-family:wingdings;"><span>þ</span></span></strong></span><span style="font-family:batang;"><span class="DO1"><strong><span style="font-size:11pt;color:#00b050;"> </span></strong></span><span class="DO1"><strong><span style="text-decoration:underline;"><span style="font-size:11pt;">Do</span></span></strong></span></span><span style="font-size:11pt;"> implement at least the enumerable pattern (i.e. provide a </span><span style="font-size:11pt;">GetEnumerator</span></p>
<div class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;">method) for types representing collections of data. This is because the expectation is that the result of the query methods be foreach-able. </span></div>
<p><span style="font-size:11pt;"> </span></p>
<p class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span class="DO1"><strong><span style="font-size:11pt;color:#00b050;font-family:wingdings;"><span>þ</span></span></strong></span><span style="font-family:batang;"><span class="DO1"><strong><span style="font-size:11pt;color:#00b050;"> </span></strong></span><span class="DO1"><strong><span style="text-decoration:underline;"><span style="font-size:11pt;">Do</span></span></strong></span></span></p>
<div class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;">implement the Query Pattern as instance members on the new type, if the members make sense on the type even outside of the context of LINQ. Otherwise, use extension methods. </span></div>
<p><span style="font-size:11pt;"> </span></p>
<p class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span class="DO1"><strong><span style="font-size:11pt;color:#00b050;font-family:wingdings;"><span>þ</span></span></strong></span><span style="font-family:batang;"><span class="DO1"><strong><span style="font-size:11pt;color:#00b050;"> </span></strong></span><span class="DO1"><strong><span style="text-decoration:underline;"><span style="font-size:11pt;">Do</span></span></strong></span></span><span style="font-size:11pt;"> represent ordered sequences as a separate type. Define on this type the “</span><span style="font-size:11pt;">ThenBy</span></p>
<div class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;">” method. </span></div>
<p><span style="font-size:11pt;"> </span></p>
<p class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;">This follows the current pattern in the LINQ-to objects implementation, as well as allows for early (compile-time) detection of errors such as applying “</span><span style="font-size:11pt;">ThenBy</span><span style="font-size:11pt;">” to a not “</span><span style="font-size:11pt;">OrderBy</span></p>
<div class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;">”-ed sequence. </span></div>
<p><span style="font-size:11pt;"> </span></p>
<p class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;">For <span> </span>example, the framework provides the </span><span style="font-size:11pt;">IOrderedEnumerable&lt;&gt; </span><span style="font-size:11pt;">type, which is returned by “</span><span style="font-size:11pt;">OrderBy</span><span style="font-size:11pt;">”. The “</span><span style="font-size:11pt;">ThenBy</span><span style="font-size:11pt;">” extension method is defined for this type, and not for </span><span style="font-size:11pt;">IEnumerable&lt;&gt;</span></p>
<div class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;">. </span></div>
<p><span style="font-size:11pt;"> </span></p>
<p class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span class="DO1"><strong><span style="font-size:11pt;color:#00b050;font-family:wingdings;"><span>þ</span></span></strong></span><span style="font-family:batang;"><span class="DO1"><strong><span style="font-size:11pt;color:#00b050;"> </span></strong></span><span class="DO1"><strong><span style="text-decoration:underline;"><span style="font-size:11pt;">Consider</span></span></strong></span></span><span style="font-size:11pt;"> designing the LINQ operators to return specific enumerable types for domains that should be restricted. Essentially, one is free to return anything from a </span><span style="font-size:11pt;">Select</span><span style="font-size:11pt;"> query method, however, the expectation is that the query result type should be at least enumerable in a </span><span style="font-size:11pt;">foreach</span></p>
<div class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;">loop &#8211; see the example below, as well as the next guideline: </span></div>
<p><span style="font-size:11pt;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;">var set1=… </span></div>
<p><span style="font-size:8pt;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;">var set2=set1.Select(x=&gt;x.SomeIntProperty); </span></div>
<p><span style="font-size:8pt;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;">foreach(int i in set2){…} </span></div>
<p><span style="font-size:8pt;"> </span></p>
<p class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span class="DO1"><strong><span style="font-size:11pt;color:#00b050;font-family:wingdings;"><span>þ</span></span></strong></span><span style="font-family:batang;"><span class="DO1"><strong><span style="font-size:11pt;color:#00b050;"> </span></strong></span><span class="DO1"><strong><span style="text-decoration:underline;"><span style="font-size:11pt;">Do</span></span></strong></span></span></p>
<div class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;">defer execution of query operator implementations. The expected behavior of most of the Query Pattern members is that they simply construct a new object which, upon enumeration, produces the elements of the set which match the query. The evaluation time is, then, at enumeration. </span></div>
<p><span style="font-size:11pt;"> </span></p>
<p class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;">The following methods are exception from this rule: </span><span style="font-size:11pt;">All, Any, Average, Contains, Count, ElementAt, Empty, First, FirstOrDefault, Last, LastOrDefault, Max, Min, Single, Sum.</span></p>
<div class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;"> </span></div>
<p><span style="font-size:11pt;"> </span></p>
<p class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;">In the example above, the expectation is that the time necessary for evaluating the second line be be independent from the size or nature (e.g. in-memory or remote server) of </span><span style="font-size:11pt;">set1</span><span style="font-size:11pt;">. The general expectation is that this line simply prepares </span><span style="font-size:11pt;">set2</span></p>
<div class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;">, delaying the determination of its composition to the time of its enumeration. </span></div>
<p><span style="font-size:11pt;"> </span></p>
<p class="Body" style="margin:10pt 0 6pt;"><span style="font-family:batang;"> </span></p>
<p class="DO" style="margin:12pt 0 6pt 12.25pt;"><span><span><span style="font-family:batang;"> </span></span></span><span class="DO1"><span style="font-size:11pt;color:#ff0000;font-family:wingdings;"><span>ý</span></span></span><span style="font-family:batang;"><span class="DO1"><span style="font-size:11pt;color:#ff0000;"> </span></span><span class="DO1"><strong><span style="text-decoration:underline;"><span style="font-size:11pt;">Avoid</span></span></strong></span><span style="font-size:11pt;"> implementing just a part of the Query Pattern, if fallback to the basic </span></span><span style="font-size:11pt;">IEnumerable&lt;T&gt;</span></p>
<div class="DO" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;"><span style="font-family:batang;">implementations is undesirable. </span></span></div>
<p><span style="font-size:11pt;"><span style="font-family:batang;"> </span></span></p>
<p class="DO" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;"><span style="font-family:batang;">For example, consider a user-defined type T, which implements </span></span><span style="font-size:11pt;">IEnumerable&lt;&gt;</span><span style="font-size:11pt;"><span style="font-family:batang;">. T has an override for </span></span><span style="font-size:11pt;">Count</span><span style="font-size:11pt;"><span style="font-family:batang;">, but not for </span></span><span style="font-size:11pt;">Where</span></p>
<div class="DO" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;"><span style="font-family:batang;">. Consider then the following example: </span></span></div>
<p><span style="font-size:11pt;"><span style="font-family:batang;"> </span></span></p>
<p class="NL" style="margin:2pt 0 0 24pt;">
<div class="NL" style="margin:2pt 0 0 24pt;"><span style="font-size:8pt;font-family:courier;">var query=someT.Where(f2).Count(); </span></div>
<p><span style="font-size:8pt;font-family:courier;"> </span></p>
<p class="NL" style="margin:2pt 0 0 24pt;"><span style="font-family:batang;"> </span></p>
<p class="NL" style="text-indent:0;margin:2pt 0 0;"><span style="font-size:11pt;"><span style="font-family:batang;">In this example, any opportunities for optimization are lost after the </span></span><span style="font-size:11pt;">Where </span><span style="font-size:11pt;"><span style="font-family:batang;">call. The </span></span><span style="font-size:11pt;">Count </span><span style="font-size:11pt;"><span style="font-family:batang;">version used is the one defined for </span></span><span style="font-size:11pt;">IEnumerable&lt;&gt;</span><span style="font-size:11pt;"><span style="font-family:batang;">.</span></span></p>
<p class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span class="DO1"><strong><span style="font-size:11pt;color:#00b050;font-family:wingdings;"><span>þ</span></span></strong></span><span style="font-family:batang;"><span class="DO1"><strong><span style="font-size:11pt;color:#00b050;"> </span></strong></span><span class="DO1"><strong><span style="text-decoration:underline;"><span style="font-size:11pt;">Do</span></span></strong></span></span><span style="font-size:11pt;"> place query extensions methods in a “</span><span style="font-size:11pt;">Linq</span><span style="font-size:11pt;">” sub-namespace of the main namespace. For example, extension methods for </span><span style="font-size:11pt;">System.Data</span><span style="font-size:11pt;"> features reside in </span><span style="font-size:11pt;">System.Data.Linq</span></p>
<div class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;">namespace. </span></div>
<p><span style="font-size:11pt;"> </span></p>
<p class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span class="DO1"><strong><span style="font-size:11pt;color:#00b050;font-family:wingdings;"><span>þ</span></span></strong></span><span style="font-family:batang;"><span class="DO1"><strong><span style="font-size:11pt;color:#00b050;"> </span></strong></span><span class="DO1"><strong><span style="text-decoration:underline;"><span style="font-size:11pt;">Do</span></span></strong></span></span><span style="font-size:11pt;"> use </span><span style="font-size:11pt;">Expression&lt;Func&lt;&gt;&gt;</span><span style="font-size:11pt;"> as a parameter instead of </span><span style="font-size:11pt;">Func&lt;&gt;</span></p>
<div class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;">when it is necessary to inspect the query. </span></div>
<p><span style="font-size:11pt;"> </span></p>
<p class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;">As it was discussed, interacting with an SQL database is already done through </span><span style="font-size:11pt;">IQueryable&lt;T&gt;</span><span style="font-size:11pt;"> rather than </span><span style="font-size:11pt;">IEnumerable&lt;T&gt;</span></p>
<div class="DOFirst" style="margin:12pt 0 6pt 12.25pt;"><span style="font-size:11pt;">, since this gives an opportunity to translate lambda expressions to SQL expressions. </span></div>
<p><span style="font-size:11pt;"> </span></p>
<p class="MsoNormal" style="margin:0 0 10pt;"><span style="font-size:11pt;line-height:115%;">An alternative reason for implementing </span><span style="font-size:11pt;line-height:115%;">IQueryable&lt;T&gt;</span><span style="font-size:11pt;line-height:115%;"> is performing optimizations. For example, a sorted list can implement lookup (“</span><span style="font-size:11pt;line-height:115%;">Where</span><span style="font-size:11pt;line-height:115%;">” clauses) with binary search, which can be much more efficient than the standard </span><span style="font-size:11pt;line-height:115%;">IEnumerable&lt;T&gt;</span><span style="font-size:11pt;line-height:115%;"> or </span><span style="font-size:11pt;line-height:115%;">IQueryable&lt;T&gt;</span><span style="font-size:11pt;line-height:115%;"> implementations.</span></p>
<p class="MsoNormal" style="margin:0 0 10pt;">
<div id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:dbb41ede-8f5a-4b8f-8c8e-3de592784595" class="wlWriterSmartContent" style="display:inline;float:none;margin:0;padding:0;">Technorati Tags: <a rel="tag" href="http://technorati.com/tags/Linq">Linq</a>,<a rel="tag" href="http://technorati.com/tags/Fluent+API">Fluent API</a>,<a rel="tag" href="http://technorati.com/tags/Frawork+Design">Frawork Design</a>,<a rel="tag" href="http://technorati.com/tags/Adaptable+Software">Adaptable Software</a>,<a rel="tag" href="http://technorati.com/tags/DSLs">DSLs</a>,<a rel="tag" href="http://technorati.com/tags/C%23+3.0">C# 3.0</a></div>
<div id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:a166856f-521d-414d-9627-046f41895c0d" class="wlWriterSmartContent" style="display:inline;float:none;margin:0;padding:0;">del.icio.us Tags: <a rel="tag" href="http://del.icio.us/popular/Linq">Linq</a>,<a rel="tag" href="http://del.icio.us/popular/Fluent+API">Fluent API</a>,<a rel="tag" href="http://del.icio.us/popular/Frawork+Design">Frawork Design</a>,<a rel="tag" href="http://del.icio.us/popular/Adaptable+Software">Adaptable Software</a>,<a rel="tag" href="http://del.icio.us/popular/DSLs">DSLs</a>,<a rel="tag" href="http://del.icio.us/popular/C%23+3.0">C# 3.0</a></div>
<div class="wlWriterHeaderFooter" style="text-align:right;margin:0;padding:4px 0;"><a href="http://digg.com/submit?url=http%3a%2f%2fdcarr.wordpress.com%2f2008%2f07%2f27%2flinq-framework-design-guidelines-great-content-from-the-upcoming-book%2f&amp;title=Linq+Framework+Design+Guidelines+%3a+don%e2%80%99t+wait+for+the+book+update"><img style="border:0;" src="http://digg.com/img/badges/100x20-digg-button.png" border="0" alt="Digg This" width="100" height="20" /></a></div>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/dcarr.wordpress.com/557/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/dcarr.wordpress.com/557/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/dcarr.wordpress.com/557/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/dcarr.wordpress.com/557/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/dcarr.wordpress.com/557/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/dcarr.wordpress.com/557/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/dcarr.wordpress.com/557/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/dcarr.wordpress.com/557/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/dcarr.wordpress.com/557/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/dcarr.wordpress.com/557/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/dcarr.wordpress.com/557/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/dcarr.wordpress.com/557/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=557&subd=dcarr&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://team.pushbomb.com/2008/07/27/linq-framework-design-guidelines-great-content-from-the-upcoming-book/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7b572cbcda5a17fe984e7dd1ddc9c3d6?s=96&#38;d=&#38;r=PG" medium="image">
			<media:title type="html">pushbomb</media:title>
		</media:content>

		<media:content url="http://digg.com/img/badges/100x20-digg-button.png" medium="image">
			<media:title type="html">Digg This</media:title>
		</media:content>
	</item>
		<item>
		<title>Sharepoint 2007 Business Data Catalog API Import : Extended Options</title>
		<link>http://team.pushbomb.com/2008/06/11/sharepoint-2007-business-data-catalog-api-import-from-nhibernate/</link>
		<comments>http://team.pushbomb.com/2008/06/11/sharepoint-2007-business-data-catalog-api-import-from-nhibernate/#comments</comments>
		<pubDate>Thu, 12 Jun 2008 04:45:00 +0000</pubDate>
		<dc:creator>Damon Wilder Carr</dc:creator>
				<category><![CDATA[Software Design]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[sharepoint]]></category>
		<category><![CDATA[BDC]]></category>
		<category><![CDATA[Business Domain Controller]]></category>
		<category><![CDATA[Domain.Driven.NET]]></category>
		<category><![CDATA[dsl]]></category>
		<category><![CDATA[Hibernate]]></category>
		<category><![CDATA[Metadata]]></category>
		<category><![CDATA[MOSS]]></category>
		<category><![CDATA[MOSS 2007]]></category>
		<category><![CDATA[nhibernate]]></category>
		<category><![CDATA[SharePoint 2007]]></category>
		<category><![CDATA[SharePoint Business Data Catalog BDC]]></category>
		<category><![CDATA[Sharepoint ORM]]></category>

		<guid isPermaLink="false">http://dcarr.wordpress.com/2007/09/05/sharepoint-2007-business-data-catalog-api-import-from-nhibernate/</guid>
		<description><![CDATA[When 2007 MOSS was released I was a bit disappointed with the integration options provided in the BDC while happy with much else. 

Frankly, although they worked, they are a 'lowest common denominator' (which I do realize was likely the only choice Microsoft had).<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=87&subd=dcarr&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>When 2007 MOSS was released I was a bit disappointed with the integration options provided in the BDC. Frankly, although they worked, they are a &#8216;lowest common denominator&#8217; (which I do realize was likely the only choice Microsoft had).</p>
<p>They could of however made the interface open, enabling a &#8216;provider/consumer&#8217; style interface as they have so often before. We know in software that the strategy design pattern is often at the heart of well architected enterprise software (which is a technique to empower dynamic change and flexibility in your solution &#8211; considering your OK in areas such as security, production deployment, scalability, etc.).</p>
<p>My clients often have their core information as &#8216;domain entities&#8217; and this all but eliminates the disconnects caused by having to translate a &#8216;customer&#8217; to an Oracle structure (for example) It&#8217;s JUST A CUSTOMER. Let the domain layer do the mapping, persistence and other work that is non-value added now. And their web service demands on the organization in my experience require a compeletely new development effort in most cases&#8230; Not good&#8230;Better then nothing but we can do better.</p>
<p>In this spirit, I am working on a utility to automate the importing of information from the following sources:</p>
<div>
<p>1) <b>Domain Objects as Source</b> (not tables): Hibernate XML Mappings . We treat NHibernate/Hibernate&#8217;s meta mapping from object to relation as the Industry Standard.<a href="http://www.hibernate.org/hib_docs/nhibernate/1.2/reference/en/html/mapping-attributes.html"></a></p>
<div>2) <b>Parsing into the Business Data Catalog directly</b> (not converting these to the BDC XML format, and then importing but doing a direct sync at the BDC API level)</div>
<div>2) Relational Data Sources with Metadata Info available</div>
<p>3) <b>OPTIONAL: WSDL for Web Services </b>not the mandates on WHAT your web services are<b><br />
</b></p>
<p>And the unfortunate fact is the web service interface required for BDC integration is quite &#8216;un-service oriented&#8217;. It&#8217;s RPC based&#8230; Exactly (again) what we are all moving away from. <b></b></p>
<p align="center"><a title="Photo Sharing" href="http://www.flickr.com/photos/damoncarr/1332477259/"><img class="alignright" style="border:3px solid black;margin:3px;" src="http://farm2.static.flickr.com/1213/1332477259_b811a0e0b5.jpg" alt="Sharepoint 2007 Incorrect Key Example" width="350" height="238"/></a></p>
<div>
<p><i><span style="font-size:78%;">MetaMan tool for the Business Data Catalog</span></i></p>
<div>I believe the most compelling aspect here will be the mapping from NHibernate classes with appropriate mappings.. This is a standard for me and my work. I really hate the fact that after moving away from client/server architectures to Domain Driven architectures, we must move back to RDBMS access for integration.</div>
<div>
<p>So instead of classes you would see something a UML style class diagram populated from .NET Reflection in the work I am doing (although this UI is coming last, then a Visual Studio 2008/2005 addin).</p>
</div>
<div>And the story for web services is not much better. For me (and I hope for others) I do not want to link the Business Data Catalog to my database, I want to link it to my crafted domain model. This work should make that possible.</div>
<p>The idea is to let people automate almost all of the somewhat tedious process (even with the new <a href="http://www.microsoft.com/downloads/details.aspx?familyid=6d94e307-67d9-41ac-b2d6-0074d6286fa9&amp;displaylang=en">Microsoft utility for BDC Admin </a>or the <a href="http://www.bdcmetaman.com/">MetaMan tool</a>).</p>
<p>Both have their places, don&#8217;t get me wrong. However there is sufficient metadata already available typically in SOME source in the organization. It is a bit silly to have yet another (although you really have no choice).</p>
<p>So if you can integrate these and &#8216;publish&#8217; a BDC application to Sharepoint 2007 (as much as possible anyway) it&#8217;s easier.</p>
<p>One silly thing I have seen in both tools:</p>
<p>1) They assume a clustered index is the primary key on the database table.</p>
</div>
<div>Examples from the standard Lyris Email Marketing Database:</div>
<p align="center"><a title="Photo Sharing" href="http://www.flickr.com/photos/damoncarr/1332485803/"><img src="http://farm2.static.flickr.com/1029/1332485803_c3a262d2d4.jpg" alt="Sharepoint 2007 Incorrect Key Example - Microsoft BDC Editor" width="500" height="334"/></a></p>
<div>
<p>See above for MetaMan&#8230;</p>
<p>This makes no sense for a few reasons. For core fact tables rarely would this be true. Clustered indexes are typically (or should be) on foreign keys, for rapid access when that is the usual way the information is retrieved.</p>
<p>Unfortunately many developers forget this simple optimization, however it is strange that these tools would make the same invalid assumption.</p>
<p>EXAMPLE:</p>
<p>Customer table<br />
Invoice table<br />
InvoiceDetail table</p>
<p>For the Sharepoint 2007 BDC all entities must have a single key enumerator which is exposed via the &#8216;ID Enumerator&#8217; method (you can have 1 per entity).</p>
<p>This is used for iterating results for searching, query string parameter passing for custom actions, etc.</p>
<p>So logically the above would have these keys:</p>
<p>Customer &#8211; CustomerID (identity or Oracle Sequence)<br />
Invoice &#8211; Invoice ID (identity or Oracle Sequence)<br />
InvoiceDetail &#8211; InvoiceDetailID (identity or Oracle Sequence)</p>
<p>In your domain, it&#8217;s a given that InvoiceDetail rows are access by InvoiceID most often. Therefore you should have your clustered index on the InvoiceID foreign key.</p>
<p>etc&#8230; This is fairly obvious stuff here guys!</p>
<p>So rather then try to write out the XML Format, I am bypassing that completely and using the API.</p>
<p>So far this is working and should allow a somewhat dramatic improvement for linking line of business solutions in your enterprise with the many benefits the Sharepoint 2007 Business Data Catalog provides.</p>
</div>
</div>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/dcarr.wordpress.com/87/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/dcarr.wordpress.com/87/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/dcarr.wordpress.com/87/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/dcarr.wordpress.com/87/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/dcarr.wordpress.com/87/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/dcarr.wordpress.com/87/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/dcarr.wordpress.com/87/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/dcarr.wordpress.com/87/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/dcarr.wordpress.com/87/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/dcarr.wordpress.com/87/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/dcarr.wordpress.com/87/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/dcarr.wordpress.com/87/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=87&subd=dcarr&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://team.pushbomb.com/2008/06/11/sharepoint-2007-business-data-catalog-api-import-from-nhibernate/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7b572cbcda5a17fe984e7dd1ddc9c3d6?s=96&#38;d=&#38;r=PG" medium="image">
			<media:title type="html">pushbomb</media:title>
		</media:content>

		<media:content url="http://farm2.static.flickr.com/1213/1332477259_b811a0e0b5.jpg" medium="image">
			<media:title type="html">Sharepoint 2007 Incorrect Key Example</media:title>
		</media:content>

		<media:content url="http://farm2.static.flickr.com/1029/1332485803_c3a262d2d4.jpg" medium="image">
			<media:title type="html">Sharepoint 2007 Incorrect Key Example - Microsoft BDC Editor</media:title>
		</media:content>
	</item>
		<item>
		<title>Advanced C# 3.0: Part 3 &#8211; New Language Features as &#8216;Domain Specific&#8217; as well as General Purpose Extensions</title>
		<link>http://team.pushbomb.com/2008/05/27/advanced-c-30-part-3-new-language-features-as-domain-specific-as-well-as-general-purpose-extensions/</link>
		<comments>http://team.pushbomb.com/2008/05/27/advanced-c-30-part-3-new-language-features-as-domain-specific-as-well-as-general-purpose-extensions/#comments</comments>
		<pubDate>Tue, 27 May 2008 22:42:46 +0000</pubDate>
		<dc:creator>Damon Wilder Carr</dc:creator>
				<category><![CDATA[C# 3.0 Enhancements]]></category>
		<category><![CDATA[C# 3.0 for Internal DSL]]></category>
		<category><![CDATA[Framework Design]]></category>
		<category><![CDATA[Proof Driven Development]]></category>
		<category><![CDATA[Software Design]]></category>
		<category><![CDATA[Software Futures]]></category>
		<category><![CDATA[agile practices]]></category>
		<category><![CDATA[reflection]]></category>
		<category><![CDATA[resharper]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[dsl]]></category>
		<category><![CDATA[Frameworks]]></category>
		<category><![CDATA[GAT]]></category>
		<category><![CDATA[Resharper]]></category>
		<category><![CDATA[TDD]]></category>

		<guid isPermaLink="false">http://dcarr.wordpress.com/2008/05/27/advanced-c-30-part-3-new-language-features-as-domain-specific-as-well-as-general-purpose-extensions/</guid>
		<description><![CDATA[One of the compelling directions beyond 'the basics' of domain-driven development is the advent and increasing use of 'DSL' (Domain Specific Language) technology in .NET. We have had a rich set of features since the 2005 release of Visual Studio in the Guidance Automation Toolkit and the DSL Toolkit and these have become even more compelling. However for some needs, the language now may provide enough for many smaller cases.

Now that new .NET 3.5 C# 3.0 features are allowing us to make the Framework API of .NET work in ways not present 'out of the box' the scope of what is possible can be deep and broad.<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=238&subd=dcarr&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>One of the compelling directions beyond &#8216;the basics&#8217; of domain-driven development is the advent and increasing use of &#8216;DSL&#8217; (Domain Specific Language) technology in .NET. We have had a rich set of features since the 2005 release of Visual Studio in the <a href="http://msdn.microsoft.com/en-us/vsx/default.aspx">Guidance Automation Toolkit</a> and the <a href="http://msdn.microsoft.com/en-us/library/bb126235.aspx">DSL Toolkit</a> and these have become even more compelling. I wrote about this back in January, 2006 <a href="http://www.developerland.com/DotNet/Design/444.aspx">as published here</a>. However for some needs, the language now may provide enough for many smaller cases.</p>
<blockquote><p align="center">Keep in mind, this post is not focused on DSL topics (one any developer cannot really afford to miss now), so one could debate the merits of the link I make. My argument is this:</p>
<p align="center">My definition of a DSL is very simply :</p>
</blockquote>
<p>A Domain Specific Language is a way, typically using a combination of visual and textual methods, or just textual, to solve a limited but typically non-trivial set of problems. It is typically a smaller stand-alone &#8216;language&#8217; or language-extension to a larger more horizontal language such as C# (the point I make here is C# has evolved to allow you to expand C# with DSLs you write in C#. This is very different the the DSL Toolkit and I have never had this opinion until I finally got to be immersed deeply in functional style programming enhancements to C# and the ease of extending just about any API with extensions..</p>
<p><a href="http://damon.agilefactor.com/domain-specific-languages-central-to-staying-relevant/">I continue the discussion of what a DSL is here.</a> I will be adding to this section of the site over time but if you just want the listed info, no need to go on a tangent now.</p>
<blockquote><p><strong>Now that new .NET 3.5 C# 3.0 features are allowing us to make the Framework API of .NET work in ways not present &#8216;out of the box&#8217; the scope of what is possible can be deep and broad.</strong></p>
</blockquote>
<h2>Part 1 : The DSL Perspective &#8211; A Real Example</h2>
<p>I&#8217;ll use a project we are working on now, which is quite specifically aimed to</p>
<ul>
<li>Minimize the configuration overhead of using an Inversion of Control container </li>
<li>Provide the benefit of &#8216;provider/container&#8217; independence </li>
<li>Allow the consumer to change &#8216;container provider&#8217; vendors with a simple change in &#8216;meta configuration&#8217; </li>
</ul>
<p>In other words, we are trying to create an abstraction on top of an abstraction, as we believe this particular area is now mature enough (and indeed this is how software engineering historically more then not progresses over time) to do so.</p>
<p>This project has no intention of BEING an inversion of control container nor a dependency injector, rather its aim is to allow people to make use of these critical concepts in much easier ways while eliminating hesitation related to provider lock-in.</p>
<p>It&#8217;s no secret we are massive fans of the work of the <a href="http://www.castleproject.org/">Castle Project</a> and they are indeed the first &#8216;plug-in&#8217; adapter we are on schedule to deliver. However the architecture (something this post is NOT trying to explain) of our solution models the DOMAIN of this area, and is not specific to any particular offering (although to be blunt I would say if any bias existed it would be from the conceptual framework that exists now in the <a href="http://www.castleproject.org/container/index.html">Windsor Container/MicroKernal trunk</a>).</p>
<h4>A domain specific example</h4>
<p>In the area of ASP.NET one technique for loading our solution into memory is via the IHttpModule implementation we provide. Here is what the custom global.asax.cs code looks like:</p>
<p><span style="background:black 0 50%;color:#9bdd22;">public abstract class </span><span style="background:black 0 50%;color:#8bcfe2;">IntegrationPoint </span><span style="background:black 0 50%;color:#feba1b;">: </span><span style="background:black 0 50%;color:#8bcfe2;">HttpApplication</span><span style="background:black 0 50%;color:#feba1b;">, </span><span style="background:black 0 50%;color:#2b91af;">IDomainApplication </span><span style="background:black 0 50%;color:#feba1b;">{ </span></p>
<p><span style="background:black 0 50%;color:#9bdd22;">private static </span><span style="background:black 0 50%;color:#2b91af;">IZeroConfigDI </span><span style="background:black 0 50%;color:#feba1b;">_container; </span></p>
<p><span style="background:black 0 50%;color:#808080;">/// &lt;summary&gt;      <br /></span><span style="background:black 0 50%;color:#808080;">/// </span><span style="background:black 0 50%;color:#008000;">Executes custom initialization code after      <br /></span><span style="background:black 0 50%;color:#808080;">/// </span><span style="background:black 0 50%;color:#008000;">all event handler      <br /></span><span style="background:black 0 50%;color:#808080;">/// </span><span style="background:black 0 50%;color:#008000;">modules have been added.      <br /></span><span style="background:black 0 50%;color:#808080;">/// </span><span style="background:black 0 50%;color:#008000;">Also acquire a reference to the HttpModule      <br /></span><span style="background:black 0 50%;color:#808080;">/// </span><span style="background:black 0 50%;color:#008000;">for IoC / DI if present as a module      <br /></span><span style="background:black 0 50%;color:#808080;">/// &lt;/summary&gt;      <br />&#160;</span><span style="background:black 0 50%;color:#9bdd22;">public override void </span><span style="background:black 0 50%;color:#feba1b;">Init() {<span style="background:black 0 50%;color:#feba1b;">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </span></span></p>
<div><span style="background:black 0 50%;color:#feba1b;"><span style="background:black 0 50%;color:#feba1b;">&#160;&#160;&#160;&#160;&#160;&#160;&#160; _container = Modules.GetIoCModule(); </span></span></div>
<div><span style="background:black 0 50%;color:#feba1b;"><span style="background:black 0 50%;color:#feba1b;">&#160;&#160;&#160;&#160;&#160; </span></span><span style="background:black 0 50%;color:#9bdd22;">&#160;&#160;&#160; base</span><span style="background:black 0 50%;color:#feba1b;">.Init();</span></div>
<div><span style="background:black 0 50%;color:#feba1b;"></span></div>
<div><span style="background:black 0 50%;color:#feba1b;"><span style="background:black 0 50%;color:#feba1b;">} </span></span>
</p></div>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p>The interesting areas which are not provided by Microsoft include:</p>
<ol>
<li>IDomainApplication interface </li>
<li>IZeriConfigDI Interface static reference </li>
<li>Modules.GetIoCModule() </li>
</ol>
<p>The first two have more to do with our solution then the topic of this post, so I&#8217;ll focus on #3.</p>
<p>As this code is inside the HttpApplication, we have access to the Modules property which is read-only. Here is the documentation:</p>
<p>&#160;</p>
<table cellspacing="10" cellpadding="10" width="648" border="1">
<tbody>
<tr>
<td valign="top" width="626">
<h2>System.Web.HttpModuleCollection Modules { get; }</h2>
<p> 
<p align="center"><font color="#ffffff"><span style="color:#6682ee;"><font color="#ffffff"><strong></strong>                  <br /></font></span></font></p>
<p align="left"><span style="color:#6682ee;"><font color="#ffffff"><font color="#ffffff"><span style="color:#6682ee;"><font color="#ffffff"><em>Member of System.Web.HttpApplication</em></font></span></font><span style="color:#6682ee;"><font color="#ffffff"> </font></span></font></span></p>
<p align="left"><span style="color:#6682ee;"><font color="#ffffff"><span style="color:#6682ee;"><font color="#ffffff">                   <br />Gets the collection of modules for the current application.</font></span><span style="color:#6682ee;"><font color="#ffffff">Returns:                    <br />An System.Web.HttpModuleCollection that contains the names of the modules for the application.                     <br /></font></span></font></span></p>
</td>
</tr>
</tbody>
</table>
<p><span style="color:#000000;"><a href="http://11011.net/software/vspaste"></a></span></p>
<p>Your first reaction if your familiar with this collection is that it does not have anything even close to the GetIoCModule() method we are calling above.</p>
<p>Indeed this is our &#8216;domain specific&#8217; extension to the .NET Framework API (one of many for this solution).</p>
<p>Here is the implementation of this &#8216;DSL&#8217; extension:</p>
<p><font color="#484848"><span style="background:black 0 50%;color:#808080;">/// &lt;summary&gt;        <br /></span><span style="background:black 0 50%;color:#808080;">/// </span></font><font color="#484848"><span style="background:black 0 50%;color:#008000;">Provides ‘DSL specific’ extensions to the ASP.NET environment for        <br /></span><span style="background:black 0 50%;color:#808080;">/// </span><span style="background:black 0 50%;color:#008000;">the IoC Zero Config environment which is not new (after all this becomes a static)</span></font><span style="background:black 0 50%;color:#008000;"><font color="#484848">        <br /></font></span><font color="#484848"><span style="background:black 0 50%;color:#808080;">/// &lt;/summary&gt;        <br /></span><span style="background:black 0 50%;color:#808080;">/// </span><span style="background:black 0 50%;color:#008000;">The entire point for extension methods is ‘Fluency in API’ as it allows ‘shorthand’ code</span></font></p>
<p><font color="#484848"><span style="background:black 0 50%;color:#9bdd22;">public static class </span><span style="background:black 0 50%;color:#8bcfe2;">ZeroConfigInstanceResolver </span><span style="background:black 0 50%;color:#feba1b;">{ </span></font></p>
<p><font color="#484848"><span style="background:black 0 50%;color:#9bdd22;">private const string </span><span style="background:black 0 50%;color:#feba1b;">ZeroConfigTypeString = </span><span style="background:black 0 50%;color:#a31515;">&quot;IoCConfigModule.IHttpModel&quot;</span><span style="background:black 0 50%;color:#feba1b;">;</span></font></p>
<p><span style="background:black 0 50%;color:#feba1b;"></span><span style="background:black 0 50%;color:#feba1b;"><font color="#484848">&#160;</font></span><font color="#484848"><span style="background:black 0 50%;color:#808080;">/// &lt;summary&gt;        <br /></span><span style="background:black 0 50%;color:#808080;">/// </span></font><font color="#484848"><span style="background:black 0 50%;color:#008000;">Gets the IZeroConfigDI reference        <br /></span><span style="background:black 0 50%;color:#808080;">/// </span></font><font color="#484848"><span style="background:black 0 50%;color:#008000;">(using domain specific logic and the&#160; <br /></span><span style="background:black 0 50%;color:#808080;">/// </span></font><span style="background:black 0 50%;color:#008000;"><font color="#484848">generic logic extending the container)        <br /></font></span><font color="#484848"><span style="background:black 0 50%;color:#808080;">/// &lt;/summary&gt;        <br /></span><span style="background:black 0 50%;color:#808080;">/// &lt;param name=&quot;container&quot;&gt;</span><span style="background:black 0 50%;color:#008000;">The container.</span></font><font color="#484848"><span style="background:black 0 50%;color:#808080;">&lt;/param&gt;        <br /></span><span style="background:black 0 50%;color:#808080;">/// &lt;returns&gt;&lt;/returns&gt; </span></font></p>
<p><font color="#484848"><span style="background:black 0 50%;color:#9bdd22;">public static </span><span style="background:black 0 50%;color:#2b91af;">IZeroConfigDI </span><span style="background:black 0 50%;color:#feba1b;">GetIoCModule(</span><span style="background:black 0 50%;color:#9bdd22;">this </span><span style="background:black 0 50%;color:#8bcfe2;">HttpModuleCollection </span><span style="background:black 0 50%;color:#feba1b;">container) {</span></font></p>
<p><span style="background:black 0 50%;color:#feba1b;"><font color="#484848">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </font></span><span style="background:black 0 50%;color:#9bdd22;"><font color="#484848">return        <br /></font></span><font color="#484848"><span style="background:black 0 50%;color:#feba1b;">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; container.FindInstance(        <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; () =&gt;         <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; container.Get(ZeroConfigTypeString)         <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </span><span style="background:black 0 50%;color:#feba1b;">&#160;</span><span style="background:black 0 50%;color:#9bdd22;">as </span><span style="background:black 0 50%;color:#2b91af;">IZeroConfigDI</span><span style="background:black 0 50%;color:#feba1b;">); </span></font></p>
<p><span style="background:black 0 50%;color:#feba1b;"><font color="#484848">}</font></span></p>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p>As you can see above we are very specific in our intent to add this to the HttpModuleCollection. There is nothing that interesting above except for the method call FindInstance(Func&lt;TResult&gt;) off the target &#8216;container&#8217;. This is a peek into the non-DSL related extension that represents. You might be aware that there is no such FindInstance available off the HttpModuleCollection.</p>
<p>One of our many goals in creating a fluent, easily used API is reducing complexity and providing very maintainable code. Here you can see the Lambada expression required to locate our service is hidden from the developer completely, yet this code is not a &#8216;one-off&#8217; as we have provided both a DSL level extension in concert with a far more generic extension.</p>
<h2>Part 2: Extending the Horizontal to Empower the Domain Specific</h2>
<p>In looking at the HttpModuleCollection, and in our desire to facilitate other sources of resolving our module, it inherits from the abstract parent NameObjectCollectionBase.</p>
<p>Here is the definition of what inherits from this abstract parent:</p>
<table cellspacing="0" cellpadding="2" width="400" border="1">
<tbody>
<tr>
<td valign="top" width="400"> <br />
<h2>public abstract class NameObjectCollectionBase </h2>
<p>Member of System.Collections.SpecializedSummary:           </p>
<p><em>Provides the abstract base class for a collection of associated System.String keys and System.Object values that can be accessed either with the key or with the index.</em></td>
</tr>
</tbody>
</table>
<p><a href="http://dcarr.files.wordpress.com/2008/05/found.jpg"></a></p>
<p>The issue arises as this abstract base leaves it up to its concrete implementer to provide the indexer (or say Get() method) to access the object desired. Therefore a nice way to enhance this abstract type to work across all of the children is to literally pass in the method to resolve the object desired.</p>
<h2>Part 3 : The Generic Extension</h2>
<p>Here is the trivial extension method used to &#8216;open up&#8217; the NameObjectCollectionBase and which is used above:</p>
<p><span style="background:black 0 50%;color:#808080;">/// &lt;summary&gt;      <br />/// </span><span style="background:black 0 50%;color:#008000;">Finds the instance in the NameObjectCollectionBase      <br /></span><span style="background:black 0 50%;color:#808080;">/// </span><span style="background:black 0 50%;color:#008000;">using the Functor      <br /></span><span style="background:black 0 50%;color:#808080;">/// &lt;/summary&gt;      <br />/// &lt;typeparam name=&quot;TContainer&quot;&gt;</span><span style="background:black 0 50%;color:#008000;">The type of the container.</span><span style="background:black 0 50%;color:#808080;">&lt;/typeparam&gt;      <br />/// &lt;typeparam name=&quot;TResult&quot;&gt;</span><span style="background:black 0 50%;color:#008000;">The type of the result.</span><span style="background:black 0 50%;color:#808080;">&lt;/typeparam&gt;      <br />/// &lt;param name=&quot;container&quot;&gt;</span><span style="background:black 0 50%;color:#008000;">The container.</span><span style="background:black 0 50%;color:#808080;">&lt;/param&gt;      <br />/// &lt;param name=&quot;finder&quot;&gt;</span><span style="background:black 0 50%;color:#008000;">The finder.</span><span style="background:black 0 50%;color:#808080;">&lt;/param&gt;      <br />/// &lt;returns&gt;&lt;/returns&gt;       <br /></span><span style="background:black 0 50%;color:#9bdd22;">public static </span><span style="background:black 0 50%;color:#feba1b;">TResult FindInstance&lt;TContainer, TResult&gt;      <br />&#160;&#160;&#160;&#160;&#160;&#160; (</span><span style="background:black 0 50%;color:#9bdd22;">this </span><span style="background:black 0 50%;color:#feba1b;">TContainer container, </span><span style="background:black 0 50%;color:#2b91af;">Func</span><span style="background:black 0 50%;color:#feba1b;">&lt;TResult&gt; finder)      <br /></span><span style="background:black 0 50%;color:#9bdd22;">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; where </span><span style="background:black 0 50%;color:#feba1b;">TContainer : </span><span style="background:black 0 50%;color:#8bcfe2;">NameObjectCollectionBase </span><span style="background:black 0 50%;color:#9bdd22;">where </span><span style="background:black 0 50%;color:#feba1b;">TResult : </span><span style="background:black 0 50%;color:#9bdd22;">class </span><span style="background:black 0 50%;color:#feba1b;">{ </span></p>
<p><span style="background:black 0 50%;color:#feba1b;">     <br /></span><span style="background:black 0 50%;color:#9bdd22;">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return </span><span style="background:black 0 50%;color:#feba1b;">finder();      </p>
<p>} </span></p>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p>Since we cannot abstract up the get method, we take a page from Functional Programming and literally pass in the code to execute (which we do above).</p>
<p>A common pattern is to expose methods like the above, but add additional versions that allow more parameters into the Func&lt;TResult&gt;. This is well covered well by many of the Linq references and books available.</p>
<h2>Part 4: How this allows us to embrace deep/wide change</h2>
<p>A simplistic example is supporting the acquisitions of our target reference (IZeroConfigDI) if it is set as ApplicationState or as an IHttpModule. We could make the design decision to allow our find method to reside literally as an extension method of our HttpApplication (and indeed this turns out to be a reasonable choice as the valid inheritors from NameObjectCollectionBase are sealed and therefore invalid as generic constraints). Here is one approach (not ideal and not our final code but this illustrates the point.) Why not offer your optimized solution?</p>
<p>CODE:</p>
<p><span style="background:black 0 50%;color:#9bdd22;">public abstract class </span><span style="background:black 0 50%;color:#8bcfe2;">IntegrationPoint </span><span style="background:black 0 50%;color:#feba1b;">: </span><span style="background:black 0 50%;color:#8bcfe2;">HttpApplication</span><span style="background:black 0 50%;color:#feba1b;">, </span><span style="background:black 0 50%;color:#2b91af;">IDomainApplication </span><span style="background:black 0 50%;color:#feba1b;">{</span> </p>
</p>
<p> <span style="background:black 0 50%;color:#9bdd22;">private static </span><span style="background:black 0 50%;color:#2b91af;">IZeroConfigDI </span><span style="background:black 0 50%;color:#feba1b;">_container;</span>
</p>
<p> <span style="background:black 0 50%;color:#808080;">/// &lt;summary&gt;    <br />/// </span><span style="background:black 0 50%;color:#008000;">Executes custom initialization code after    <br /></span><span style="background:black 0 50%;color:#808080;">/// </span><span style="background:black 0 50%;color:#008000;">all event handler    <br /></span><span style="background:black 0 50%;color:#808080;">/// </span><span style="background:black 0 50%;color:#008000;">modules have been added.    <br /></span><span style="background:black 0 50%;color:#808080;">/// </span><span style="background:black 0 50%;color:#008000;">Also acquire a reference to the HttpModule    <br /></span><span style="background:black 0 50%;color:#808080;">/// </span><span style="background:black 0 50%;color:#008000;">or Application State    <br /></span><span style="background:black 0 50%;color:#808080;">/// </span><span style="background:black 0 50%;color:#008000;">for IoC / DI if present    <br /></span><span style="background:black 0 50%;color:#808080;">/// &lt;/summary&gt;    <br /></span><span style="background:black 0 50%;color:#9bdd22;">public override void </span><span style="background:black 0 50%;color:#feba1b;">Init() { </span>
</p>
<p><span style="background:black 0 50%;color:#feba1b;">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; _container = </span><span style="background:black 0 50%;color:#9bdd22;">this</span><span style="background:black 0 50%;color:#feba1b;">.GetIoCModule(); </span><span style="background:black 0 50%;color:#9bdd22;">base</span><span style="background:black 0 50%;color:#feba1b;">.Init(); </span></p>
<p><span style="background:black 0 50%;color:#feba1b;">}</span></p>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p>And the extension on HttpApplication:</p>
<p><span style="background:black 0 50%;color:#9bdd22;">public static class </span><span style="background:black 0 50%;color:#8bcfe2;">ZeroConfigInstanceResolver </span><span style="background:black 0 50%;color:#feba1b;">{</span> </p>
</p>
<p> <span style="background:black 0 50%;color:#9bdd22;">private const string </span><span style="background:black 0 50%;color:#feba1b;">ZeroConfigTypeString = </span><span style="background:black 0 50%;color:#a31515;">&quot;IoCConfigModule.IHttpModel&quot;</span><span style="background:black 0 50%;color:#feba1b;">;</span>
</p>
<p> <span style="background:black 0 50%;color:#808080;">/// &lt;summary&gt;    <br />/// </span><span style="background:black 0 50%;color:#008000;">Gets the IZeroConfigDI reference if possible (null if not found)    <br /></span><span style="background:black 0 50%;color:#808080;">/// </span><span style="background:black 0 50%;color:#008000;">using domain specific logic and the    <br /></span><span style="background:black 0 50%;color:#808080;">/// </span><span style="background:black 0 50%;color:#008000;">generic logic extending the container.    <br /></span><span style="background:black 0 50%;color:#808080;">/// &lt;/summary&gt;    <br />/// &lt;param name=&quot;container&quot;&gt;</span><span style="background:black 0 50%;color:#008000;">The container.</span><span style="background:black 0 50%;color:#808080;">&lt;/param&gt;    <br />/// &lt;returns&gt;&lt;/returns&gt;     <br /></span><span style="background:black 0 50%;color:#9bdd22;">public static </span><span style="background:black 0 50%;color:#2b91af;">IZeroConfigDI </span><span style="background:black 0 50%;color:#feba1b;">GetIoCModule(</span><span style="background:black 0 50%;color:#9bdd22;">this </span><span style="background:black 0 50%;color:#8bcfe2;">HttpApplication </span><span style="background:black 0 50%;color:#feba1b;">container) {</span>
</p>
<p><span style="background:black 0 50%;color:#9bdd22;">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; var </span><span style="background:black 0 50%;color:#feba1b;">modules = container.Modules;      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </span><span style="background:black 0 50%;color:#9bdd22;">var </span><span style="background:black 0 50%;color:#feba1b;">applicationState = container.Application;&#160; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </span></p>
<p><span style="background:black 0 50%;color:#feba1b;">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </span><span style="background:black 0 50%;color:#9bdd22;">var </span><span style="background:black 0 50%;color:#feba1b;">resultVar = modules.ToInstance(      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; () =&gt; modules.Get(ZeroConfigTypeString)       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; )       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </span><span style="background:black 0 50%;color:#feba1b;">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ??&#160; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; applicationState.ToInstance(       <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; () =&gt; </span><span style="background:black 0 50%;color:#feba1b;">applicationState.Get(ZeroConfigTypeString)      <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; );</span> </p>
</p>
<p> <span style="background:black 0 50%;color:#9bdd22;">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return </span><span style="background:black 0 50%;color:#feba1b;">resultVar </span><span style="background:black 0 50%;color:#9bdd22;">as </span><span style="background:black 0 50%;color:#2b91af;">IZeroConfigDI</span><span style="background:black 0 50%;color:#feba1b;">;    </p>
<p>}</span>
</p>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p>No change is required on the extension to the FindInstance extension.</p>
<p>Can you see how the above can be improved?</p>
<p>We expand this to make the ‘rule for finding the <span style="background:black 0 50%;color:#2b91af;">IZeroConfigDI</span> external. To be specific, above we have a business rule implemented that we typically would not want ‘hard coded’. In fact more then not all things considered we want this. So we do the4 following:</p>
<ul>
<li>Determine the Delegate signature for the business rule.      </li>
<li>For the above, we need as input (at a minimum) an <span style="background:black 0 50%;color:#8bcfe2;">HttpApplication </span>instance as that is the container for the models and state, and those two items lack a shared interface or base (or we could use that).       </li>
<li>The signature returns (in all cases) an instance cast where it implement <span style="background:black 0 50%;color:#2b91af;">IZeroConfigDI </span>to resolve this business rule.       </li>
<li>Therefore the business rule signature is <strong>Func&lt;<span style="background:black 0 50%;color:#8bcfe2;">HttpApplication </span>,<span style="background:black 0 50%;color:#2b91af;">IZeroConfigDI</span>&gt;</strong>       </li>
</ul>
<p><strong></strong></p>
<table cellspacing="0" cellpadding="2" width="355" border="1">
<tbody>
<tr>
<td valign="top" width="353">
<p><strong></strong></p>
<p>         <strong>
<p>&#160;</p>
<p>         </strong>
<ul>
<li>
<h3>It’s an essential skill to not only master generics at the deepest level, but to master all the intrinsic delegate types (Predicate, Func, Action, etc.) to be proficient in the state of the technology of Linq today </h3>
<p></li>
<li>
<h3>We wish it was easier to ‘extend’ Delegates by inheritance or to not be tasked with coding to each variant of a delegates possible type parameters, but this is different the Object Oriented in it’s domain. </h3>
<p></li>
<li>
<h3>We also wish the generic constraint language would be fundamentally focused on, extended and evolved to allow the full richness in constraint semantics as we have with Linq Expressions. </h3>
<p></li>
</ul>
</td>
</tr>
</tbody>
</table>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/dcarr.wordpress.com/238/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/dcarr.wordpress.com/238/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/dcarr.wordpress.com/238/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/dcarr.wordpress.com/238/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/dcarr.wordpress.com/238/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/dcarr.wordpress.com/238/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/dcarr.wordpress.com/238/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/dcarr.wordpress.com/238/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/dcarr.wordpress.com/238/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/dcarr.wordpress.com/238/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/dcarr.wordpress.com/238/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/dcarr.wordpress.com/238/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=238&subd=dcarr&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://team.pushbomb.com/2008/05/27/advanced-c-30-part-3-new-language-features-as-domain-specific-as-well-as-general-purpose-extensions/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7b572cbcda5a17fe984e7dd1ddc9c3d6?s=96&#38;d=&#38;r=PG" medium="image">
			<media:title type="html">pushbomb</media:title>
		</media:content>
	</item>
		<item>
		<title>Advanced C# 3.0 : Part 2 &#8211; Everyday Tasks with New Solutions</title>
		<link>http://team.pushbomb.com/2008/05/22/advanced-c-30-part-2-everyday-tasks-with-new-solutions/</link>
		<comments>http://team.pushbomb.com/2008/05/22/advanced-c-30-part-2-everyday-tasks-with-new-solutions/#comments</comments>
		<pubDate>Thu, 22 May 2008 19:31:10 +0000</pubDate>
		<dc:creator>Damon Wilder Carr</dc:creator>
				<category><![CDATA[C# 3.0 Enhancements]]></category>
		<category><![CDATA[C# 3.0 for Internal DSL]]></category>
		<category><![CDATA[Software Design]]></category>
		<category><![CDATA[Software Futures]]></category>
		<category><![CDATA[agile practices]]></category>
		<category><![CDATA[reflection]]></category>
		<category><![CDATA[Advanced C#]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Delegates]]></category>
		<category><![CDATA[Functional Programming]]></category>
		<category><![CDATA[Lambada]]></category>
		<category><![CDATA[Visual Studio 2008]]></category>

		<guid isPermaLink="false">http://dcarr.wordpress.com/2008/05/22/advanced-c-30-part-2-everyday-tasks-with-new-solutions/</guid>
		<description><![CDATA[In this post I'll be digging deeper into doing things I've always wanted to have in .NET yet didn't. For example, I know I am not alone in wanting an IList (be it an IList or a simple non-generic IList) to provide me a .foreach method as you get in a List). This is just one of many things we address here (and more).<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=232&subd=dcarr&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<h3>Part 2 : Digging Deeper into Lambadas, Extension Methods, and Linq</h3>
<p>The world’s most common extension method and an attempt at a definitive version.</p>
<p>In this post I&#8217;ll be digging deeper into doing things I&#8217;ve always wanted to have in .NET yet didn&#8217;t. For example, I know I am not alone in wanting an IList (be it an IList&lt;T&gt; or a simple non-generic IList) to provide me a .foreach method as you get in a List&lt;T&gt;). This is just one of many things we address here (and more).</p>
<h1>From the concrete to the abstract</h1>
<p>I was having problems with entries in my path environmental variable, and I wanted an easy way to flag bad entries and also allow me to move the entries in the list up or down easily. This was made apparent by my use of a tool called &#8216;Dependency Walker&#8217;. It&#8217;s hard to live without but that&#8217;s another post. See the screen shot below:</p>
<p><a href="http://dcarr.files.wordpress.com/2008/05/image-0001.png"><img style="border-width:0;" alt="Image-0001" src="http://dcarr.files.wordpress.com/2008/05/image-0001-thumb.png?w=458&#038;h=316" width="458" height="316" /></a></p>
<p><a href="http://www.dependencywalker.com/">Click here to go to &#8216;Dependency Walker&#8217;</a></p>
<h1>Test to Code</h1>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p>&#160;</p>
<pre class="code"><span style="background:#100d0c;color:#e1b04a;"><font size="1">    </font></span><span style="background:#100d0c;color:#a0a0a0;"><font size="1">/// &lt;summary&gt;
    /// </font></span><span style="background:#100d0c;color:#80ff00;"><font size="1">Unit Test to Validate that the logic related to     /// 'show combined extensions using paths' is functioning
    </font></span><span style="background:#100d0c;color:#a0a0a0;"><font size="1">/// &lt;/summary&gt;
    /// </font></span><font size="1"><span style="background:#100d0c;color:#80ff00;">Documentation Created 5/22/2008
    </span><span style="background:#100d0c;color:#e1b04a;">[</span><span style="background:#100d0c;color:#64b1ff;">Test</span></font><font size="1"><span style="background:#100d0c;color:#e1b04a;">]
    </span><span style="background:#100d0c;color:#8ac5ff;">public void </span></font><font size="1"><span style="background:#100d0c;color:#e1b04a;">shouldShowCombinedExtensionsUsingPaths()
    {
        </span><span style="background:#100d0c;color:#8ac5ff;">var </span><span style="background:#100d0c;color:#e1b04a;">_directoriesInPath </span><span style="background:#100d0c;color:silver;">= </span><span style="background:#100d0c;color:#d6adad;">EnvironmentVariableTarget</span></font><font size="1"><span style="background:#100d0c;color:silver;">.             </span><span style="background:#100d0c;color:#e1b04a;">Process</span><span style="background:#100d0c;color:silver;">.</span><span style="background:#100d0c;color:#e1b04a;">GetParsedValues(</span><span style="background:#100d0c;color:#ff8040;">&quot;PATH&quot;</span></font><font size="1"><span style="background:#100d0c;color:#e1b04a;">);

        </span><span style="background:#100d0c;color:#64b1ff;">Assert</span><span style="background:#100d0c;color:silver;">.</span><span style="background:#100d0c;color:#e1b04a;">That(_directoriesInPath, </span><span style="background:#100d0c;color:#64b1ff;">Is</span></font><font size="1"><span style="background:#100d0c;color:silver;">.                </span><span style="background:#100d0c;color:#e1b04a;">TypeOf(</span><span style="background:#100d0c;color:#8ac5ff;">typeof</span><span style="background:#100d0c;color:#e1b04a;">(</span><span style="background:#100d0c;color:#64b1ff;">String</span></font><font size="1"><span style="background:#100d0c;color:#e1b04a;">[])));
        </span><span style="background:#100d0c;color:#64b1ff;">Assert</span><span style="background:#100d0c;color:silver;">.</span><span style="background:#100d0c;color:#e1b04a;">IsTrue(</span><span style="background:#100d0c;color:silver;">!</span><span style="background:#100d0c;color:#e1b04a;">_directoriesInPath</span><span style="background:#100d0c;color:silver;">.</span></font><font size="1"><span style="background:#100d0c;color:#e1b04a;">IsNullOrEmpty());

        _directoriesInPath</span><span style="background:#100d0c;color:silver;">.</span></font><span style="background:#100d0c;color:#e1b04a;"><font size="1">ForEach(
            x </font></span><span style="background:#100d0c;color:silver;"><font size="1">=&gt;
            </font></span><font size="1"><span style="background:#100d0c;color:#e1b04a;">{
                </span><span style="background:#100d0c;color:#8ac5ff;">if </span><span style="background:#100d0c;color:#e1b04a;">(</span><span style="background:#100d0c;color:silver;">!</span><span style="background:#100d0c;color:#64b1ff;">Directory</span><span style="background:#100d0c;color:silver;">.</span></font><font size="1"><span style="background:#100d0c;color:#e1b04a;">Exists(x))
                    </span><span style="background:#100d0c;color:#64b1ff;">Console</span><span style="background:#100d0c;color:silver;">.</span><span style="background:#100d0c;color:#e1b04a;">WriteLine(</span><span style="background:#100d0c;color:#ff8040;">&quot;MIssing Directory! &quot; </span><span style="background:#100d0c;color:silver;">+ </span></font><span style="background:#100d0c;color:#e1b04a;"><font size="1">x);
            });
    }</font></span></pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p>Above is the test (that also works). Before I launch into why this is interesting, what looks different?</p>
<p>1) EnvironmentVariableTarget : This is Microsoft&#8217;s type not mine. It&#8217;s the enum used to specify the target search on the environmentals.</p>
<p>2) _directoriesInPath : This is a string[] as you can see from the Assertion. But how does it support ForEach?</p>
<p>3) GetParsedValues() : What is that exactly?</p>
<blockquote>
<p>*** As this is so common I decided to try to craft a definitive version of ForEach that would work across non-generic collections, generic collection, and specific type specification on the targeted items in the collection for generics .&#160; ***</p>
</blockquote>
<p>In order to enable ForEach behavior I needed to this code which is by far the most common extension method in all the C# 3.0 code alive today.</p>
<p>&#160;</p>
<pre class="code">
<span style="background:#100d0c;color:#e1b04a;"><font size="1">    </font></span><span style="background:#100d0c;color:#a0a0a0;"><font size="1">/// &lt;summary&gt;
    /// </font></span><span style="background:#100d0c;color:#80ff00;"><font size="1">Requires generic IEnumerable and is most common now
    </font></span><font size="1"><span style="background:#100d0c;color:#a0a0a0;">/// &lt;/summary&gt;
    /// &lt;typeparam name=</span><span style="background:#100d0c;color:#919191;">&quot;TContainedType&quot;</span><span style="background:#100d0c;color:#a0a0a0;">&gt;</span><span style="background:#100d0c;color:#80ff00;">The type of the contained type.</span></font><font size="1"><span style="background:#100d0c;color:#a0a0a0;">&lt;/typeparam&gt;
    /// &lt;param name=</span><span style="background:#100d0c;color:#919191;">&quot;baseEnum&quot;</span><span style="background:#100d0c;color:#a0a0a0;">&gt;</span><span style="background:#100d0c;color:#80ff00;">The base enum.</span></font><font size="1"><span style="background:#100d0c;color:#a0a0a0;">&lt;/param&gt;
    /// &lt;param name=</span><span style="background:#100d0c;color:#919191;">&quot;actionPerform&quot;</span><span style="background:#100d0c;color:#a0a0a0;">&gt;</span><span style="background:#100d0c;color:#80ff00;">The action perform.</span></font><span style="background:#100d0c;color:#a0a0a0;"><font size="1">&lt;/param&gt;
    /// &lt;returns&gt;&lt;/returns&gt;
    /// </font></span><font size="1"><span style="background:#100d0c;color:#80ff00;">Documentation Created 7/20/2008
    </span><span style="background:#100d0c;color:#8ac5ff;">public static </span><span style="background:#100d0c;color:#ff6fb7;">IEnumerable</span><span style="background:#100d0c;color:silver;">&lt;</span><span style="background:#100d0c;color:#e1b04a;">TContainedType</span><span style="background:#100d0c;color:silver;">&gt; </span><span style="background:#100d0c;color:#e1b04a;">ForEach</span><span style="background:#100d0c;color:silver;">&lt;</span><span style="background:#100d0c;color:#e1b04a;">TContainedType</span><span style="background:#100d0c;color:silver;">&gt;</span></font><font size="1"><span style="background:#100d0c;color:#e1b04a;">(
           </span><span style="background:#100d0c;color:#8ac5ff;">this </span><span style="background:#100d0c;color:#ff6fb7;">IEnumerable</span><span style="background:#100d0c;color:silver;">&lt;</span><span style="background:#100d0c;color:#e1b04a;">TContainedType</span><span style="background:#100d0c;color:silver;">&gt; </span></font><font size="1"><span style="background:#100d0c;color:#e1b04a;">baseEnum,
               </span><span style="background:#100d0c;color:#ffaeff;">Action</span><span style="background:#100d0c;color:silver;">&lt;</span><span style="background:#100d0c;color:#e1b04a;">TContainedType</span><span style="background:#100d0c;color:silver;">&gt; </span></font><font size="1"><span style="background:#100d0c;color:#e1b04a;">actionPerform) {

        </span><span style="background:#100d0c;color:#8ac5ff;">return </span></font><span style="background:#100d0c;color:#e1b04a;"><font size="1">ForEachInner(baseEnum, actionPerform);
    }

    </font></span><span style="background:#100d0c;color:#a0a0a0;"><font size="1">/// &lt;summary&gt;
    /// </font></span><span style="background:#100d0c;color:#80ff00;"><font size="1">The most explicit case
    </font></span><font size="1"><span style="background:#100d0c;color:#a0a0a0;">/// &lt;/summary&gt;
    /// &lt;typeparam name=</span><span style="background:#100d0c;color:#919191;">&quot;TBase&quot;</span><span style="background:#100d0c;color:#a0a0a0;">&gt;</span><span style="background:#100d0c;color:#80ff00;">The type of the base.</span></font><font size="1"><span style="background:#100d0c;color:#a0a0a0;">&lt;/typeparam&gt;
    /// &lt;typeparam name=</span><span style="background:#100d0c;color:#919191;">&quot;TContainedType&quot;</span><span style="background:#100d0c;color:#a0a0a0;">&gt;</span><span style="background:#100d0c;color:#80ff00;">The type of the contained type.</span></font><font size="1"><span style="background:#100d0c;color:#a0a0a0;">&lt;/typeparam&gt;
    /// &lt;param name=</span><span style="background:#100d0c;color:#919191;">&quot;baselineEnumerable&quot;</span><span style="background:#100d0c;color:#a0a0a0;">&gt;</span><span style="background:#100d0c;color:#80ff00;">The baseline enumerable.</span></font><font size="1"><span style="background:#100d0c;color:#a0a0a0;">&lt;/param&gt;
    /// &lt;param name=</span><span style="background:#100d0c;color:#919191;">&quot;actionPerform&quot;</span><span style="background:#100d0c;color:#a0a0a0;">&gt;</span><span style="background:#100d0c;color:#80ff00;">The action perform.</span></font><span style="background:#100d0c;color:#a0a0a0;"><font size="1">&lt;/param&gt;
    /// &lt;returns&gt;&lt;/returns&gt;
    /// </font></span><font size="1"><span style="background:#100d0c;color:#80ff00;">Documentation Created 7/20/2008
    </span><span style="background:#100d0c;color:#8ac5ff;">public static </span><span style="background:#100d0c;color:#ff6fb7;">IEnumerable</span><span style="background:#100d0c;color:silver;">&lt;</span><span style="background:#100d0c;color:#e1b04a;">TContainedType</span><span style="background:#100d0c;color:silver;">&gt; </span><span style="background:#100d0c;color:#e1b04a;">ForEach</span><span style="background:#100d0c;color:silver;">&lt;</span><span style="background:#100d0c;color:#e1b04a;">TBase, TContainedType</span><span style="background:#100d0c;color:silver;">&gt;</span></font><font size="1"><span style="background:#100d0c;color:#e1b04a;">(
              </span><span style="background:#100d0c;color:#8ac5ff;">this </span><span style="background:#100d0c;color:#e1b04a;">TBase baselineEnumerable, </span><span style="background:#100d0c;color:#ffaeff;">Action</span><span style="background:#100d0c;color:silver;">&lt;</span><span style="background:#100d0c;color:#e1b04a;">TContainedType</span><span style="background:#100d0c;color:silver;">&gt; </span></font><font size="1"><span style="background:#100d0c;color:#e1b04a;">actionPerform)
                   </span><span style="background:#100d0c;color:#8ac5ff;">where </span><span style="background:#100d0c;color:#e1b04a;">TBase : </span><span style="background:#100d0c;color:#ff6fb7;">IEnumerable </span></font><font size="1"><span style="background:#100d0c;color:#e1b04a;">{

        </span><span style="background:#100d0c;color:#8ac5ff;">return </span><span style="background:#100d0c;color:#e1b04a;">ForEachInner(baselineEnumerable</span><span style="background:#100d0c;color:silver;">.</span><span style="background:#100d0c;color:#e1b04a;">OfType</span><span style="background:#100d0c;color:silver;">&lt;</span><span style="background:#100d0c;color:#e1b04a;">TContainedType</span><span style="background:#100d0c;color:silver;">&gt;</span></font><span style="background:#100d0c;color:#e1b04a;"><font size="1">(), actionPerform);
    }

    </font></span><span style="background:#100d0c;color:#a0a0a0;"><font size="1">/// &lt;summary&gt;
    /// </font></span><span style="background:#100d0c;color:#80ff00;"><font size="1">The least restrictive case
    </font></span><font size="1"><span style="background:#100d0c;color:#a0a0a0;">/// &lt;/summary&gt;
    /// &lt;param name=</span><span style="background:#100d0c;color:#919191;">&quot;baseEnum&quot;</span><span style="background:#100d0c;color:#a0a0a0;">&gt;</span><span style="background:#100d0c;color:#80ff00;">The base enum.</span></font><font size="1"><span style="background:#100d0c;color:#a0a0a0;">&lt;/param&gt;
    /// &lt;param name=</span><span style="background:#100d0c;color:#919191;">&quot;actionPerform&quot;</span><span style="background:#100d0c;color:#a0a0a0;">&gt;</span><span style="background:#100d0c;color:#80ff00;">The action perform.</span></font><span style="background:#100d0c;color:#a0a0a0;"><font size="1">&lt;/param&gt;
    /// &lt;returns&gt;&lt;/returns&gt;
    /// </font></span><font size="1"><span style="background:#100d0c;color:#80ff00;">Documentation Created 7/20/2008
    </span><span style="background:#100d0c;color:#8ac5ff;">public static </span><span style="background:#100d0c;color:#ff6fb7;">IEnumerable</span><span style="background:#100d0c;color:silver;">&lt;</span><span style="background:#100d0c;color:#64b1ff;">Object</span><span style="background:#100d0c;color:silver;">&gt; </span><span style="background:#100d0c;color:#e1b04a;">ForEach(</span><span style="background:#100d0c;color:#8ac5ff;">this </span><span style="background:#100d0c;color:#ff6fb7;">IEnumerable </span><span style="background:#100d0c;color:#e1b04a;">baseEnum,                </span><span style="background:#100d0c;color:#ffaeff;">Action</span><span style="background:#100d0c;color:silver;">&lt;</span><span style="background:#100d0c;color:#64b1ff;">Object</span></font><span style="background:#100d0c;color:silver;"><font size="1">&gt;  </font></span><font size="1"><span style="background:#100d0c;color:#e1b04a;">actionPerform) {

        </span><span style="background:#100d0c;color:#8ac5ff;">return </span><span style="background:#100d0c;color:#e1b04a;">ForEachInner(baseEnum</span><span style="background:#100d0c;color:silver;">.</span><span style="background:#100d0c;color:#e1b04a;">OfType</span><span style="background:#100d0c;color:silver;">&lt;</span><span style="background:#100d0c;color:#64b1ff;">Object</span><span style="background:#100d0c;color:silver;">&gt;</span></font><span style="background:#100d0c;color:#e1b04a;"><font size="1">(), actionPerform);
    }

    </font></span><span style="background:#100d0c;color:#a0a0a0;"><font size="1">/// &lt;summary&gt;
    /// </font></span><span style="background:#100d0c;color:#80ff00;"><font size="1">Do the actual work
    </font></span><font size="1"><span style="background:#100d0c;color:#a0a0a0;">/// &lt;/summary&gt;
    /// &lt;typeparam name=</span><span style="background:#100d0c;color:#919191;">&quot;TContainedType&quot;</span><span style="background:#100d0c;color:#a0a0a0;">&gt;</span><span style="background:#100d0c;color:#80ff00;">The type of the contained type.</span></font><font size="1"><span style="background:#100d0c;color:#a0a0a0;">&lt;/typeparam&gt;
    /// &lt;param name=</span><span style="background:#100d0c;color:#919191;">&quot;baseEnum&quot;</span><span style="background:#100d0c;color:#a0a0a0;">&gt;</span><span style="background:#100d0c;color:#80ff00;">The base enum.</span></font><font size="1"><span style="background:#100d0c;color:#a0a0a0;">&lt;/param&gt;
    /// &lt;param name=</span><span style="background:#100d0c;color:#919191;">&quot;actionPerform&quot;</span><span style="background:#100d0c;color:#a0a0a0;">&gt;</span><span style="background:#100d0c;color:#80ff00;">The action perform.</span></font><span style="background:#100d0c;color:#a0a0a0;"><font size="1">&lt;/param&gt;
    /// &lt;returns&gt;&lt;/returns&gt;
    /// </font></span><font size="1"><span style="background:#100d0c;color:#80ff00;">Documentation Created 7/20/2008
    </span><span style="background:#100d0c;color:#8ac5ff;">private static </span><span style="background:#100d0c;color:#ff6fb7;">IEnumerable</span><span style="background:#100d0c;color:silver;">&lt;</span><span style="background:#100d0c;color:#e1b04a;">TContainedType</span><span style="background:#100d0c;color:silver;">&gt; </span><span style="background:#100d0c;color:#e1b04a;">ForEachInner</span><span style="background:#100d0c;color:silver;">&lt;</span><span style="background:#100d0c;color:#e1b04a;">TContainedType</span><span style="background:#100d0c;color:silver;">&gt;</span></font><font size="1"><span style="background:#100d0c;color:#e1b04a;">(
        </span><span style="background:#100d0c;color:#ff6fb7;">IEnumerable</span><span style="background:#100d0c;color:silver;">&lt;</span><span style="background:#100d0c;color:#e1b04a;">TContainedType</span><span style="background:#100d0c;color:silver;">&gt; </span></font><font size="1"><span style="background:#100d0c;color:#e1b04a;">baseEnum,
                       </span><span style="background:#100d0c;color:#ffaeff;">Action</span><span style="background:#100d0c;color:silver;">&lt;</span><span style="background:#100d0c;color:#e1b04a;">TContainedType</span><span style="background:#100d0c;color:silver;">&gt; </span></font><font size="1"><span style="background:#100d0c;color:#e1b04a;">actionPerform) {

        </span><span style="background:#100d0c;color:#8ac5ff;">var </span><span style="background:#100d0c;color:#e1b04a;">getEnumerate </span><span style="background:#100d0c;color:silver;">= </span><span style="background:#100d0c;color:#e1b04a;">baseEnum</span><span style="background:#100d0c;color:silver;">.</span></font><font size="1"><span style="background:#100d0c;color:#e1b04a;">ToList();
        getEnumerate</span><span style="background:#100d0c;color:silver;">.</span></font><font size="1"><span style="background:#100d0c;color:#e1b04a;">ForEach(actionPerform);

        </span><span style="background:#100d0c;color:#8ac5ff;">return </span></font><span style="background:#100d0c;color:#e1b04a;"><font size="1">getEnumerate;
    }</font></span></pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p>&#160;</p>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p>&#160;</p>
<p>Notice that anything which implements IEnumerable is caught above, regardless of what the collection.</p>
<p>&#160;</p>
<div style="float:none;display:inline;margin:0;padding:0;" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:eb68bac9-98d9-4f88-a664-8c985a219755" class="wlWriterSmartContent">del.icio.us Tags: <a href="http://del.icio.us/popular/Advanced+C%23" rel="tag">Advanced C#</a>,<a href="http://del.icio.us/popular/C%23" rel="tag">C#</a>,<a href="http://del.icio.us/popular/C%23+3.0+for+Internal+DSL" rel="tag">C# 3.0 for Internal DSL</a>,<a href="http://del.icio.us/popular/Delegates" rel="tag">Delegates</a>,<a href="http://del.icio.us/popular/Functional+Programming" rel="tag">Functional Programming</a>,<a href="http://del.icio.us/popular/Lambada" rel="tag">Lambada</a>,<a href="http://del.icio.us/popular/linq" rel="tag">linq</a>,<a href="http://del.icio.us/popular/Visual+Studio+2008" rel="tag">Visual Studio 2008</a></div>
</p>
</p>
</p>
<p><div style="float:none;display:inline;margin:0;padding:0;" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:1e50a19d-51fa-4053-b31f-4ed321648963" class="wlWriterSmartContent">Technorati Tags: <a href="http://technorati.com/tags/Advanced+C%23" rel="tag">Advanced C#</a>,<a href="http://technorati.com/tags/C%23" rel="tag">C#</a>,<a href="http://technorati.com/tags/C%23+3.0+for+Internal+DSL" rel="tag">C# 3.0 for Internal DSL</a>,<a href="http://technorati.com/tags/Delegates" rel="tag">Delegates</a>,<a href="http://technorati.com/tags/Functional+Programming" rel="tag">Functional Programming</a>,<a href="http://technorati.com/tags/Lambada" rel="tag">Lambada</a>,<a href="http://technorati.com/tags/linq" rel="tag">linq</a>,<a href="http://technorati.com/tags/Visual+Studio+2008" rel="tag">Visual Studio 2008</a></div>
</p>
<div class="wlWriterHeaderFooter" style="text-align:right;margin:0;padding:4px 0;"><a href="http://digg.com/submit?url=http%3a%2f%2fdcarr.wordpress.com%2f2008%2f05%2f22%2fadvanced-c-30-part-2-everyday-tasks-with-new-solutions%2f&amp;title=Advanced+C%23+3.0+%3a+Part+2+-+Everyday+Tasks+with+New+Solutions"><img src="http://digg.com/img/badges/100x20-digg-button.png" width="100" height="20" alt="Digg This" border="0" style="border:0;" /></a></div>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/dcarr.wordpress.com/232/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/dcarr.wordpress.com/232/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/dcarr.wordpress.com/232/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/dcarr.wordpress.com/232/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/dcarr.wordpress.com/232/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/dcarr.wordpress.com/232/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/dcarr.wordpress.com/232/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/dcarr.wordpress.com/232/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/dcarr.wordpress.com/232/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/dcarr.wordpress.com/232/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/dcarr.wordpress.com/232/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/dcarr.wordpress.com/232/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=232&subd=dcarr&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://team.pushbomb.com/2008/05/22/advanced-c-30-part-2-everyday-tasks-with-new-solutions/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7b572cbcda5a17fe984e7dd1ddc9c3d6?s=96&#38;d=&#38;r=PG" medium="image">
			<media:title type="html">pushbomb</media:title>
		</media:content>

		<media:content url="http://dcarr.files.wordpress.com/2008/05/image-0001-thumb.png" medium="image">
			<media:title type="html">Image-0001</media:title>
		</media:content>

		<media:content url="http://digg.com/img/badges/100x20-digg-button.png" medium="image">
			<media:title type="html">Digg This</media:title>
		</media:content>
	</item>
		<item>
		<title>Framework API Development Best Practices using C# 3.0</title>
		<link>http://team.pushbomb.com/2008/05/15/domain-driven-framework-development-c-net-35-extension-methods-lambada-empowerment/</link>
		<comments>http://team.pushbomb.com/2008/05/15/domain-driven-framework-development-c-net-35-extension-methods-lambada-empowerment/#comments</comments>
		<pubDate>Thu, 15 May 2008 21:24:52 +0000</pubDate>
		<dc:creator>Damon Wilder Carr</dc:creator>
				<category><![CDATA[C# 3.0 Enhancements]]></category>
		<category><![CDATA[C# 3.0 for Internal DSL]]></category>
		<category><![CDATA[ORM]]></category>
		<category><![CDATA[Software Design]]></category>
		<category><![CDATA[Software Factories]]></category>
		<category><![CDATA[Software Futures]]></category>
		<category><![CDATA[agile practices]]></category>
		<category><![CDATA[resharper]]></category>
		<category><![CDATA[.NET 3.5]]></category>
		<category><![CDATA[API Design]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Extension Methods]]></category>
		<category><![CDATA[Framework Design]]></category>
		<category><![CDATA[Generics]]></category>
		<category><![CDATA[Lambada]]></category>

		<guid isPermaLink="false">http://dcarr.wordpress.com/2008/05/15/domain-driven-framework-development-c-net-35-extension-methods-lambada-empowerment/</guid>
		<description><![CDATA[This content assumes you understand the basics of the new C# 3.0 language features in .NET 3.5. I use a 'pretend pair programming' approach with continued refactoring as this is how I would discuss it if you were coding with me.

I'll start with a fairly trivial, yet important example (I use it every day). Many times when comparing Strings I want to ignore case and culture (the InvariantCulture). This is provided by an overload as such as you likely know:<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=188&subd=dcarr&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<h2 style="text-align:left;">PART 1</h2>
<p style="text-align:left;"><a href="http://dcarr.files.wordpress.com/2008/05/image31.png"><img class="alignright" style="border-width:0;margin:5px;" src="http://dcarr.files.wordpress.com/2008/05/image3-thumb.png?w=1024&#038;h=220" alt="image" height="220" /></a></p>
<p style="text-align:left;">This content assumes you have an introductory knowledge of C# 3.0 language features in .NET 3.5 and mastery of legacy C# 2.0 Generics, Generic Type Constraints, Anonymous Delegates and related material.</p>
<p>I use a &#8216;pair programming&#8217; approach with continued refactoring as this is how I would discuss it if you were coding with me, with an unfortunate one-way delivery.</p>
<h3 style="text-align:left;">The Brief Strategic View</h3>
<p style="text-align:left;">Microsoft has slowly been moving C# in a very productive direction (this is not new, as these features existed in 2.0 although not nearly as well integrated) to provide &#8216;Functional Language&#8217; features. If you don&#8217;t know or care about language semantics, just know that Linq and especially Lambada Expressions are about empowering you to use executable code like a variable, aka to leverage the power of functional programming. For more on this, read this <a href="http://msdn.microsoft.com/en-us/magazine/cc507636.aspx">MSDN article</a> by <a href="http://msdn.microsoft.com/en-us/magazine/cc301175.aspx">Joel Pobar (former CLR Team)</a> or read the next set of posts (part 2 onward) as I will go into the depths of this.</p>
<table style="text-align:left;height:153px;" border="1" cellspacing="0" cellpadding="2" width="399">
<tbody>
<tr>
<td width="543" valign="top">
<p align="center">I think of Lambadas as an incredibly focused and powerful domain specific language for delegates.</p>
<p>In this sense they are quite similar to Regular Expressions in that they are really good at their focus area.</p>
<p align="center">What do I mean by good?</p>
<ul>
<li>
<div>Terse yet Understandable / Maintainable</div>
</li>
<li>
<div>Syntax tailored to the need, not the other way around.</div>
</li>
<li>
<div>Highly effective for problems that are orders of magnitude more difficult without them (a simple 10% improvement would not cut it)</div>
</li>
</ul>
</td>
</tr>
</tbody>
</table>
<h2 style="text-align:left;">Painless Intro</h2>
<p style="text-align:left;">I&#8217;ll start with a fairly trivial, yet important example (I use it every day). Many times when comparing Strings I want to ignore case and culture (the InvariantCulture). This is provided by an overload as such as you likely know:</p>
<p>[Test,Category("BaselineCore")]<br />
public void shouldAsserStringCloneInvokeEqual() {</p>
<p>var baselineString = &#8220;This is a TEST CASE to IgnOrE Casing&#8221;;</p>
<p>var stringUpper = baselineString.ToUpperInvariant();</p>
<p>Assert.IsTrue(baselineString.Equals(stringUpper,<br />
StringComparison.InvariantCultureIgnoreCase));</p>
<p style="text-align:left;">The test results are shown above. Pass. Ok so I really like short, concise code that is understandable at a glance. Also it&#8217;s a pain to always (even with ReSharper) use this (and I have seen people use RegEx for this! RegEx is awesome but overkill for this issue).</p>
<p style="text-align:left;">Refactoring</p>
<ul style="text-align:left;">
<li>Create an extension method on String</li>
<li>Decide on a good name for the method (this is SO important and for most an afterthought!)</li>
</ul>
<p style="text-align:left;">I&#8217;ve settled on calling this new method on String &#8216;EqualsCore&#8217; as that is what we are doing, making the conditions for a match &#8217;simpler&#8217; and seeing &#8216;just the core values&#8217; are the same (anyway it makes sense to me)., I suppose this could be &#8216;EqualsRelaxed&#8217; or whatever..</p>
<p style="text-align:left;">Here is the test case (no code yet):</p>
<p>[Test, Category("BaselineCore")]<br />
public void shouldAsserStringsEqualUsingExtension() {<br />
var baselineString = &#8220;This is a TEST CASE to IgnOrE Casing&#8221;;<br />
Assert.IsTrue(baselineString. EqualsSimple(baselineString.ToUpperInvariant())); }</p>
<p style="text-align:left;">Now we write the code. Here is the container for the extension method:</p>
<p>public static class StringExtensions {</p>
<p>public static bool EqualsSimple(this string sTarget, string compare) {</p>
<p>return sTarget.Equals(compare, StringComparison.InvariantCultureIgnoreCase); }</p>
<p>}</p>
<p style="text-align:left;">Indeed they both pass:</p>
<p style="text-align:left;"><a href="http://dcarr.files.wordpress.com/2008/05/image25.png"><img class="alignright" style="float:right;border-width:0;" src="http://dcarr.files.wordpress.com/2008/05/image25-thumb.png?w=455&#038;h=255" alt="image25" width="455" height="255" align="left" /></a></p>
<p style="text-align:left;">
<p style="text-align:left;">
<p style="text-align:left;">
<p style="text-align:left;">
<p style="text-align:left;">
<p style="text-align:left;">Since every type inherits from Object, and Equals is defined on Object, all instances should support this approach, and I could be early bound by using Generics&#8230;. Hmm&#8230;</p>
<p style="text-align:left;">I tried this (note: I gave it a new new &#8216;EqualsThis&#8217; to separate them.</p>
<p>public static bool EqualsThis&lt;TTarget&gt;(this TTarget sTarget, TTarget compare){</p>
<p>return sTarget.Equals(compare);</p>
<p>}</p>
<p style="text-align:left;">Functionally not that interesting at all, but a test. So I typed in the following and wow&#8230; It works from Intellisense&#8217;s view&#8230; Ok it compiled! Wait&#8230;..FAIL! But why:?</p>
<p style="text-align:left;">OK here is the new test:</p>
<p>[Test, Category("BaselineCore")]</p>
<p>public void shouldAsserANYTHINGEqualUsingExtension() {</p>
<p>const String baselineString =&#8221;This is a TEST CASE to IgnOrE Casing&#8221;;</p>
<p>var sb = new StringBuilder(baselineString);</p>
<p>Assert.IsTrue(sb.EqualsThis(new StringBuilder(sb.ToString())));</p>
<p>}</p>
<p style="text-align:left;">
<p style="text-align:left;">Interesting&#8230;</p>
<p style="text-align:left;">Here is the documentation for what Equals means by default from Microsoft:</p>
<table style="text-align:left;" border="1" cellspacing="0" cellpadding="2" width="396">
<tbody>
<tr>
<td width="394" valign="top">
<p align="center">Returns: true if objA is the same instance as objB or if both are null references or if objA.Equals(objB) returns true; otherwise, false.</p>
</td>
</tr>
</tbody>
</table>
<p style="text-align:left;">So our code fails using the extension yet this returns true:</p>
<p>[Test] public void shouldAssertStringBuilderExplicit() {</p>
<p>const String baselineString = &#8220;This is a TEST CASE to IgnOrE Casing&#8221;;</p>
<p>var sb = new StringBuilder(baselineString);</p>
<p>var sb2 = new StringBuilder(baselineString); Assert.IsTrue(sb.Equals(sb2));</p>
<p>}</p>
<p style="text-align:left;">So Reflector to the rescue once again. I could see in Reflector what I believed the issue was. Indeed the StringBuilder class has an overloaded Equals, and even making the extension method cast to the generic type directly was a no go.</p>
<table style="text-align:left;" border="1" cellspacing="0" cellpadding="2" width="400">
<tbody>
<tr>
<td width="400" valign="top">
<p align="center">So what do you think? Why would this compile fine with absolutely no problems (and that is correct it turns out), but FAIL at runtime on the assertion when the same line above passes? Skip ahead and reply with the answer if you know it&#8230;.</p>
</td>
</tr>
</tbody>
</table>
<p style="text-align:left;">This exposes one of the dangers that we must be incredibly careful with. It has always been poor design in my opinion to encourage developers to override common methods such as ToString() and Equals(object X) with their own behaviors as you force consumers of the API to understand IMPLEMENTATION. You cannot ensure your OK simply from a contract. This is known to be evil&#8230;.</p>
<p style="text-align:left;">Of course this is a legacy style and will be slowly phased out.</p>
<p style="text-align:left;">Spin up reflector and look at the code for the OVERLOAD that StringBuilder has:</p>
<div style="text-align:left;">public bool Equals(StringBuilder sb){if (sb == null) return false;</p>
<p>return (((this.Capacity == sb.Capacity) &amp;&amp; (this.MaxCapacity == sb.MaxCapacity))<br />
&amp;&amp;<br />
this.m_StringValue.Equals((string) sb.m_StringValue));</p>
<p>}</p></div>
<div style="text-align:left;">
<p style="text-align:left;">Of course! How else could a StringBuilder claim to be &#8216;Equal&#8217; to another&#8230; In fact it is perfectly reasonable but again shows the danger of late binding, making assumptions about how any &#8216;object&#8217; type will perform.</p>
</div>
<div style="text-align:left;">
<p style="text-align:left;">So there was no real way for our extension to call the &#8216;correct&#8217; equals. It called the base definition given above which is obvious now why it failed.</p>
<p style="text-align:left;">
<p style="text-align:left;">So how do we fix this for the general case?</p>
<div style="text-align:left;">
<p style="text-align:left;">Here is the test case which I got working.. If your not familiar with this style of code,</p>
</div>
<div style="text-align:left;">This is the foundation we build layer after layer on and illustrates the core of this post.</div>
<p>[Test] public void shouldAsserANYTHINGEqualUsingExtension() {</p>
<p>const String baselineString = &#8220;This is a TEST CASE to IgnOrE Casing&#8221;;</p>
<p>var sb = new StringBuilder(baselineString);</p>
<p>var sb2 = new StringBuilder(baselineString);</p>
<p>Assert.IsTrue(sb.EqualsThis(x =&gt; x.Equals(sb2)));</p>
<p>}</p>
<table style="text-align:left;" border="1" cellspacing="0" cellpadding="2" width="438">
<tbody>
<tr>
<td width="436" valign="top">
<p align="center">Lambadas are like an incredibly focused and powerful domain specific language for delegates. In this sense they are quite similar to Regular Expressions in that they are really good (and to quantify good, I mean clear yet precise, not overly verbose yet highly effective for problems that are more difficult without them).</p>
</td>
</tr>
</tbody>
</table>
<div style="text-align:left;">So what about the implementation? Here it is:</div>
<p>public static bool EqualsThis&lt;TTarget&gt;(this TTarget sTarget,</p>
<p>Predicate&lt;TTarget&gt; EqualsDelegate) {</p>
<p>return EqualsDelegate.Invoke(sTarget);</p>
<p>}</p>
<div style="text-align:left;">It&#8217;s all about Expressions! Think of them as varied ways to receive executable code that you can &#8216;invoke&#8217; literally, that must meet the contract you define.</div>
<div style="text-align:left;">This is so basic after we cover what the really useful applications are. However remember this has nothing to do with the examples, only the concepts they represent.</div>
<h1 style="text-align:left;"></h1>
<table style="text-align:left;" border="1" cellspacing="0" cellpadding="2" width="632">
<tbody>
<tr>
<td width="400" valign="top">
<div></div>
<ol>
<li>Combine Generics and Generic Constraints to your Extension Methods but BE CAREFUL and ensure you are covered by unit tests</li>
<li>Try to always think a level of abstraction above where your immediate need is to see if your solution indeed has wider and perhaps far more valuable contribution.</li>
<li>Hide complexity behind your Framework API, and focus on crafting work that others will easily consume.</li>
</ol>
</td>
</tr>
</tbody>
</table>
</div>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/dcarr.wordpress.com/188/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/dcarr.wordpress.com/188/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/dcarr.wordpress.com/188/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/dcarr.wordpress.com/188/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/dcarr.wordpress.com/188/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/dcarr.wordpress.com/188/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/dcarr.wordpress.com/188/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/dcarr.wordpress.com/188/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/dcarr.wordpress.com/188/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/dcarr.wordpress.com/188/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/dcarr.wordpress.com/188/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/dcarr.wordpress.com/188/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=188&subd=dcarr&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://team.pushbomb.com/2008/05/15/domain-driven-framework-development-c-net-35-extension-methods-lambada-empowerment/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7b572cbcda5a17fe984e7dd1ddc9c3d6?s=96&#38;d=&#38;r=PG" medium="image">
			<media:title type="html">pushbomb</media:title>
		</media:content>

		<media:content url="http://dcarr.files.wordpress.com/2008/05/image3-thumb.png" medium="image">
			<media:title type="html">image</media:title>
		</media:content>

		<media:content url="http://dcarr.files.wordpress.com/2008/05/image25-thumb.png" medium="image">
			<media:title type="html">image25</media:title>
		</media:content>
	</item>
		<item>
		<title>ReSharper 4 &#8212; Latest Status Update from Ilya Ryzhenkov</title>
		<link>http://team.pushbomb.com/2008/05/14/resharper-4-latest-status-update-from-ilya-ryzhenkov/</link>
		<comments>http://team.pushbomb.com/2008/05/14/resharper-4-latest-status-update-from-ilya-ryzhenkov/#comments</comments>
		<pubDate>Wed, 14 May 2008 07:34:14 +0000</pubDate>
		<dc:creator>Damon Wilder Carr</dc:creator>
				<category><![CDATA[Software Design]]></category>
		<category><![CDATA[Software Futures]]></category>
		<category><![CDATA[reflection]]></category>
		<category><![CDATA[resharper]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[JetBrains]]></category>
		<category><![CDATA[Resharper]]></category>

		<guid isPermaLink="false">http://dcarr.wordpress.com/2008/05/14/resharper-4-latest-status-update-from-ilya-ryzhenkov/</guid>
		<description><![CDATA[Well, overall time scope for ReSharper 4 release is about a month. Thank you for your patience, we really appreciate your participation in our early access program! We are doing our best to deliver smart and quality product. And while we are here, what is *single* most important thing you want to be fixed/changed before release?<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=187&subd=dcarr&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>Hello, I must admit, we were not very responsive in the forums for the last month or so. We were<a href="http://dcarr.files.wordpress.com/2008/05/200805140336160109.jpg"><img class="alignright alignnone size-medium wp-image-186" style="float:right;" src="http://dcarr.files.wordpress.com/2008/05/200805140336160109.jpg?w=379&#038;h=284" alt="Home Page" width="379" height="284" /></a></p>
<p>busy developing ReSharper 4 :) Here is quick update. We are currently working on preparing ReSharper for Beta &#8211; performance, memory, overall stability and reliability. Beta should be out very soon. Then we will have</p>
<p>post-Beta cleanup, more stabilization for Release, fill in missing bricks found during Beta, and then &#8230; Well, overall time scope for ReSharper 4 release is about a month. Thank you for your patience, we really appreciate your participation in our early access program! We are doing our best to deliver smart and quality product. And while we are here, what is *single* most important thing you want to be fixed/changed before release?</p>
<blockquote><p>Sincerely,</p>
<p>Ilya Ryzhenkov</p>
<p>JetBrains, Inc</p>
<p>http://www.jetbrains.com &#8220;Develop with pleasure!&#8221;</p></blockquote>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/dcarr.wordpress.com/187/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/dcarr.wordpress.com/187/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/dcarr.wordpress.com/187/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/dcarr.wordpress.com/187/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/dcarr.wordpress.com/187/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/dcarr.wordpress.com/187/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/dcarr.wordpress.com/187/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/dcarr.wordpress.com/187/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/dcarr.wordpress.com/187/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/dcarr.wordpress.com/187/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/dcarr.wordpress.com/187/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/dcarr.wordpress.com/187/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=187&subd=dcarr&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://team.pushbomb.com/2008/05/14/resharper-4-latest-status-update-from-ilya-ryzhenkov/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7b572cbcda5a17fe984e7dd1ddc9c3d6?s=96&#38;d=&#38;r=PG" medium="image">
			<media:title type="html">pushbomb</media:title>
		</media:content>

		<media:content url="http://dcarr.files.wordpress.com/2008/05/200805140336160109.jpg?w=300" medium="image">
			<media:title type="html">Home Page</media:title>
		</media:content>
	</item>
		<item>
		<title>Daniel Cazzulino&#8217;s Blog : Statically-typed reflection with LINQ</title>
		<link>http://team.pushbomb.com/2008/05/08/daniel-cazzulinos-blog-statically-typed-reflection-with-linq/</link>
		<comments>http://team.pushbomb.com/2008/05/08/daniel-cazzulinos-blog-statically-typed-reflection-with-linq/#comments</comments>
		<pubDate>Thu, 08 May 2008 06:11:24 +0000</pubDate>
		<dc:creator>Damon Wilder Carr</dc:creator>
				<category><![CDATA[C# 3.0 Enhancements]]></category>
		<category><![CDATA[Software Design]]></category>
		<category><![CDATA[Software Futures]]></category>
		<category><![CDATA[reflection]]></category>
		<category><![CDATA[Advanced .NET]]></category>
		<category><![CDATA[C# 3.0 for Internal DSL]]></category>

		<guid isPermaLink="false">http://dcarr.wordpress.com/2008/05/08/daniel-cazzulinos-blog-statically-typed-reflection-with-linq/</guid>
		<description><![CDATA[With .NET 3.5 and C# 3.0 released now, it was time for an update. As part of the update, I also improved the API a little bit. Usage now is:
MethodInfo toString = Reflect.GetMethod(x =&#62; x.ToString());The renamed Reflect class receives the type you want to reflect as a generic parameter. Then you can use GetMethod, GetField or GetProperty.<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=183&subd=dcarr&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>To quote Daniel&#8230; : &#8220;Quite some time ago I posted about <a href="http://www.clariusconsulting.net/blogs/kzu/archive/2006/07/06/TypedReflection.aspx">how to use LINQ to provide a strong-typed reflection API</a>. I used a very old LINQ preview back then.</p>
<p>With <a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=333325fd-ae52-4e35-b531-508d977d32a6&amp;displaylang=en">.NET 3.5 and C# 3.0 released</a> now, it was time for an update. As part of the update, I also improved the API a little bit. Usage now is:</p>
<pre style="text-align:center;"><strong>MethodInfo toString = Reflect&lt;object&gt;.GetMethod(x =&gt; x.ToString());</strong></pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p>The renamed <code>Reflect&lt;TTarget&gt;</code> class receives the type you want to reflect as a generic parameter. Then you can use <code>GetMethod</code>, <code>GetField</code> or <code>GetProperty</code>.</p>
<p>Other examples:</p>
<pre style="text-align:center;">MethodInfo clone = Reflect&lt;ICloneable&gt;.GetMethod(x =&gt; x.Clone());
PropertyInfo prop = Reflect&lt;AppDomain&gt;.GetProperty(x =&gt; x.BaseDirectory);
FieldInfo field = Reflect&lt;Mock&gt;.GetField(x =&gt; x.PublicField);</pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p>Working principle is the same: the lambda you pass to the methods is actually an expression</p>
<p>which I analyze to retrieve the underlying reflection object that is already exposed by the LINQ Expression API. For example, once you get to a <a href="http://msdn2.microsoft.com/en-us/library/system.linq.expressions.methodcallexpression.aspx">MethodCallExpression</a>, you can get the method being called through its <a href="http://msdn2.microsoft.com/en-us/library/bb340973.aspx">Method</a> property:</p>
<pre style="text-align:center;">((MethodCallExpression)lambda.Body).Method;</pre>
<p>It&#8217;s interesting to see how this works actually, and what&#8217;s the compiler generating for those lambda expressions invoking methods.</p>
<p>In Reflector, the following C# code:</p>
<p>MethodInfo clone = Reflect&lt;ICloneable&gt;.GetMethod(x =&gt; x.Clone());</p>
<p>is decompiled as (indented for readability):</p>
<pre style="text-align:center;">ParameterExpression CS$0$0000;
MethodInfo clone = Reflect&lt;ICloneable&gt;.GetMethod(
Expression.Lambda&lt;Action&lt;ICloneable&gt;&gt;(Expression.Call(CS$0$0000 =
Expression.Parameter(typeof(ICloneable), "x"),
 (MethodInfo) methodof(ICloneable.Clone), new Expression[0] ),
new ParameterExpression[] { CS$0$0000 }  ));</pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p>Note how the MethodInfo is retrieved directly from the interface by using a <code>methodof</code> operator. It&#8217;s not a valid C# keyword, but given that <a href="http://www.aisto.com/roeder/">Lutz Roeder</a> works for Microsoft (not on the C# team, though), let&#8217;s hope it will get eventually in the language :).</p>
<p>That <code>methodof</code> translation is actually the conversion from the following two IL lines:</p>
<pre style="text-align:center;">L_0017: ldtoken instance object [mscorlib]System.ICloneable::Clone()L_001c: call class
 [mscorlib]System.Reflection.MethodBase</pre>
<pre style="text-align:center;">[mscorlib]System.Reflection.MethodBase::GetMethodFromHandle(valuetype</pre>
<pre style="text-align:center;">[mscorlib]System.RuntimeMethodHandle)</pre>
<p><code>ldtoken</code> is the key there, let&#8217;s hope it gets promoted to C# in some way eventually.</p>
<p>Anyway, since I wrote my original article, I realized through <a href="http://www.ayende.com/Blog/Default.aspx">Ayende&#8217;s blog</a> that you can also do <a href="http://www.ayende.com/Blog/archive/2005/10/29/8176.aspx">static reflection without LINQ</a>. It only works for methods though, and you cannot use the lambda syntax because it results in method infos that are actually from a compiler-generated type (the one that contains the closures too if any).</p>
<p>As I&#8217;m so in love with the lambda syntax, I&#8217;ll keep my implementation based on expression trees instead of delegates.</p>
<p>It&#8217;s released now as part of <a href="http://www.codeplex.com/clarius">Clarius Labs</a> projects. <a href="https://www.codeplex.com/Release/ProjectReleases.aspx?ProjectName=clarius&amp;ReleaseId=9495">Get the source</a> and have fun!&#8221;</p>
<p><a href="http://www.clariusconsulting.net/blogs/kzu/archive/2007/12/30/49063.aspx">Daniel Cazzulino&#8217;s Blog : Statically-typed reflection with LINQ</a></p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/dcarr.wordpress.com/183/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/dcarr.wordpress.com/183/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/dcarr.wordpress.com/183/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/dcarr.wordpress.com/183/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/dcarr.wordpress.com/183/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/dcarr.wordpress.com/183/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/dcarr.wordpress.com/183/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/dcarr.wordpress.com/183/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/dcarr.wordpress.com/183/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/dcarr.wordpress.com/183/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/dcarr.wordpress.com/183/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/dcarr.wordpress.com/183/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=183&subd=dcarr&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://team.pushbomb.com/2008/05/08/daniel-cazzulinos-blog-statically-typed-reflection-with-linq/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7b572cbcda5a17fe984e7dd1ddc9c3d6?s=96&#38;d=&#38;r=PG" medium="image">
			<media:title type="html">pushbomb</media:title>
		</media:content>
	</item>
		<item>
		<title>The Collision of Software Project Management and Agile</title>
		<link>http://team.pushbomb.com/2008/05/08/the-collision-of-software-project-management-and-agile/</link>
		<comments>http://team.pushbomb.com/2008/05/08/the-collision-of-software-project-management-and-agile/#comments</comments>
		<pubDate>Thu, 08 May 2008 06:00:00 +0000</pubDate>
		<dc:creator>Damon Wilder Carr</dc:creator>
				<category><![CDATA[Software Design]]></category>
		<category><![CDATA[Software Factories]]></category>
		<category><![CDATA[Software Futures]]></category>
		<category><![CDATA[agile practices]]></category>
		<category><![CDATA[Best Practices]]></category>
		<category><![CDATA[Culture]]></category>
		<category><![CDATA[Methodology]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[Statistics]]></category>

		<guid isPermaLink="false">http://dcarr.wordpress.com/2007/10/24/the-collision-of-software-project-management-and-agile/</guid>
		<description><![CDATA[“How do we get people to commit to something when everyone has a different perspective based on role or even political leanings for larger companies”“Nobody will commit to a final decision for fear they will not be able to modify it!"<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=91&subd=dcarr&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p align="left"><a href="http://dcarr.files.wordpress.com/2008/04/chart.png"><img class="alignright size-medium wp-image-165" style="width:149px;height:162px;" height="256" alt="" src="http://dcarr.files.wordpress.com/2008/04/chart.png?w=256&#038;h=256" width="256" /></a><a href="http://dcarr.files.wordpress.com/2008/04/chart.png"></a></p>
<p align="left">&nbsp;<strong>How do we get people to commit to something when everyone has a different perspective based on role or even political leanings for larger companies&rdquo;</strong> <strong>&ldquo;Our stakeholders are petrified to commit to a final stake in the ground for fear they will not be able to modify it based on I.T.&#8217;s inflexibility and inability to change&#8221;</STRONG> </P><br />
<P align="left">&nbsp;</P><br />
<P align="left">I though perhaps these were problems we had overcome in our industry, as the solutions are fairly well understood. I was wrong. What is the bottom line break-down between I.T. and the Business? That is a long and colorful debate. However I offer this: </P><br />
<UL><br />
<LI><br />
<DIV align="left">Most organizations punish those who are bad at PREDICTING THE FUTURE in software engineering. Of course these are smart people but they continue to demand clairvoyance with a lack of statistics.</DIV></LI><br />
<LI><br />
<DIV align="left">What happens? Padding of the schedule and bitter fights for every last month, when nobody has any idea what the effort is, not can they quantify the quality, and more importantly maintainability requirements around a software initiative.</DIV></LI><br />
<LI><br />
<DIV align="left">The fact is you cannot know at a micro level about a project until you are well into building it. This is something I have never met a receptive audience for, however it proves itself time and time again.</DIV></LI><br />
<LI><br />
<DIV align="left">&#8220;How do we give people the freedom to change their minds, yet deliver concrete estimates on time and cost to our managers?&#8221;</DIV></LI><br />
<LI><br />
<DIV align="left">&#8220;How much will this cost us and how can we estimate it knowing we will likely change our minds during the project based on previous projects, and how can we get early and consistent involvement in the development process?&#8221;</DIV></LI><br />
<LI><br />
<DIV align="left">&#8220;How can we ensure that necessary quality is met when we always enter risk mode at the end and quality goes out the window? Can&rsquo;t we manage with quality at every single stage, even every day?!&#8221;</DIV></LI></UL><br />
<P class="msonormal" style="text-align:center;" align="left"><STRONG>Whatever you do (in my opinion anyway) Don&rsquo;t say Agile&hellip;Nobody on the business side cares. In fact for whatever reason, software causes perfectly rational people to loose their mind (I cannot really blame them).</STRONG></P><br />
<P class="msonormal" align="left"><br />
<P class="msonormal" align="left"><br />
<P class="msonormal" align="left"><br />
<P class="msonormal" align="left">What I have to say on the matter is accompanied by deep battle-scars. What I have to say is definitely not what most want to hear, and even the technologists want to argue that they CAN come close to prediction. However what I say has the &lsquo;added moral quality of being true&rsquo;. This is hard to argue in light of the facts. That still often changes nothing, as companies firmly plant their head in the sand again and hope for the best with no real way of knowing what will happen and no practical way of really tracking in real time how their exposure to risk is changing.<br />
<P class="msonormal" align="left"><br />
<P class="msonormal" align="left"><br />
<P class="msonormal" align="left"><br />
<P class="msonormal" align="left">I know&hellip; I know&hellip; Agile is 100% about that but not in the way (typically) this group wants to hear, no that is why a knockout one-two punch is as follows (to be insanely overly simplistic):</P><br />
<P class="msonormal" align="left"><br />
<P class="msonormal" align="left"><br />
<P class="msolistparagraphcxsplast" style="margin-left:0.75in;text-indent:-0.25in;" align="left">1) Heavy Statistical Metrics for the &lsquo;Planning&rsquo; View Inclined</P><br />
<P class="msolistparagraphcxsplast" style="margin-left:0.75in;text-indent:-0.25in;" align="left">2) Of course, Agile Practices to Provide the Inputs to (1) and to Optimize your Chances on the Execution Side</P><br />
<P class="msonormal" style="margin-left:0.25in;" align="left"><br />
<P class="msonormal" align="left">This article is about some detail around (1) that far too many miss in my opinion and why it doesn&rsquo;t serve you to mix the terminology of these two groups (one of the only occurrences where I recommend that as I am typically the one pushing everyone into &lsquo;one common Domain Driven language&rsquo;)</P><br />
<P class="msonormal" style="margin-left:0.25in;" align="left"><br />
<H2 align="left"><STRONG>The Four Critical Dimensions</STRONG></H2><br />
<P align="left"><A href="http://dcarr.files.wordpress.com/2008/05/drivers.png"><IMG class="aligncenter size-medium wp-image-185" height="231" alt="" src="http://dcarr.files.wordpress.com/2008/05/drivers.png?w=300&#038;h=231" width="300"></A> </P><br />
<P class="MsoNormal" align="left">When addressing the concerns of a new custom software project these are the four key elements that must always be addressed (there are others such as security, scalability, etc. but those are included in &lsquo;Scope&#8217; as functional and non-functional requirements):</P><br />
<UL><br />
<LI class="MsoNormal"><br />
<DIV align="left">Time (cannot be made)</DIV></LI><br />
<LI class="MsoNormal"><br />
<DIV align="left">Scope/Features (you cannot know it until your done, so now what?</DIV></LI><br />
<LI class="MsoNormal"><br />
<DIV align="left">Quality (not typically discussed, as who wants &lsquo;bad or sort of low&rsquo; quality)</DIV></LI><br />
<LI class="MsoNormal"><br />
<DIV align="left">Cost (Since you have almost nothing to go on here, what to do? Your agile consultant says the system is &lsquo;done when it is done, not when some arbitrary date is set&rsquo; and he is 100% correct. However the business gets to decide when it is &lsquo;done enough&rsquo; not I.T. (with exceptions of course)</DIV></LI></UL><br />
<P class="MsoNormal" align="left">As Quality is not usually debated (I have never had a client say that the software could be poor quality), that leaves Time, Scope and Cost as the main moving parts to work with.</P><br />
<P class="MsoNormal" align="left"><br />
<P class="MsoNormal" style="margin-top:15pt;" align="left">The diagram above is where many stop. That is missing the entire point, as the DRIVERS that facilitate your ability to do well are missing. For example:</P><br />
<P class="MsoNormal" style="margin-top:15pt;" align="left"><STRONG>1) A lack of a continuous integration environment with regression tests will severely hurt your ability to achieve quality (all things being equal)</STRONG></P><br />
<P class="MsoNormal" style="margin-top:15pt;" align="left"><STRONG>2) A bad process / culture kills just about all of it</STRONG></P><br />
<P class="MsoNormal" style="margin-top:15pt;" align="left"><STRONG>3) Bad team morale is the same coin, different side.</STRONG></P><br />
<P class="MsoNormal" style="margin-top:15pt;" align="left"><STRONG>4) A process that cannot manage the inevitable change in scope as we &#8216;discover&#8217; what the project is all about, will kill just about all of it.</STRONG></P><br />
<P class="MsoNormal" style="margin-top:15pt;" align="left"><STRONG>5) A team lacking in solid design skills (design for change) such as a mastery of the important design patterns (Strategy Pattern Anyone?) as well as a lack of a Dependency Injection Container (there is just no good reason not to use one)</STRONG></P><br />
<P class="MsoNormal" style="margin-top:15pt;" align="left"><STRONG>6) Lack of an Object to Relational Mapping Abstraction Layer. Deal Breaker as of today (perhaps not a year ago).</STRONG></P><br />
<P class="MsoNormal" align="left"><br />
<P class="MsoNormal" align="left"><br />
<P class="MsoNormal" align="left"><br />
<P class="MsoNormal" align="left"><br />
<P class="MsoNormal" align="left"><br />
<P class="MsoNormal" align="left">There is no real doubt by anyone (except for a few people who also are not so sure on the whole evolution thing) that Agile practices provide the common sense way to address the same concerns most of us have around software.</P><br />
<P class="MsoNormal" style="margin-left:0.25in;" align="left"><br />
<P class="MsoNormal" style="margin-left:0.25in;" align="left"><br />
<P class="MsoNormal" style="margin-left:0.25in;" align="left">You know it, I know it, we all know it. However they don&rsquo;t care (and really have likely heard some bad things about it).</P><br />
<P class="MsoNormal" style="margin-left:0.25in;" align="left"><br />
<P class="MsoNormal" style="margin-left:0.25in;" align="left">My assumption is you are a person on the software side in a managerial capacity of some sort. I made this mistake for you many times. Resist the urge to &lsquo;set them straight&rsquo; or to explain the wonders of Agile when asked these questions (or even when not) and instead&hellip; I&rsquo;ll be getting to that&hellip;.</P><br />
<P class="MsoNormal" style="margin-left:0.25in;" align="left"><br />
<P class="MsoNormal" style="margin-left:0.25in;" align="left"><br />
<P class="MsoNormal" align="left">Anyway, they would probably just think &lsquo;how 2004&rsquo; and ask about SOA or something&hellip;.</P><br />
<P class="MsoNormal" align="left"><br />
<P class="MsoNormal" align="left">There are some real deal-breaker assumptions around project planning with or without Agile execution (and without agile is very well might be an execution.. OK enough biased injection for one article).</P><br />
<P class="MsoNormal" align="left"><br />
<P class="MsoNormal" align="left">There is often an unspoken (and unrecognized) characteristic that you should be able to &lsquo;tell the future&rsquo;. And many will think that the worse you are at it, the more likely it is you just might be lazy and/or stupid. I&rsquo;ve seen it over and over and over. Those who spin, those who pad, those who create fluff to buy time win. Those who really try and don&rsquo;t play games get nailed to the wall.</P><br />
<P class="MsoNormal" align="left"><br />
<P class="MsoNormal" align="left">Count me in the &lsquo;dumb and lazy&rsquo; group because I am terrible at predicting the future.</P><br />
<P class="MsoNormal" align="left"><br />
<P class="MsoNormal" align="left">In high school I was certain this really cute cheerleader would accept my invitation to the prom. I was also certain a few years ago that a system could be built for W dollars, in X months with Y people and Z quality. After all, that is all I could get from the customer as they were taking no input from vendors. Sure it was aggressive but we were so smart! We could do anything!</P><br />
<P class="MsoNormal" align="left"><br />
<P class="MsoNormal" align="left">Both had similar endings.</P><br />
<P class="MsoNormal" align="left"><br />
<P class="MsoNormal" align="left"><br />
<P class="MsoNormal" align="left"><br />
<P class="MsoNormal" style="border-right:windowtext;border-top:windowtext;border-left:windowtext;border-bottom:windowtext;padding:0;" align="left"><br />
<P class="MsoNormal" style="border-right:windowtext;border-top:windowtext;border-left:windowtext;border-bottom:windowtext;text-align:center;padding:0;" align="left">&ldquo;In order to succeed in complex software planning, just like in Agile, you have to give up. You have to completely accept the fact that you cannot possible know what you are really doing until you are already well into a solution, at least not at any detailed level&rdquo;</P><br />
<P class="MsoNormal" style="border-right:windowtext;border-top:windowtext;border-left:windowtext;border-bottom:windowtext;text-align:center;padding:0;" align="left">&nbsp;</P><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left"><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left"><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left"><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left"><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">Sound familiar? But you know you need these Agile ideas on the &lsquo;other side&rsquo; and you also know it would be self-defeating to wave that flag..</P><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left"><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">Nobody wants to admit they lack power, especially in areas they have devoted their life to mastering. But why does this not only empower you, but create the bedrock of extreme competence and success? Is this like the alcoholic finally admitting he is powerless over the bottle? Only then can things get better? I doubt it. This is only software.</P><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left"><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left"><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-left:0.25in;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left"><br />
<P class="MsoListParagraphCxSpMiddle" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;text-indent:-0.25in;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">&middot;</P><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left"><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;text-align:center;padding:1pt 4pt;" align="left"><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;text-align:center;padding:1pt 4pt;" align="left"><br />
<H1 style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">The Monetary Stakeholders</H1><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-top:15pt;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">And for they people either funding and/or profiting from this exercise the concerns can be quite different.</P><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-left:0.5in;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">&#8220;How can we ensure profitability on our work when we know change will occur? (For internal IT they may be managed and accountable for profitability if they are run like a profit center). If not profitability then &#8220;How can we possibly commit to a date and cost when we know this will be a moving target as we evolve the solution?&#8221;</p>
<p class="msonormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-top:15pt;margin-left:0.5in;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">&#8220;We have an abysmal record of missed deadlines, cost over-runs, quality problems and our users not being happy with our delivered systems. What can we do to improve this?&#8221;</p>
<p class="msonormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-top:15pt;margin-left:0.5in;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">&#8220;How do we manage the scope changes and &lsquo;feature creep&#8217; placed on us by the business people/stakeholders? This is what typically destroys our profits and/or time commitments and cost commitments, often resulting is a severe quality issues as well. How can we give people what they want but manage this change?&#8221;</p>
<p class="msonormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">
<p class="msonormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">This article is about bring these two groups together and keeping them just apart enough. This article is targeted to the people who must deliver software to their clients (be it internal IT or an outside Agile consulting firm doing the work). I assume these concepts would work in a non-Agile Process environment but I have cannot remember much luck (or for anyone I knew) in those days without resorting to what I call &lsquo;white tricks&rsquo; so I will not comment.</p>
<p class="msonormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">
<p class="msonormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">
<p class="msonormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">A Framework for Project Statistical Success Optimization</p>
<p class="msonormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">
<p class="msonormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">We know that these two very distinct groups will need to work closely together in an Agile environment if we want to optimize our chances. The days of separating the business experts from IT is long gone. In fact, for an Agile project to succeed it is typical to actually have a business domain expert on the development team as a fully fledged member.</p>
<p class="msonormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">
<p class="msonormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">&lsquo;High Ceremony&#8217; software processes may work (it is really dependent on who is doing the work as an amazing team will almost always succeed &ndash; see Peopleware by DeMarco and Lister) but at a large opportunity cost in almost all cases.</p>
<p class="msonormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-top:15pt;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">Any assigned domain expert should have the reach to get answers to questions quickly outside their domain knowledge when required. For a non-trivial project it will likely cover many domains and it may not be possible for that individual to have a mastery of all of them, however this person should be able to expeditiously get answers from others when required, This is a critical success factor to any Agile project.</p>
<p class="msonormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-top:15pt;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">I have evolved over many years this approach to software profitability and risk management in a very well tested and disciplined way. It has evolved since 1998 when I was CTO of a niche financial services software firm, which was sold in 2004. I then started the firm agilefactor and significantly evolved these ideas further as I still do literally almost every day! It&rsquo;s 2007 and there are many war wounds.</p>
<p class="msonormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-top:15pt;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">If any of this content seems like &#8216;academia&#8217; or &#8216;theory&#8217; I can assure you these are all proven real-world strategies, having been applied by myself and many others for years and years.</p>
<p class="msonormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-top:15pt;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">At the most basic, one could say everything eventually comes down these four critical dimensions&#8230;</p>
<p class="msonormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">
<p class="msonormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">
<p class="msonormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-top:15pt;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">It is CRITICAL you never let a client box you in on all of the three of these items if it can be avoided or you may have to &#8216;walk away&#8217; from a project (many in internal IT do not have that luxury but at least this article will show you how to push back in a way that is hard to be disputed by the forces trying to box you in to possible assured failure).</p>
<p class="msonormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-top:15pt;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">Your client gets to drive only two of the three items at most (such as Time and Cost), while you driven the third (Scope in this example) or the remaining items you control (you must always have at least one that the client explicitly gives you control over).</p>
<p class="msonormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-top:15pt;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">This is critical to profitable software sales both for commercial and custom one-off development but many fail in this area in their eagerness to close deals (this is especially a problem with salespeople who are not put in check on what they can promise the client, and will promise you right into a massive loss &#8211; a lesson I learned firsthand early in my career).</p>
<p class="msonormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-top:15pt;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">For example, if a client says:</p>
<p class="msonormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">
<p class="msolistparagraph" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;text-indent:-0.25in;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">&middot; We are allowing vendors to work until October 1st to achieve these 120 individual scope items in the attached 600 page scope document we have assembled (the first major sign of trouble).</p>
<p class="msonormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">
<p class="msolistparagraph" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;text-indent:-0.25in;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">&middot; Vendors have $1,900,000 to build this system. This is non-negotiable and the software must be extreme production quality, with severe contractual penalties for down-time, with scaling up to 10000 concurrent sessions per machine with an average response time of one second or less &#8220;</P><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-left:0.5in;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left"><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">Do we walk away? My initial reaction is absolutely..</P><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left"><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">This violates the principle described above as you are not in control of any of the four critical elements. The answer is sometime you must walk away!</P><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left"><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">I will describe here a way to help determine if you should and how you can effectively push back on this, as we know there will be significant deltas on that scope document (both academically from studies and practically from our experience).</P><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-top:15pt;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">We really have no idea if we should accept these terms. There are ways however where we can at least assess the risk and possible accept the terms when we learn these tools.</P><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-top:15pt;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">We all know it is an agile imperative deliver a working build to your stakeholders for each iteration that is &lsquo;real production&rsquo; although a subset most of the time</P><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-top:15pt;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">The client drives at most two dimensions, and you must drive the third (again ignoring the Quality variable) or you risk a disaster for everyone.</P><br />
<DIV style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">Any changes to a &#8216;fixed price&#8217; must be done with an incredibly rigorous &#8216;change order&#8217; process where all changes from the plan are scoped, priced and the impact is presented to the customer so they can decide if it is worth it. Even then these &lsquo;mini projects&rsquo; must be managed with the same techniques as if they were anything else. In fact they are no different, and we always assume there will be lots of them (unless we offer a lower risk/higher reward scenario). I often would meet with the client described above and say &lsquo;OK we can do this but it will cost $50,000 and delay us two weeks. How would you like to proceed? Reactions vary but if you didn&rsquo;t educate the customer on these matters, if it is negative you have nobody to blame but yourself. You knew this was coming. </DIV><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">And after all, THEY are deviating from &lsquo;the plan&rsquo; they committed to with confident assurances that there would be little to no need for &lsquo;change orders&rsquo; (this is a common occurrence in my experience with a correlation to the larger the company the most convinced they are the scope will not change.</P><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left"><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left"><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">Establish Risk Tolerance Before Defining the Time, Scope and Cost Constraints</P><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left"><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left"><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">Based on the extensive research and project database built by the industry luminaries and incredibly esteemed experts Tom DeMarco and Tim Lister, we now know what the probability distribution curve is for new custom software projects. It is lognormal with a high peak and a long curve to the right. This is absolutely critical for everyone to understand and I highly recommend you read the book &#8220;Waltzing with Bears&#8221; for a detailed discussion (see the end of this chapter for more information).</P><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left"><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-top:15pt;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">This is the probability distribution curve we must embrace:</P><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-top:15pt;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left"><A href="http://www.agilefactor.com/img/0465adf5e6bf_cfd/image001.jpg"><IMG style="border-width:0;" height="419" alt="image001" src="http://www.agilefactor.com/img/0465adf5e6bf_cfd/image001_thumb.jpg" width="546" border="0"></A></P><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-top:15pt;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">You establish the client&#8217;s willingness to accept the unavoidable possibility of failure across any of the four dimensions (we cannot predict the future) and then find that point on the curve moving up from the X axis point you have for the client (the X axis is probability of success) and take the area to the left of that point.</P><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-top:15pt;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left"><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-top:15pt;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">The total area under the curve is 100% so the farthest right point would indicate 100% confidence (again basically impossible to achieve where most organizations assume 100% by default, something that must change if our industry will ever &lsquo;grow up&rsquo;. As we cannot control the future, we can only manage it and the risks, we must know how &#8216;risky&#8217; the client wants to be (again by asking them or inferring it ourselves &#8211; often manifested in a &#8216;public&#8217; date and an &#8216;internal&#8217; date which is past the public date if we know the client will not cancel the project or penalize us tangibly for missing the public date).</P><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-top:15pt;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left"><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-top:15pt;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">It is a typical &#8216;risk/reward&#8217; situation. If the customer takes on more risk we might save them money, or deliver early. If they want less risk, we must significantly increase our cumulative resources attached to a project with the knowledge that &#8216;adding people to a late project makes it later&#8217;. This we know as fact so adding people is really only an option in the early phases. This has a large impact on early project planning.</P><br />
<P class="MsoListParagraphCxSpFirst" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-top:15pt;border-left:windowtext 1pt solid;text-indent:-0.25in;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">&middot; We need to understand if a customer is OK assuming a 15% risk of failure for example.</P><br />
<P class="MsoListParagraphCxSpMiddle" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-top:15pt;border-left:windowtext 1pt solid;text-indent:-0.25in;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">&middot; After all, don&rsquo;t all future events have unknown outcomes?</P><br />
<P class="MsoListParagraphCxSpLast" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-top:15pt;border-left:windowtext 1pt solid;text-indent:-0.25in;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">&middot; Is the client willing to as much as double their budget for a say 10% increase to 95% probability of future success across all dimensions?</P><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-top:15pt;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">A 95% success promise is not only near reckless to offer, it is an incredible shifting of risk anyone should demand a rich reward for taking on.</P><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-top:15pt;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">Studies are behind me on this as well with the well established fact that the best developers are as much as 28 x more productive then the worst). It quite literally is often a 100% increase in total resources allocated for a project to move from 85% to 95% even though it is a 10% gain in probability, hence the very long tail. The highest I have ever had a client go is 90% and we actually had two teams in two locations for redundancy (they didn&rsquo;t know about each other). One team almost failed but delivered a solution, however the other team&rsquo;s solution was superior so that is what we went with. This gave us our high probability due to the redundancy and the client paid dearly for this safety.</P><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-top:15pt;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">For example, the development team may say:</P><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-left:0.5in;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">&#8220;We had a terrible two weeks. Our lead Cryptography expert was sick so we moved those features into the next iteration and we severely underestimated the complexity of the mainframe integration and User Profile Customization.</p>
<p class="msonormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-left:0.5in;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">
<p class="msonormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-left:0.5in;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">Therefore we could only achieve 50% of what we had planned for this iteration. I would say from our agreed upon 85% confidence we are now closer to 75%. We can see if we make it up in the next iteration or we can take measures A, B and C to get back to 85%. What do you want to do?&#8221;</P><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-left:0.5in;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left"><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-left:0.5in;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;text-align:center;padding:1pt 4pt;" align="left">A better question I have for you is, would you rather not know this? Almost all organizations are nowhere near this level of integrated risk assessment, quantitative measurement and adjusting action execution.</P><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-left:0.5in;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left"><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-left:0.5in;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left"><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-left:0.5in;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left"><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">This is typically a decision for a high level individual (typically the project manager with the optional input of the customer) and hopefully with input from as many people as possible covering all dimensions.</P><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left"><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">Adding people will typically hurt you, not help you. You should already have done the obvious things like have moved the team into a &lsquo;war room&rsquo; setting (almost always a sure way to improve productivity) or many other solutions, so if you missed any do it now as these techniques are proven and it is much more painful to fail.</P><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-top:15pt;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">As for the client, they can also be blissfully unaware of how we manage the process of our internal development, but this well established process makes it incredibly hard to fail.</P><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-top:15pt;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">Here is an example with risk tolerance. Based on negotiations with the client they have agreed to a risk tolerance of 85% (a 15% risk of failure). Based on this, you can now estimate knowing your margin for error. The customer has scope requirements, and cost requirements but is fairly open to time.</P><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-top:15pt;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">You come back to the client and say:</P><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-left:0.5in;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">&#8220;Based on an 85% confidence we feel we can deliver your scope at the cost you describe at some point between April 1 2006 and July 1 2006&rsquo;&#8221;. The client may protest, saying (for the first time) they were hoping for a March 1 delivery. You confer with your colleagues and respond that this would be possible at a 70% Confidence (30% chance of failure). And so the negotiations follow&#8230;But at least now you have very concrete &#8216;dials to turn&#8217; and it is hard for the customer to argue with the fact base supporting you.</P><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-left:0.5in;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left"><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-top:15pt;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">I assert that custom software is a &#8216;wicked problem&#8217; (to see a great definition of &#8216;wicked problem&#8217; see http://www.cognexus.org/id42.htm or the text at the end of this article.</P><br />
<H1 style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">Conclusion</H1><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left"><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">To help ensure a positive outcome for your client and for your development effort it is critical to consider first the Risk Tolerance of your client, and then negotiate the one dimension you typically have control over after the client informs you of the two (two from Time, Scope and Cost). In some cases you must walk away and this article should help you determine when that is the case.</P><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-top:15pt;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">For a much more detailed discussion of these topics and what this author considers critical:</P><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-left:0.5in;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">&#8220;Waltzing with Bears&#8221;, Dorset House Publishing Company, Incorporated (March, 2003), ISBN: 0932633609</P><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left"><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">Supplemental Material: Wicked Problems</P><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left"><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">A wicked problem is one for which each attempt to create a solution changes the understanding of the problem. Wicked problems cannot be solved in a traditional linear fashion, because the problem definition evolves as new possible solutions are considered and/or implemented. The term was originally coined by Horst Rittel.</P><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-top:15pt;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">Wicked problems always occur in a social context &#8212; the wickedness of the problem reflects the diversity among the stakeholders in the problem.</P><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-top:15pt;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">Most projects in organizations &#8212; and virtually all technology-related projects these days &#8212; are about wicked problems. Indeed, it is the social complexity of these problems, not their technical complexity, that overwhelms most current problem solving and project management approaches. (See graphic of wicked problem solving process below.)</P><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-top:15pt;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">Some specific aspects of problem wickedness include:</P><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-left:0.5in;border-left:windowtext 1pt solid;text-indent:-0.25in;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">1. You don&#8217;t understand the problem until you have developed a solution. Indeed, there is no definitive statement of &#8220;The Problem.&#8221; The problem is ill-structured, an evolving set of interlocking issues and constraints.</P><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-left:0.5in;border-left:windowtext 1pt solid;text-indent:-0.25in;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">2. Wicked problems have no stopping rule. Since there is no definitive &#8220;The Problem&#8221;, there is also no definitive &#8220;The Solution.&#8221; The problem solving process ends when you run out of resources.</P><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-left:0.5in;border-left:windowtext 1pt solid;text-indent:-0.25in;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">3. Solutions to wicked problems are not right or wrong, simply &#8220;better,&#8221; &#8220;worse,&#8221; &#8220;good enough,&#8221; or &#8220;not good enough.&#8221;</P><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-left:0.5in;border-left:windowtext 1pt solid;text-indent:-0.25in;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">4. Every wicked problem is essentially unique and novel. There are so many factors and conditions, all embedded in a dynamic social context, that no two wicked problems are alike, and the solutions to them will always be custom designed and fitted.</P><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-left:0.5in;border-left:windowtext 1pt solid;text-indent:-0.25in;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">5. Every solution to a wicked problem is a &#8220;one-shot operation,&#8221; every attempt has consequences. As Rittel says, &#8220;One cannot build a freeway to see how it works.&#8221; This is the &#8220;Catch 22&#8243; about wicked problems: you can&#8217;t learn about the problem without trying solutions, but every solution you try is expensive and has lasting unintended consequences which are likely to spawn new wicked problems.</P><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;margin-left:0.5in;border-left:windowtext 1pt solid;text-indent:-0.25in;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">6. Wicked problems have no given alternative solutions. There may be no solutions, or there may be a host of potential solutions that are devised, and another host that are never even thought of.</P><br />
<P class="MsoNormal" style="border-right:windowtext 1pt solid;border-top:windowtext 1pt solid;border-left:windowtext 1pt solid;border-bottom:windowtext 1pt solid;padding:1pt 4pt;" align="left">(from Rittel and Webber, 1973)</P></p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/dcarr.wordpress.com/91/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/dcarr.wordpress.com/91/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/dcarr.wordpress.com/91/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/dcarr.wordpress.com/91/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/dcarr.wordpress.com/91/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/dcarr.wordpress.com/91/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/dcarr.wordpress.com/91/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/dcarr.wordpress.com/91/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/dcarr.wordpress.com/91/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/dcarr.wordpress.com/91/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/dcarr.wordpress.com/91/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/dcarr.wordpress.com/91/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=91&subd=dcarr&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://team.pushbomb.com/2008/05/08/the-collision-of-software-project-management-and-agile/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7b572cbcda5a17fe984e7dd1ddc9c3d6?s=96&#38;d=&#38;r=PG" medium="image">
			<media:title type="html">pushbomb</media:title>
		</media:content>

		<media:content url="http://dcarr.files.wordpress.com/2008/04/chart.png?w=256" medium="image" />
	</item>
		<item>
		<title>ReSharper 4.0 EAP Notes &#8211; JetBrains.net</title>
		<link>http://team.pushbomb.com/2008/05/01/resharper-40-eap-notes-jetbrainsnet/</link>
		<comments>http://team.pushbomb.com/2008/05/01/resharper-40-eap-notes-jetbrainsnet/#comments</comments>
		<pubDate>Thu, 01 May 2008 15:33:16 +0000</pubDate>
		<dc:creator>Damon Wilder Carr</dc:creator>
				<category><![CDATA[C# 3.0 for Internal DSL]]></category>
		<category><![CDATA[Framework Design]]></category>
		<category><![CDATA[Proof Driven Development]]></category>
		<category><![CDATA[Software Design]]></category>
		<category><![CDATA[Software Futures]]></category>
		<category><![CDATA[resharper]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[EAP]]></category>
		<category><![CDATA[ReSharper 4.0]]></category>

		<guid isPermaLink="false">http://dcarr.wordpress.com/2008/05/01/resharper-40-eap-notes-jetbrainsnet/</guid>
		<description><![CDATA[
 From ReSharper&#8217;s EAP Site
I&#8217;ve been using the 4.0 EAP (pre-beta) since the first preview and it&#8217;s awesome&#8230; Rocky at times, but I&#8217;ve never lost any code (however you should use at your own risk!).
There is something very comforting in auto-creating an anonymous delegate and having it convert automagically to lambata syntax&#8230;.
For example, here is [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=182&subd=dcarr&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<blockquote>
<h3><span style="color:#ffffff;"> From ReSharper&#8217;s EAP Site</span></h3>
<p>I&#8217;ve been using the 4.0 EAP (pre-beta) since the first preview and it&#8217;s awesome&#8230; Rocky at times, but I&#8217;ve never lost any code (however you should use at your own risk!).</p>
<p>There is something very comforting in auto-creating an anonymous delegate and having it convert automagically to lambata syntax&#8230;.</p>
<p>For example, here is a step by step from a real code sample:</p>
<h4><a name="ReSharper4.0EAPNotes-C#3.0support">C# 3.0 support</a></h4>
<p><a name="ReSharper4.0EAPNotes-Implicitlytypedlocalsandarrays">Implicitly typed locals and arrays</a></p>
<p>Fully supported, including suggestions to omit explicit type specification, Introduce Variable refactoring and context actions to convert to implicit or explicit form.<br />
<img src="http://www.jetbrains.net/confluence/download/attachments/31721/release_notes_use_var.png" border="0" alt="" align="absmiddle" /></p>
<p><a name="ReSharper4.0EAPNotes-ExtensionMethodssupport">Extension Methods support</a></p>
<p>Fully supported, with Import Symbol completion (previously known as Type Name completion) after dot which can import suitable extension method and insert appropriate using directive. Analysis will suggest converting invocations from static-like to instance-like form. Context action can convert it back, and there are refactorings to convert static method of static class to Extension Method and update all call sites. There is also reverse refactoring, of course.</p>
<p><a name="ReSharper4.0EAPNotes-Objectandcollectioninitializers">Object and collection initializers</a></p>
<p>Fully supported, with suggestions and context actions to fold series of statements to collection or object to initializer, if possible.<br />
<img src="http://www.jetbrains.net/confluence/download/attachments/31721/release_notes_use_object_initializer.png" border="0" alt="" align="absmiddle" /><br />
ReSharper also provides smart intellisense features in such places, like completing settable properies or displaying correct parameter information for Add method used in collection initializer.<br />
<img src="http://www.jetbrains.net/confluence/download/attachments/31721/release_notes_completion_in_initializer.png" border="0" alt="" align="absmiddle" /></p>
<p><a name="ReSharper4.0EAPNotes-Automaticproperties">Automatic properties</a></p>
<p>Fully supported, with context actions to convert to property with backing field and back. Analysis can show properties which are candidates for conversion. Code generation features may suggest creating automatic property in addition to property with backing field, if appropriate.<br />
<img src="http://www.jetbrains.net/confluence/download/attachments/31721/release_notes_convert_to_autoproperty.png" border="0" alt="" align="absmiddle" /></p>
<p><a name="ReSharper4.0EAPNotes-Anonymoustypes">Anonymous types</a></p>
<p>Fully supported. ReSharper can search for similar anonymous types throughout the project or solution, give a name to anonymous type and replace usages, rename properties, suggest reordering properties if two anonymous types look similar and more.<br />
<img src="http://www.jetbrains.net/confluence/download/attachments/31721/release_notes_sync_anonymous_types.png" border="0" alt="" align="absmiddle" /></p>
<p><a name="ReSharper4.0EAPNotes-Lambdas">Lambdas</a></p>
<p>Partially supported. By partially, it means that not all features we want there are ready. The code shouldn&#8217;t be red and intellisense should be working, but some context actions, quickfixes, analysis and such may be missing. We are actively working on those features, so as time passes ReSharper will be more and more smart about lambdas. We have conversion actions like delegate to lambda and back and some suggestions. Note, that not all features of ReSharper are lambda-aware yet, so they may fail when they happen to operate on lambdas.<br />
<img src="http://www.jetbrains.net/confluence/download/attachments/31721/release_notes_convert_to_lambda.png" border="0" alt="" align="absmiddle" /></p>
<p><a name="ReSharper4.0EAPNotes-LINQ">LINQ</a></p>
<p>Almost supported. We import appropriate extension methods, provide intellisense, a number quickfixes, our refactorings are aware of queries. We also provide special live templates.</p>
<p><a name="ReSharper4.0EAPNotes-Partialmethods">Partial methods</a></p>
<p>Not supported.</p>
<p><a name="ReSharper4.0EAPNotes-Newandupdatedfeatures">New and updated features</a></p>
<p><a name="ReSharper4.0EAPNotes-GotoType,File,SymbolandFindResults">Go to Type, File, Symbol and Find Results</a></p>
<p>You can now put results of &#8220;Go to&#8221; features to find results for browsing<br />
<img src="http://www.jetbrains.net/confluence/download/attachments/31721/GotoByNameResults.png" border="0" alt="" width="488" height="415" align="absmiddle" /></p>
<p><a name="ReSharper4.0EAPNotes-ExternalAnnotations">External Annotations</a></p>
<p>Ability to annotate external (non-source) symbols with ReSharper-specific attributes, like CanBeNull and NotNull. Note, that we standardized attribute names for better interoperability and less configuration hassle, so you may need to refactor you code a bit if you use these attributes.</p>
<p><a name="ReSharper4.0EAPNotes-CodeCleanup">Code Cleanup</a></p>
<p>Successor of Reformat Code, Optimize Usings and other code cleaning features &#8211; all in one interface with many more modules. Includes things like processing readonly fields, removing redundancies, updating file header, converting to automatic properties, replacing explicit types with vars and more. All in batch mode, so that you can instantly clean the whole project or even solution.<br />
<img src="http://www.jetbrains.net/confluence/download/attachments/31721/release_notes_code_cleanup.png" border="0" alt="" align="absmiddle" /></p>
<p><a name="ReSharper4.0EAPNotes-Plentyofnewanalyses">Plenty of new analyses</a></p>
<p>We added many more inspections in ReSharper 4. Some of them are related to C# 3.0 and deal with new language constructs. Also, there are new structure-related inspections, like &#8220;if&#8221; statement analysis, anonymous method closure analysis, and more. We also added new severity level for analysis results &#8211; Hint &#8211; which is a lot less intrusive. It does not participate in next/previous highlight navigation and is not shown on error stripe. It simply tells you: &#8220;Pssst! Take a look here, it can make your code look better.&#8221;</p>
<p><a name="ReSharper4.0EAPNotes-CompleteStatement">Complete Statement</a></p>
<p>Also known as Smart Enter, it inserts required syntax elements to complete the code you are writing. It can close parentheses as needed, add semicolon, complete constructs such as if, while, for and so on.</p>
<p><a name="ReSharper4.0EAPNotes-CompletionwithCamelHumps">Completion with CamelHumps</a></p>
<p>All kinds of code completion (Symbol completion, Import Symbol Completion and Smart Completion) now supports filtering by CamelHumps, which tremendously speeds things up. E.g. if you know you have D<em>efaultCodeCompletionManager</em> type somewhere you just type <em>DCCM</em> and invoke Import symbol completion. Full type name will be inserted and using directive will be added as needed.</p>
<p><a name="ReSharper4.0EAPNotes-Refactorings">Refactorings</a></p>
<p>There are new refactorings related to C# 3.0 features, like &#8220;Convert Property to Automatic Property&#8221; and back, &#8220;Convert Static Method to Extension Method&#8221; and back and &#8220;Name Anonymous Type&#8221;. &#8220;Introduce Variable&#8221; is now dialogless and this improves coding flow a lot! Another great new refactoring is &#8220;Inline Method&#8221;, which can replace method call with method body at specific point or all over your code. &#8220;Method to Indexer&#8221; is a nice addition to &#8220;Method to Property&#8221; refactoring. There are also improvements in almost all refactorings, both in usability and smartness.</p>
<p><a name="ReSharper4.0EAPNotes-RecentEdits">Recent Edits</a></p>
<p>In addition to Recent Files we created Recent Edits feature, which shows what you&#8217;ve been changing recently. If appropriate, it displays type and member the change occured in.<br />
<img src="http://www.jetbrains.net/confluence/download/attachments/31721/RecentEdits.png" border="0" alt="" width="495" height="175" align="absmiddle" /></p>
<p><a name="ReSharper4.0EAPNotes-Todoitemsonidentifiersandstringliterals">To-do items on identifiers and string literals</a></p>
<p>You can now configure ReSharper to search for specific patterns not only in comments, but also in string literals and identifiers. It is quite useful to set NotImplementedException pattern to have a quick access to code you have to write.<br />
<img src="http://www.jetbrains.net/confluence/download/attachments/31721/ToDoIdentifiers.png" border="0" alt="" align="absmiddle" /></p>
<p><a name="ReSharper4.0EAPNotes-Supportforsolutionsusingdifferenttargets">Support for solutions using different targets</a></p>
<p>ReSharper now fully supports solutions where different projects use different versions of CLR like .NET Compact Framework or Silverlight. You can now have e.g. Smart Device projects and normal projects in the same solution and all ReSharper features will work perfectly fine in this scenario.</p>
<p><a name="ReSharper4.0EAPNotes-ProjectReferences">Project References</a></p>
<p>This is more like preview of the feature which may or may not come into final bits of ReSharper 4. It can show dependencies between projects and libraries in terms of assembly references.</p>
<p><a name="ReSharper4.0EAPNotes-LiveTemplatesEditor">Live Templates Editor</a></p>
<p>We are improving usability of Live Templates editor and currently it is large work in progress. Be careful with it if you use custom templates.</p>
<p><a name="ReSharper4.0EAPNotes-Easiercreationofnewfoldersthroughgenerate(AltInsertshortcut)">Easier creation of new folders through generate (Alt+Insert shortcut)</a></p>
<p><img src="http://www.jetbrains.net/confluence/download/attachments/31721/release_notes_new_folder.png" border="0" alt="" align="absmiddle" /></p>
<p><a name="ReSharper4.0EAPNotes-Dozensofotherfeatures">Dozens of other features</a></p>
<p>We also have dozens of other minor features, keep track of</p>
<p><a href="http://www.jetbrains.net/jira/secure/IssueNavigator.jspa?reset=true&amp;&amp;type=2&amp;pid=10241&amp;resolution=1&amp;fixfor=11304&amp;sorter/field=issuekey&amp;sorter/order=DESC">this tracker query<sup><img src="http://www.jetbrains.net/confluence/images/icons/linkext7.gif" border="0" alt="" width="7" height="7" align="absmiddle" /></sup></a> for the current list.</p></blockquote>
<p><a href="http://www.jetbrains.net/confluence/display/ReSharper/ReSharper+4.0+EAP+Notes">ReSharper 4.0 EAP Notes &#8211; JetBrains.net</a></p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/dcarr.wordpress.com/182/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/dcarr.wordpress.com/182/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/dcarr.wordpress.com/182/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/dcarr.wordpress.com/182/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/dcarr.wordpress.com/182/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/dcarr.wordpress.com/182/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/dcarr.wordpress.com/182/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/dcarr.wordpress.com/182/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/dcarr.wordpress.com/182/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/dcarr.wordpress.com/182/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/dcarr.wordpress.com/182/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/dcarr.wordpress.com/182/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=182&subd=dcarr&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://team.pushbomb.com/2008/05/01/resharper-40-eap-notes-jetbrainsnet/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7b572cbcda5a17fe984e7dd1ddc9c3d6?s=96&#38;d=&#38;r=PG" medium="image">
			<media:title type="html">pushbomb</media:title>
		</media:content>

		<media:content url="http://www.jetbrains.net/confluence/download/attachments/31721/release_notes_use_var.png" medium="image" />

		<media:content url="http://www.jetbrains.net/confluence/download/attachments/31721/release_notes_use_object_initializer.png" medium="image" />

		<media:content url="http://www.jetbrains.net/confluence/download/attachments/31721/release_notes_completion_in_initializer.png" medium="image" />

		<media:content url="http://www.jetbrains.net/confluence/download/attachments/31721/release_notes_convert_to_autoproperty.png" medium="image" />

		<media:content url="http://www.jetbrains.net/confluence/download/attachments/31721/release_notes_sync_anonymous_types.png" medium="image" />

		<media:content url="http://www.jetbrains.net/confluence/download/attachments/31721/release_notes_convert_to_lambda.png" medium="image" />

		<media:content url="http://www.jetbrains.net/confluence/download/attachments/31721/GotoByNameResults.png" medium="image" />

		<media:content url="http://www.jetbrains.net/confluence/download/attachments/31721/release_notes_code_cleanup.png" medium="image" />

		<media:content url="http://www.jetbrains.net/confluence/download/attachments/31721/RecentEdits.png" medium="image" />

		<media:content url="http://www.jetbrains.net/confluence/download/attachments/31721/ToDoIdentifiers.png" medium="image" />

		<media:content url="http://www.jetbrains.net/confluence/download/attachments/31721/release_notes_new_folder.png" medium="image" />

		<media:content url="http://www.jetbrains.net/confluence/images/icons/linkext7.gif" medium="image" />
	</item>
		<item>
		<title>System.Addin Extensibility features in Microsoft .NET 3.5 &#8211; my new best friend</title>
		<link>http://team.pushbomb.com/2007/12/28/systemaddin-extensibility-features-in-microsoft-net-35-my-new-best-friend/</link>
		<comments>http://team.pushbomb.com/2007/12/28/systemaddin-extensibility-features-in-microsoft-net-35-my-new-best-friend/#comments</comments>
		<pubDate>Fri, 28 Dec 2007 21:27:45 +0000</pubDate>
		<dc:creator>Damon Wilder Carr</dc:creator>
				<category><![CDATA[Software Design]]></category>
		<category><![CDATA[Common]]></category>
		<category><![CDATA[EnvDTE]]></category>
		<category><![CDATA[Fix]]></category>
		<category><![CDATA[Visual Studio]]></category>
		<category><![CDATA[VSX]]></category>

		<guid isPermaLink="false">http://damon.agilefactor.com/2007/12/28/systemaddin-extensibility-namespace-in-microsoft-net-35-my-new-best-friend/</guid>
		<description><![CDATA[After spending many years now tweaking my own set of APIs that I have relied heavily on, I am hooked on the new features in .NET 3.5. This will be the first in a set of posts I make. For now here are...<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=113&subd=dcarr&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p><a href="http://dcarr.files.wordpress.com/2008/04/exclamation1.png"></a>After spending many years now tweaking my own set of APIs that I have relied heavily on, I am hooked on the new features in .NET 3.5. </p>
<p><strong><span style="font-size:large;">Add-Ins and Extensibility</span></strong></p>
<p><strong></strong><br />
The System.AddIn.dll assembly in the .NET Framework 3.5 provides powerful and flexible support to developers of extensible applications. It introduces a new architecture and model that helps developers with the initial work to add extensibility to an application and by ensuring that their extensions continue working as the host application changes. The model provides the following features:</p>
<ul>
<li>DiscoveryYou can easily find and manage sets of add-ins in multiple locations on a computer with the <a id="ctl00_rs1_mainContentContainer_ctl30" href="http://207.46.199.254/en-us/library/bb291946.aspx">AddInStore</a><span style="color:#000080;"> </span>class. You can use this class to search for and obtain information about add-ins by their base types without having to load them.</li>
<li>ActivationAfter an application chooses an add-in, the <a id="ctl00_rs1_mainContentContainer_ctl31" href="http://207.46.199.254/en-us/library/bb301626.aspx">AddInToken</a> class makes it easy to activate. Simply choose the isolation and sandboxing level and the system takes care of the rest.</li>
<li>IsolationThere is built-in support for application domains and process isolation of add-ins. The isolation level for each add-in is in the control of the host. The system handles loading application domains and processes and shutting them down after their add-ins have stopped running.</li>
<li>SandboxingYou can easily configure add-ins with either a default or customized trust level. Support includes Internet, Intranet, Full Trust, and “same-as-host” permission sets, as well as overloads that let the host specify a custom permission set.</li>
<li>UI CompositionThe add-in model supports direct composition of Windows Presentation Foundation (WPF) controls that span application domain boundaries. You can easily allow add-ins to contribute directly to the UI of the host while still retaining the benefits of isolation, ability to unload, sandboxing, and versioning.</li>
<li>VersioningThe add-in architecture makes it possible for hosts to introduce new versions of their object model without breaking existing add-ins or impacting the developer experience for n</li>
</ul>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/dcarr.wordpress.com/113/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/dcarr.wordpress.com/113/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/dcarr.wordpress.com/113/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/dcarr.wordpress.com/113/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/dcarr.wordpress.com/113/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/dcarr.wordpress.com/113/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/dcarr.wordpress.com/113/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/dcarr.wordpress.com/113/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/dcarr.wordpress.com/113/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/dcarr.wordpress.com/113/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/dcarr.wordpress.com/113/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/dcarr.wordpress.com/113/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=113&subd=dcarr&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://team.pushbomb.com/2007/12/28/systemaddin-extensibility-features-in-microsoft-net-35-my-new-best-friend/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7b572cbcda5a17fe984e7dd1ddc9c3d6?s=96&#38;d=&#38;r=PG" medium="image">
			<media:title type="html">pushbomb</media:title>
		</media:content>
	</item>
		<item>
		<title>Fix for EnvDTE Bug in Versioning &#8211; Visual Studio Extensibility Common Issue Fix</title>
		<link>http://team.pushbomb.com/2007/12/22/visual-studio-automation-and-extensibility/</link>
		<comments>http://team.pushbomb.com/2007/12/22/visual-studio-automation-and-extensibility/#comments</comments>
		<pubDate>Sat, 22 Dec 2007 20:57:09 +0000</pubDate>
		<dc:creator>Damon Wilder Carr</dc:creator>
				<category><![CDATA[Software Design]]></category>
		<category><![CDATA[Software Factories]]></category>
		<category><![CDATA[resharper]]></category>
		<category><![CDATA[EnvDTE]]></category>
		<category><![CDATA[Visual Studio]]></category>
		<category><![CDATA[VSLangProj]]></category>

		<guid isPermaLink="false">http://dcarr.wordpress.com/2007/12/22/here-is-a-good-gotcha-that-some-have-not-found-yet/</guid>
		<description><![CDATA[If you create a project that references one or more of the VSLangProj assemblies and the EnvDTE assembly, you can occasionally get the following error at runtime:“Unhandled Exception: System.IO.FileNotFoundException: Error while loading file ‘EnvDTE, Version=7.0.3300.0″This error is due to a runtime type resolution conflict. That is, the version of EnvDTE that is included with Visual Studio 2005 is 8.0.xx, but the project’s configuration reference is looking for an earlier version of this assembly, version 7.0.xx. To fix this problem, you must add a binding redirect for the newer version of EnvDTE to your project’s configuration (.config) file. This will enable Visual Studio to load the newer version of EnvDTE and prevent the error from occurring.To do this, add an “Application Configuration File” to your project and then replace its contents with the following:<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=108&subd=dcarr&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class="snap_preview">
<p align="left">This is known by many who have been doing VSX for a while, but I ran into it again recently and thought since many are no getting into this fresh, more sources are good.</p>
<p align="left"> </p>
<div class="majorTitle">
<h2>Visual Studio Automation and Extensibility</h2>
</div>
</div>
<div class="title">
<h4><a href="http://msdn2.microsoft.com/en-us/library/ms228768.aspx">Error When EnvDTE Is Used with VSLangProj Assemblies</a></h4>
</div>
<div class="introduction">If you create a project that references one or more of the VSLangProj assemblies and the EnvDTE assembly, you can occasionally get the following error at <a href="http://www.answers.com/topic/runtime?nafid=22">runtime</a>:</div>
<blockquote>
<div class="introduction"><strong>“Unhandled Exception: System.IO.FileNotFoundException: Error while loading file ‘EnvDTE, Version=7.0.3300.0″</strong></div>
</blockquote>
<div class="introduction">This error is due to a runtime type resolution conflict. That is, the version of EnvDTE that is included with Visual Studio 2005 is 8.0.xx, but the project’s <a href="http://www.answers.com/topic/configuration?nafid=22">configuration</a> reference is looking for an earlier version of this assembly, version 7.0.xx.</div>
<div class="introduction">To fix this problem, you must add a binding redirect for the newer version of EnvDTE to your project’s configuration (.config) file. This will enable Visual Studio to load the newer version of EnvDTE and prevent the error from occurring.To do this, add an “Application Configuration File” to your project and then replace its contents with the following:This error occurs only if you are building an <a href="http://www.answers.com/topic/extendicare-inc?nafid=22">EXE</a>, since <a href="http://www.answers.com/topic/data-link-layer?nafid=22">DLL</a>’s do not have config files.</div>
<p> </p>
<pre>&lt;configuration&gt;</pre>
<pre>&lt;runtime&gt;</pre>
<pre>&lt;assemblyBinding xmlns="urn:schemas-microsoft- com:asm.v1"</pre>
<pre>appliesTo="v2.0.50318"&gt;</pre>
<pre>&lt;dependentAssembly&gt;</pre>
<pre>&lt;assemblyIdentity name="EnvDTE" publicKeyToken= "b03f5f7f11d50a3a"/&gt;</pre>
<pre>&lt;bindingRedirect oldVersion="7.0.3300.0" newVersion="8.0.0.0"/&gt;</pre>
<pre>&lt;/dependentAssembly&gt;</pre>
<pre>&lt;/assemblyBinding&gt;</pre>
<pre>&lt;/runtime&gt;</pre>
<pre>&lt;/configuration&gt;</pre>
<p> </p>
<p align="center"><a href="http://dcarr.files.wordpress.com/2007/12/techsmithword0a1.png"></a></p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/dcarr.wordpress.com/108/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/dcarr.wordpress.com/108/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/dcarr.wordpress.com/108/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/dcarr.wordpress.com/108/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/dcarr.wordpress.com/108/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/dcarr.wordpress.com/108/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/dcarr.wordpress.com/108/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/dcarr.wordpress.com/108/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/dcarr.wordpress.com/108/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/dcarr.wordpress.com/108/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/dcarr.wordpress.com/108/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/dcarr.wordpress.com/108/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=108&subd=dcarr&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://team.pushbomb.com/2007/12/22/visual-studio-automation-and-extensibility/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7b572cbcda5a17fe984e7dd1ddc9c3d6?s=96&#38;d=&#38;r=PG" medium="image">
			<media:title type="html">pushbomb</media:title>
		</media:content>
	</item>
		<item>
		<title>SpaceTime Beta 2 Now Available!!!</title>
		<link>http://team.pushbomb.com/2007/12/20/spacetime-beta-2-now-available/</link>
		<comments>http://team.pushbomb.com/2007/12/20/spacetime-beta-2-now-available/#comments</comments>
		<pubDate>Thu, 20 Dec 2007 22:52:00 +0000</pubDate>
		<dc:creator>Damon Wilder Carr</dc:creator>
				<category><![CDATA[Software Design]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[Metadata]]></category>
		<category><![CDATA[Tech Tools]]></category>

		<guid isPermaLink="false">http://dcarr.wordpress.com/2007/12/20/spacetime-beta-2-now-available/</guid>
		<description><![CDATA[FROM THE PUBLISHERS:
We wanted to share some of the features in the new version with you below as well as some surprises! We are also working on a Mac version and a Linux version which might take longer.
Thank you for your continued interest and we look forward to seeing you in 3D! I would also [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=93&subd=dcarr&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<pre>FROM THE PUBLISHERS:</pre>
<p>We wanted to share some of the features in the new version with you below as well as some surprises! We are also working on a Mac version and a Linux version which might take longer.</p>
<p>Thank you for your continued interest and we look forward to seeing you in 3D! I would also appreciate any Feedback you could share with us. If you have any installation issues, please feel free to email me and I will work with you to make sure SpaceTime works for you. I know you are going to enjoy this version.</p>
<p>Thank you! Eddie Bakhash CEO</p>
<p>SpaceTime Features:</p>
<p>SpaceTime Zoom &#8211; Type in Google or Yahoo! search 3D Interactivity &#8211; Interact with web pages in 3D! Ctrl-Link &#8211; Press control link on a hyperlink to create that link in a new 3D space. Resize Images/Videos &#8211; Click any video or image in the lower right hand corner to scale it.</p>
<p>FASTER &#8211; Your initial search in SpaceTime will be much faster!</p>
<p>Favorites &#8211; Bookmark your favorite web pages. SpaceTime automatically imports your IE7 bookmarks.</p>
<p>Save Space!!!! &#8211; Yes. Load up your space. Save it. Open it up again. It is truly spectacular.</p>
<p>New Navigator &#8211; Click the navigator in the upper right hand corner to experience a new way to move around your 3D space.</p>
<p>Screenshot &#8211; Wherever you are, click the Screenshot icon in the upper right hand corner to capture the viewpoint you are at permanently by placing an icon on the timeline.</p>
<p>Clicking the icon takes you back to that viewpoint.</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/dcarr.wordpress.com/93/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/dcarr.wordpress.com/93/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/dcarr.wordpress.com/93/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/dcarr.wordpress.com/93/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/dcarr.wordpress.com/93/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/dcarr.wordpress.com/93/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/dcarr.wordpress.com/93/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/dcarr.wordpress.com/93/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/dcarr.wordpress.com/93/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/dcarr.wordpress.com/93/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/dcarr.wordpress.com/93/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/dcarr.wordpress.com/93/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=93&subd=dcarr&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://team.pushbomb.com/2007/12/20/spacetime-beta-2-now-available/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7b572cbcda5a17fe984e7dd1ddc9c3d6?s=96&#38;d=&#38;r=PG" medium="image">
			<media:title type="html">pushbomb</media:title>
		</media:content>
	</item>
		<item>
		<title>NHibernate Custom Collections Supporting Lazy Loading with IPersistentCollection &amp; DomainPersistentGenericBag</title>
		<link>http://team.pushbomb.com/2007/11/07/nhibernate-custom-collections/</link>
		<comments>http://team.pushbomb.com/2007/11/07/nhibernate-custom-collections/#comments</comments>
		<pubDate>Wed, 07 Nov 2007 05:44:00 +0000</pubDate>
		<dc:creator>Damon Wilder Carr</dc:creator>
				<category><![CDATA[ORM]]></category>
		<category><![CDATA[Software Design]]></category>
		<category><![CDATA[Software Factories]]></category>
		<category><![CDATA[nhibernate]]></category>
		<category><![CDATA[resharper]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[ActiveRecord]]></category>
		<category><![CDATA[agile practices]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[C# 3.0 Enhancements]]></category>
		<category><![CDATA[Collections]]></category>

		<guid isPermaLink="false">http://dcarr.wordpress.com/2007/07/23/nhibernate-custom-collections-supporting-lazy-loading-with-ipersistentcollection-domainpersistentgenericbag/</guid>
		<description><![CDATA[In NHibernate, to write a custom persistable collection you must inherit from PersistentGenericBag which has no empty constructors (therefore you cannot use this to inherit on your main collection (!) as you MUST have an empty constructor for NHibernate to use it). FUN!
When you inherit from the concrete List as well as IUserCollectionType and (after finally getting it to work perhaps) wonder why they get casting exceptions when using a lazy loaded collection (the default now with 1.2.0) it is more then a pain....<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=83&subd=dcarr&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p style="text-align:center;"><span style="color:#ff0000;"><strong>NOTE: This is now being updated to cover NHibernate 2.0.0.X so please check back if interested in new approaches to this. The previous solution posted is now outdated and I do not recommend using it.</strong></span></p>
<p style="text-align:center;"><strong></strong></p>
<p style="text-align:center;">I will soon be posting a new article which (in my opinion) could be far more useful to every<a href="http://dcarr.files.wordpress.com/2008/04/chart.png"><img class="alignright size-medium wp-image-165" style="float:right;border-width:0;margin:5px;" src="http://dcarr.files.wordpress.com/2008/04/chart.png?w=256" alt="" height="212" /></a>one then this article ever was as it:</p>
<ul>
<li>Has far greater scope and use as Is a &#8216;domain collection&#8217; engine and I believe the first solution to something I have been struggling with for years: The pain of building clean, quick web views in the world of Ajax, controls that expect datasets, and programmers not understanding ORM. It so far works with <a href="http://www.codeproject.com/KB/architecture/NHibernateBestPractices.aspx">NHIbernate </a>(and <a href="http://using.castleproject.org/display/AR/An+introduction">ActiveRecord</a>) and I am finalizing Linq to Entity support</li>
<li>Leverages advanced .NET intrinsic&#8217;s (CustomTypeDescriptors, etc&#8230;) that are leveraged by the third-part component community</li>
<li>
<p style="text-align:left;">Support any &#8216;domain projection/entity set&#8217; operation &#8211; the same engine backs both bindable sets and non-bindable sets.. You just pass the HQL into the user control in VS 2005/2008</p>
</li>
</ul>
<p style="text-align:center;">
<p><span id="more-83"></span><strong></strong>Also stop by the new global repository I am bringing up with some others around &#8216;best practices&#8217; for domain driven (obsessed) work. This has a .NET 3.5 focus (as we will deeply discuss linq I am planning) however it is an architects site, so we will cover mono, java, and likely 50% of the content will be platform agnostic.More to come!</p>
<div style="text-align:center;"><span style="color:#666699;"></p>
<div style="text-align:center;"><strong></strong></div>
<p></span></div>
<p style="text-align:center;">
<div><span style="color:#666699;"></p>
<div style="text-align:center;"><strong><span style="color:#0000ff;">UPDATE: Billy McCafferty has done a fantastic job picking up where I barely get started.</span></strong></div>
<p><strong></strong></p>
<p></span></p>
<div><span style="color:#666699;"><strong><span style="color:#0000ff;"></p>
<div style="text-align:center;"><a href="http://devlicio.us/blogs/billy_mccafferty/archive/2007/12/03/custom-collections-with-nhibernate-part-i-the-basics.aspx">Go here for the must read posts.</a></div>
<div style="text-align:center;"> </div>
<div style="text-align:center;"> </div>
<p><font color="#666699"><strong><font color="#0000ff"> </p>
<p></font></strong></font></span> </p>
<p></strong></span><strong></strong></p>
</div>
</div>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/dcarr.wordpress.com/83/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/dcarr.wordpress.com/83/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/dcarr.wordpress.com/83/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/dcarr.wordpress.com/83/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/dcarr.wordpress.com/83/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/dcarr.wordpress.com/83/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/dcarr.wordpress.com/83/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/dcarr.wordpress.com/83/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/dcarr.wordpress.com/83/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/dcarr.wordpress.com/83/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/dcarr.wordpress.com/83/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/dcarr.wordpress.com/83/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=83&subd=dcarr&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://team.pushbomb.com/2007/11/07/nhibernate-custom-collections/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7b572cbcda5a17fe984e7dd1ddc9c3d6?s=96&#38;d=&#38;r=PG" medium="image">
			<media:title type="html">pushbomb</media:title>
		</media:content>

		<media:content url="http://dcarr.files.wordpress.com/2008/04/chart.png?w=256" medium="image" />
	</item>
		<item>
		<title>Software as a Service and Service Oriented Architecture &#8211; Why they fail to meet the hype in execution</title>
		<link>http://team.pushbomb.com/2007/10/01/software-as-a-service-its-all-about-the-words/</link>
		<comments>http://team.pushbomb.com/2007/10/01/software-as-a-service-its-all-about-the-words/#comments</comments>
		<pubDate>Mon, 01 Oct 2007 02:30:00 +0000</pubDate>
		<dc:creator>Damon Wilder Carr</dc:creator>
				<category><![CDATA[C# 3.0 for Internal DSL]]></category>
		<category><![CDATA[Framework Design]]></category>
		<category><![CDATA[Proof Driven Development]]></category>
		<category><![CDATA[Software Design]]></category>
		<category><![CDATA[Software Factories]]></category>
		<category><![CDATA[Software Futures]]></category>
		<category><![CDATA[agile practices]]></category>
		<category><![CDATA[.NET Web Services]]></category>
		<category><![CDATA[Communication Foundation]]></category>
		<category><![CDATA[Domain Model]]></category>
		<category><![CDATA[Entity Model]]></category>
		<category><![CDATA[Evolution of Software]]></category>
		<category><![CDATA[Philosophy]]></category>
		<category><![CDATA[SaaS]]></category>
		<category><![CDATA[Semantics]]></category>
		<category><![CDATA[Service Oriented Architecture]]></category>
		<category><![CDATA[SOA]]></category>
		<category><![CDATA[Softwre as a Service]]></category>
		<category><![CDATA[WCF]]></category>

		<guid isPermaLink="false">http://dcarr.wordpress.com/2007/10/01/software-as-a-service-its-all-about-the-words/</guid>
		<description><![CDATA[The hype factor has done it again. We are all left starting at each other for just what in the world we all mean by SOA. ENOUGH! It's not that hard, and consultants, (myself being one so I will not be overly critical), vendors, the media, etc. have DESTROYED yet again any meaning in language. N-Tier, Message Bus, etc. etc. it goes back 20 years! The pattern never ends..<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=90&subd=dcarr&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<p>The hype factor has done it again. We are all left starting at each other for just what in the world we all mean by SOA. ENOUGH! It&#8217;s not that hard, and consultants, (myself being one so I will not be overly critical), vendors, the media, etc. have DESTROYED yet again any meaning in language. N-Tier, Message Bus, etc. etc. it goes back 20 years! The pattern never ends..</p>
<p>Not to be a terrible bore, but brush up on your <a href="http://en.wikipedia.org/wiki/Ludwig_Wittgenstein">Wittgenstein</a> lately?! Ok don&#8217;t go that far just yet&#8230;(grin).</p>
<p> First, a <a href="http://en.wikipedia.org/wiki/Pattern_language">Pattern Language</a> (P.L.) is not some academic concept, although many would like you to believe that.</p>
<p> </p>
<div>
<table border="0" cellspacing="0" cellpadding="2" width="262" align="right">
<tbody>
<tr>
<td width="77" align="right" valign="top"><a title="pdf-icon" href="http://www.flickr.com/photos/93223205@N00/1468114276/"><img src="http://static.flickr.com/1150/1468114276_f1d15541e6.jpg" border="0" alt="pdf-icon" width="31" height="31" /></a></td>
<td width="183" align="right" valign="top"><a href="http://www.agilefactor.com/SaasPatternLanguage.pdf">&#8216;Software as a Service &#8211; The Pattern Language Approach&#8217;</a></td>
</tr>
<tr>
<td width="77" align="right" valign="top"><a title="ie-icon" href="http://www.flickr.com/photos/93223205@N00/1468122752/"><img src="http://static.flickr.com/1196/1468122752_7267762646.jpg" border="0" alt="ie-icon" width="31" height="32" /></a></td>
<td width="183" align="right" valign="top"><a href="http://www.agilefactor.com/SaasPatternLanguage_files/fullscreen.htm#slide0001.htm">&#8216;Software as a Service &#8211; The Pattern Language Approach&#8217;</a></td>
</tr>
<tr>
<td width="77" align="right" valign="top"><a title="icon-set2-firefox" href="http://www.flickr.com/photos/93223205@N00/1468130216/"><img src="http://static.flickr.com/1259/1468130216_a701773dab.jpg" border="0" alt="icon-set2-firefox" width="31" height="31" /></a></td>
<td width="183" align="right" valign="top"><a href="http://www.agilefactor.com/SaasPatternLanguage.htm">&#8216;Software as a Service &#8211; The Pattern Language Approach&#8217;</a></td>
</tr>
</tbody>
</table>
</div>
<p><a title="SaaS" href="http://www.flickr.com/photos/93223205@N00/1465323619/"></a></p>
<p>NOTE: I take issue with the word design below&#8230; It should be far more broad in most cases, but it often gets boxed into the design aspect of a problem. I would say &#8216;best practices&#8217; which brings up its own semantic mess&#8230;</p>
<blockquote>
<p style="text-align:left;">A pattern language is a structured method of describing [best] good design practices within a field of expertise. It is characterized by</p>
<ol>
<li>Noticing and naming the common problems [and positively executed solutions proven over time] in a field of interest [domain in my words]</li>
<li>Describing the key characteristics of effective solutions for meeting [one or more] some stated goal[s], [Often patterns are combined and are multi-faceted]</li>
<li>Helping the designer [domain stakeholder] move from problem to problem [and challenge to challenge] in a logical way, [in an attempt to reduce and even eliminate ambiguity] and allowing for many different paths through the design process.</li>
</ol>
<p>- Wikipedia </p></blockquote>
<ol>
<li>This ties in perfectly with my claim that complex software engineering is a &#8216;wicked problem&#8217;. If you disagree then you can stop reading, as none of my assumptions will work. However, I would love to hear your arguments since only around 20-30% of all software projects &#8217;succeed&#8217;&#8230;. There is no doubt there is dreadful crisis which I know you know about so enough said.</li>
</ol>
<p>If the fundamental issue here is NOT that people cannot/will not see software engineering for what it is, then what?!</p>
<p><a href="http://en.wikipedia.org/wiki/Wicked_problems">Wicked Problem</a></p>
<p>FYI: This is also why your pretty much nuts to not be Agile at this point, with some critical exceptions.</p>
<p>OK just to get you started chew on these 10 basic characteristics and tell me how any of them and the failure of senior stakeholders to understand that indeed software fits these characteristics is likely a key systemic disaster which we see and live every day in this industry.<a href="http://damon.agilefactor.com/software-is-a-wicked-problem-2/"> Click here for more.</a></p>
<p> Before I was able to &#8216;take this deck on the road&#8217; which I have done now with success (and why I am revisiting this post to offer insights), I had to get the audience (I hate to call them that&#8230; The collaborators is better) knowing (for example) that SOA was not a damn bunch of web services! I had to get people understanding exactly how distributed objects and components ARE NOT THE SAME but are similar. etc. etc.</p>
<p>That ASMX pages in .NET are not even close to what you want to be doing, even with WSE 3.0 and &#8216;Contract First&#8217; techniques (most notably the WSCF add-in from the always amazing <a href="http://www.thinktecture.com/">thinktecture</a>).</p>
<blockquote><p>There is nothing more necessary than truth, and in comparison with it everything else has only secondary value.<br />
This absolute will to truth: what is it? Is it the will to not allow ourselves to be deceived? Is it the will not to deceive?<br />
One does not want to be deceived, under the supposition that it is injurious, dangerous, or fatal to be deceived.</p>
<p>Friedrich Nietzsche, 1890</p></blockquote>
<p>Thanks Herr Nietzsche&#8230; None of us want that. So &#8220;Listen for the speakers intended meaning, not your perceived definition&#8221;.</p>
<p>In this rather philosophical vein, I offer you here an attempt at the beginnings of a unified P.L. covering many best practices we have evolved in the SOA/SaaS space.</p>
<p>As stated, this presentation is born from necessity as it has become almost impossible to have a meaningful conversation on many topics in this domain due to &#8216;definition overloading&#8217;.</p>
<p>This presentation not only attacks that issue, it also brings together into a cohesive pattern language Object Orientation, Distributed Objects, Components and Services while being careful to not make overly broad generalizations that would harm any SaaS initiative.</p>
<p>For example, it is a best practice to evolve a Domain Driven API which is (at a minimum) the core APU which your services will use to fulfil their contracts.</p>
<p>The presentation is here and feedback is encouraged. This also assumes you have embraced either the SCA environment (for Java development) or WCF for .NET. These are (in our guidance to clients) the only relevant implementation frameworks for strategic large scale organizational transformations to SaaS.</p>
<p>Otherwise in real-world terms there are not resources (developers, or the dramatically increased effort with very little benefit) available to support other approaches. Many &#8216;purists to the extreme&#8217; might attempt a hand-crafted &#8216;build it all over again&#8217; approach with hand-crafted contracts (typically XSDs).</p>
<p>As these environments support full extensibility, indeed it is incredibly rare that one of these environments will not completely address your needs. Of course there are always exceptions, but this is addresses to 95% of the market.</p>
<p>Due to the immaturity of this space, it is alarming how many companies believe they are not part of that 95%!! Typically they are being driven by parties (internal or external) that have motivations not in line with the business drivers.</p>
<p> </p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/dcarr.wordpress.com/90/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/dcarr.wordpress.com/90/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/dcarr.wordpress.com/90/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/dcarr.wordpress.com/90/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/dcarr.wordpress.com/90/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/dcarr.wordpress.com/90/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/dcarr.wordpress.com/90/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/dcarr.wordpress.com/90/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/dcarr.wordpress.com/90/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/dcarr.wordpress.com/90/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/dcarr.wordpress.com/90/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/dcarr.wordpress.com/90/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=team.pushbomb.com&blog=2366446&post=90&subd=dcarr&ref=&feed=1" />]]></content:encoded>
			<wfw:commentRss>http://team.pushbomb.com/2007/10/01/software-as-a-service-its-all-about-the-words/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7b572cbcda5a17fe984e7dd1ddc9c3d6?s=96&#38;d=&#38;r=PG" medium="image">
			<media:title type="html">pushbomb</media:title>
		</media:content>

		<media:content url="http://static.flickr.com/1150/1468114276_f1d15541e6.jpg" medium="image">
			<media:title type="html">pdf-icon</media:title>
		</media:content>

		<media:content url="http://static.flickr.com/1196/1468122752_7267762646.jpg" medium="image">
			<media:title type="html">ie-icon</media:title>
		</media:content>

		<media:content url="http://static.flickr.com/1259/1468130216_a701773dab.jpg" medium="image">
			<media:title type="html">icon-set2-firefox</media:title>
		</media:content>
	</item>
	</channel>
</rss>