<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Espresso Fueled Agile Development : Development Tools</title><link>http://blogs.msdn.com/mpuleio/archive/tags/Development+Tools/default.aspx</link><description>Tags: Development Tools</description><dc:language>en</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>Where is WCSF headed?</title><link>http://blogs.msdn.com/mpuleio/archive/2008/12/03/where-is-wcsf-headed.aspx</link><pubDate>Wed, 03 Dec 2008 21:24:19 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9171150</guid><dc:creator>mpuleio</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/mpuleio/comments/9171150.aspx</comments><wfw:commentRss>http://blogs.msdn.com/mpuleio/commentrss.aspx?PostID=9171150</wfw:commentRss><wfw:comment>http://blogs.msdn.com/mpuleio/rsscomments.aspx?PostID=9171150</wfw:comment><description>&lt;p&gt;Blaine &amp;amp; I have been getting a lot of emails, messages, comments, etc about WCSF.&amp;#160; There are a lot of people interested in a public statement from patterns &amp;amp; practices about the roadmap for WCSF and future support of WCSF, in addition to the &amp;quot;normal&amp;quot; feature requests.&lt;/p&gt;  &lt;p&gt;Well, we have some good news: Blaine has publicly released the WCSF roadmap in his blog as &lt;a href="http://blogs.msdn.com/blaine/archive/2008/12/03/roadmap-for-wcsf.aspx"&gt;Roadmap for WCSF&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Basically, right now, we are asking for feedback from the community.&amp;#160; Let Blaine and/or I know what you want via our blogs, email, or the WCSF CodePlex site at &lt;a href="http://www.codeplex.com/websf"&gt;www.codeplex.com/websf&lt;/a&gt;.&amp;#160; You can also create work items/ issues on the WCSF CodePlex site and have people vote on them (&lt;a title="http://www.codeplex.com/websf/WorkItem/List.aspx" href="http://www.codeplex.com/websf/WorkItem/List.aspx"&gt;http://www.codeplex.com/websf/WorkItem/List.aspx&lt;/a&gt;).&amp;#160; &lt;/p&gt;  &lt;p&gt;Thanks in advance for the feedback...&lt;/p&gt;  &lt;p&gt;[Edit: I created a specific thread on the CodePlex discussions board to facilitate feedback: &lt;a title="http://www.codeplex.com/websf/Thread/View.aspx?ThreadId=41403" href="http://www.codeplex.com/websf/Thread/View.aspx?ThreadId=41403"&gt;http://www.codeplex.com/websf/Thread/View.aspx?ThreadId=41403&lt;/a&gt;). Enjoy]&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9171150" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/mpuleio/archive/tags/Development+Tools/default.aspx">Development Tools</category><category domain="http://blogs.msdn.com/mpuleio/archive/tags/patterns+_2600_amp_3B00_+practices/default.aspx">patterns &amp;amp; practices</category><category domain="http://blogs.msdn.com/mpuleio/archive/tags/Web+Client+Software+Factory/default.aspx">Web Client Software Factory</category><category domain="http://blogs.msdn.com/mpuleio/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://blogs.msdn.com/mpuleio/archive/tags/ASP.NET+AJAX/default.aspx">ASP.NET AJAX</category><category domain="http://blogs.msdn.com/mpuleio/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://blogs.msdn.com/mpuleio/archive/tags/.NET/default.aspx">.NET</category></item><item><title>Finally, a common Service Locator</title><link>http://blogs.msdn.com/mpuleio/archive/2008/10/13/finally-a-common-service-locator.aspx</link><pubDate>Mon, 13 Oct 2008 20:03:57 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8998296</guid><dc:creator>mpuleio</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/mpuleio/comments/8998296.aspx</comments><wfw:commentRss>http://blogs.msdn.com/mpuleio/commentrss.aspx?PostID=8998296</wfw:commentRss><wfw:comment>http://blogs.msdn.com/mpuleio/rsscomments.aspx?PostID=8998296</wfw:comment><description>&lt;p&gt;I know that this is old news by now, but &lt;a target="_blank" href="http://www.tavaresstudios.com/Blog/"&gt;Chris Tavares&lt;/a&gt;, &lt;a target="_blank" href="http://blogs.msdn.com/gblock/default.aspx"&gt;Glenn Block&lt;/a&gt;, and a few others around here have been working with a number of folks from the wider .NET community to create a common wrapper for IoC containers.&amp;nbsp; Chris &amp;amp; Glenn created a community site (&lt;a title="http://www.codeplex.com/CommonServiceLocator" href="http://www.codeplex.com/CommonServiceLocator"&gt;http://www.codeplex.com/CommonServiceLocator&lt;/a&gt;) and shipped it about two weeks ago (&lt;a title="http://www.codeplex.com/CommonServiceLocator/Release/ProjectReleases.aspx?ReleaseId=17694" href="http://www.codeplex.com/CommonServiceLocator/Release/ProjectReleases.aspx?ReleaseId=17694"&gt;http://www.codeplex.com/CommonServiceLocator/Release/ProjectReleases.aspx?ReleaseId=17694&lt;/a&gt;).&lt;/p&gt; &lt;p&gt;Here are a few more posts about it:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a href="http://www.tavaresstudios.com/Blog/post/Announcing-The-IServiceLocator-interface.aspx"&gt;Announcing: The IServiceLocator interface&lt;/a&gt;  &lt;li&gt;&lt;a target="_blank" href="http://blogs.msdn.com/gblock/archive/2008/10/02/iservicelocator-a-step-toward-ioc-container-service-locator-detente.aspx"&gt;IServiceLocator a step toward IoC container / Service locator detente&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;The interface itself is pretty darned simple, and creating a wrapper around any IoC implementation should be pretty darned simple.&amp;nbsp; &lt;/p&gt; &lt;p&gt;Personally, I think this is great, as it will allow us developers at p&amp;amp;p a way to easily create guidance using DI/IoC without tying our users to a particular container implementation, which has been a long requested feature. I know Prism did a great job with this concept already, and created their own facade, but this is a further step in the right direction as the broader DI/IoC community seems to be behind it.&amp;nbsp; When/If I get a chance to work on WCSF again, I'll definitely go about hiding the container behind this interface.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8998296" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/mpuleio/archive/tags/Development+Tools/default.aspx">Development Tools</category><category domain="http://blogs.msdn.com/mpuleio/archive/tags/patterns+_2600_amp_3B00_+practices/default.aspx">patterns &amp;amp; practices</category><category domain="http://blogs.msdn.com/mpuleio/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://blogs.msdn.com/mpuleio/archive/tags/Unity/default.aspx">Unity</category></item><item><title>Guidance on SharePoint</title><link>http://blogs.msdn.com/mpuleio/archive/2008/08/13/guidance-on-sharepoint.aspx</link><pubDate>Thu, 14 Aug 2008 01:38:31 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8861663</guid><dc:creator>mpuleio</dc:creator><slash:comments>3</slash:comments><comments>http://blogs.msdn.com/mpuleio/comments/8861663.aspx</comments><wfw:commentRss>http://blogs.msdn.com/mpuleio/commentrss.aspx?PostID=8861663</wfw:commentRss><wfw:comment>http://blogs.msdn.com/mpuleio/rsscomments.aspx?PostID=8861663</wfw:comment><description>&lt;p&gt;You all might be amazed by the number of emails, messages, and calls I get asking for any of the following:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Guidance on SharePoint&lt;/li&gt; &lt;li&gt;Requests to add SharePoint Guidance to WCSF&lt;/li&gt; &lt;li&gt;Requests to add "Office applications" support to SCSF&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Well, I can finally help out folks looking for guidance on how to build SharePoint applications by saying "go check out the CodePlex project for &lt;a href="http://www.codeplex.com/spg"&gt;patterns &amp;amp; practices SharePoint Guidance&lt;/a&gt; (&lt;a title="http://www.codeplex.com/spg" href="http://www.codeplex.com/spg"&gt;http://www.codeplex.com/spg&lt;/a&gt;)."&amp;nbsp; If you are hoping for SharePoint support in WCSF, you should probably check this out too.&lt;/p&gt; &lt;p&gt;&lt;a href="http://blogs.msdn.com/blaine/" target="_blank"&gt;Blaine&lt;/a&gt; and &lt;a href="http://blogs.msdn.com/francischeung/" target="_blank"&gt;Francis&lt;/a&gt; are leading the effort on this project.&amp;nbsp; I understand that they are tackling a few big challenges that customers have ranked as the most important including (this list is from the project's &lt;a href="http://www.codeplex.com/spg/Release/ProjectReleases.aspx?ReleaseId=15819" target="_blank"&gt;Vision Scope slide deck&lt;/a&gt;): &lt;/p&gt; &lt;ul&gt; &lt;li&gt;Unit testing and debugging&lt;/li&gt; &lt;li&gt;Packaging and deployment&lt;/li&gt; &lt;li&gt;Setting up a team development environment&lt;/li&gt; &lt;li&gt;Unclear which SharePoint features/ components to use and when&lt;/li&gt; &lt;li&gt;Solution maintenance/upgrade&lt;/li&gt; &lt;li&gt;How and when is SharePoint Designer applicable&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;If you do SharePoint development, you should check it out.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8861663" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/mpuleio/archive/tags/Development+Tools/default.aspx">Development Tools</category><category domain="http://blogs.msdn.com/mpuleio/archive/tags/patterns+_2600_amp_3B00_+practices/default.aspx">patterns &amp;amp; practices</category><category domain="http://blogs.msdn.com/mpuleio/archive/tags/Web+Client+Software+Factory/default.aspx">Web Client Software Factory</category><category domain="http://blogs.msdn.com/mpuleio/archive/tags/Smart+Client+Software+Factory/default.aspx">Smart Client Software Factory</category><category domain="http://blogs.msdn.com/mpuleio/archive/tags/SharePoint/default.aspx">SharePoint</category></item><item><title>See Real Results With patterns &amp; practices</title><link>http://blogs.msdn.com/mpuleio/archive/2008/08/12/see-real-results-with-patterns-practices.aspx</link><pubDate>Wed, 13 Aug 2008 01:38:43 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8854135</guid><dc:creator>mpuleio</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/mpuleio/comments/8854135.aspx</comments><wfw:commentRss>http://blogs.msdn.com/mpuleio/commentrss.aspx?PostID=8854135</wfw:commentRss><wfw:comment>http://blogs.msdn.com/mpuleio/rsscomments.aspx?PostID=8854135</wfw:comment><description>&lt;p&gt;I visited the &lt;a href="http://msdn.com/practices" target="_blank"&gt;p&amp;amp;p homepage on MSDN&lt;/a&gt; today, and saw an announcement for a research report by Nucleus Research about patterns &amp;amp; practices, and what companies that use our guidance think the benefits are.&amp;nbsp; Check out &lt;a href="http://msdn.microsoft.com/en-us/practices/cc507505.aspx" target="_blank"&gt;See Real Results With patterns &amp;amp; practices&lt;/a&gt; (an overview) and &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=3696068D-BE4A-4731-AB15-492377AA4C6D&amp;amp;displaylang=en" target="_blank"&gt;download and read the full report&lt;/a&gt;.&amp;nbsp; As a member of p&amp;amp;p I thought it was informative and showed a few areas that we can improve.&amp;nbsp; It also showed areas where customers have reaped big benefits from using p&amp;amp;p deliverables, which I would be interested in if I were "out in the real world" and looking to re-use one of the p&amp;amp;p application blocks or an open source alternative.&amp;nbsp; To borrow a few lines from the report:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;strong&gt;"THE BOTTOM LINE&lt;/strong&gt;&lt;br&gt;Companies use Microsoft patterns and practices to make their development environments more productive, consistent, and standardized.&amp;nbsp; Whether used by an independent software vendor, consultancy, or enterprise, patterns and practices can accelerate project cycle times, reduce costs, and shift application development efforts away from code building and toward maximizing business benefits." &lt;/p&gt; &lt;p align="right"&gt;&lt;font size="1"&gt;-- &lt;em&gt;Guidebook: Microsoft patterns &amp;amp; practices&lt;/em&gt;, Nucleus Research Inc., April 2008, &lt;br&gt;&lt;/font&gt;&lt;a title="http://www.microsoft.com/downloads/details.aspx?FamilyId=3696068D-BE4A-4731-AB15-492377AA4C6D&amp;amp;displaylang=en" href="http://www.microsoft.com/downloads/details.aspx?FamilyId=3696068D-BE4A-4731-AB15-492377AA4C6D&amp;amp;displaylang=en"&gt;&lt;font size="1"&gt;http://www.microsoft.com/downloads/details.aspx?FamilyId=3696068D-BE4A-4731-AB15-492377AA4C6D&amp;amp;displaylang=en&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Enjoy.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8854135" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/mpuleio/archive/tags/Development+Tools/default.aspx">Development Tools</category><category domain="http://blogs.msdn.com/mpuleio/archive/tags/patterns+_2600_amp_3B00_+practices/default.aspx">patterns &amp;amp; practices</category></item><item><title>Acceptance Testing Guide Community Preview 2 Available!</title><link>http://blogs.msdn.com/mpuleio/archive/2008/08/04/acceptance-testing-guide-community-preview-2-available.aspx</link><pubDate>Mon, 04 Aug 2008 20:16:38 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8831602</guid><dc:creator>mpuleio</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/mpuleio/comments/8831602.aspx</comments><wfw:commentRss>http://blogs.msdn.com/mpuleio/commentrss.aspx?PostID=8831602</wfw:commentRss><wfw:comment>http://blogs.msdn.com/mpuleio/rsscomments.aspx?PostID=8831602</wfw:comment><description>&lt;p&gt;As I have mentioned before in a few posts (&lt;a href="http://blogs.msdn.com/mpuleio/archive/2008/04/18/acceptance-test-engineering-guidance.aspx"&gt;Acceptance Test Engineering Guidance&lt;/a&gt;, &lt;a href="http://blogs.msdn.com/mpuleio/archive/2008/05/18/acceptance-testing-guidance-survey.aspx"&gt;Acceptance Testing Guidance Survey&lt;/a&gt;, and &lt;a href="http://blogs.msdn.com/mpuleio/archive/2008/07/10/acceptance-testing-guide-update.aspx"&gt;Acceptance Testing Guide Update&lt;/a&gt;), I am working with a team on &lt;a href="http://www.codeplex.com/TestingGuidance" target="_blank"&gt;guidance around acceptance testing&lt;/a&gt;.&amp;nbsp; We still have a lot of work to do our the guide, but we have made available a &lt;a href="http://www.codeplex.com/TestingGuidance/Release/ProjectReleases.aspx?ReleaseId=15941" target="_blank"&gt;second community preview&lt;/a&gt; to show you how things are shaping up and to give you a chance to provide feedback.&lt;/p&gt; &lt;p&gt;Check these out:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a href="http://www.codeplex.com/TestingGuidance" target="_blank"&gt;The Acceptance Test Engineering Guidance community site on CodePlex&lt;/a&gt; (so you can follow the project)&lt;/li&gt; &lt;li&gt;&lt;a href="javascript:window.location.href='http://www.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=TestingGuidance&amp;amp;DownloadId=40458';" target="_blank"&gt;An announcement about the guide&lt;/a&gt; (which is being handed out at the Agile 2008 conference this week)&lt;/li&gt; &lt;li&gt;&lt;a href="http://www.codeplex.com/TestingGuidance/Release/ProjectReleases.aspx?ReleaseId=15941" target="_blank"&gt;The second community preview of the guide&lt;/a&gt; (it is a bit rough, but you should be able to see where we are headed with it)&lt;/li&gt; &lt;li&gt;Provide &lt;a href="http://www.codeplex.com/TestingGuidance/Thread/View.aspx?ThreadId=32829" target="_blank"&gt;Feedback on Community Preview Aug 4, 2008&lt;/a&gt; (so we can make changes, add topics we missed, etc).&lt;/li&gt;&lt;/ul&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8831602" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/mpuleio/archive/tags/Development+Tools/default.aspx">Development Tools</category><category domain="http://blogs.msdn.com/mpuleio/archive/tags/Agile/default.aspx">Agile</category><category domain="http://blogs.msdn.com/mpuleio/archive/tags/Testing/default.aspx">Testing</category><category domain="http://blogs.msdn.com/mpuleio/archive/tags/patterns+_2600_amp_3B00_+practices/default.aspx">patterns &amp;amp; practices</category><category domain="http://blogs.msdn.com/mpuleio/archive/tags/Acceptance+Test+Engineering+Guidance/default.aspx">Acceptance Test Engineering Guidance</category><category domain="http://blogs.msdn.com/mpuleio/archive/tags/Acceptance+Testing/default.aspx">Acceptance Testing</category></item><item><title>Composite Application Guidance for WPF Shipped!</title><link>http://blogs.msdn.com/mpuleio/archive/2008/07/31/composite-application-guidance-for-wpf-shipped.aspx</link><pubDate>Thu, 31 Jul 2008 20:26:13 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8793821</guid><dc:creator>mpuleio</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/mpuleio/comments/8793821.aspx</comments><wfw:commentRss>http://blogs.msdn.com/mpuleio/commentrss.aspx?PostID=8793821</wfw:commentRss><wfw:comment>http://blogs.msdn.com/mpuleio/rsscomments.aspx?PostID=8793821</wfw:comment><description>&lt;p&gt;&lt;/p&gt; &lt;p&gt;A while back, I was Dev Lead on the Smart Client Software Factory (SCSF) when we added the ability to host WPF controls in a Composite Application Block (CAB) application. Since then, the thinking in the WPF space has changed a bit, and p&amp;amp;p decided that offering guidance on full WPF applications was a good idea.&amp;nbsp; &lt;a href="http://blogs.msdn.com/blaine" target="_blank"&gt;Blaine&lt;/a&gt;, &lt;a href="http://blogs.msdn.com/francischeung" target="_blank"&gt;Francis&lt;/a&gt;, Bob, and &lt;a href="http://blogs.msdn.com/gblock" target="_blank"&gt;Glenn&lt;/a&gt; have worked with a great team to create guidance for building composite applications using WPF. This guidance was started from a clean slate, as there are enough differences between Windows Forms and WPF (as we learned doing SCSF) to cause challenges.&amp;nbsp; The result is the &lt;a href="http://msdn.microsoft.com/en-us/library/cc707819.aspx" target="_blank"&gt;Composite Application Guidance for WPF June 2008&lt;/a&gt;, which recently shipped (formerly code-named &lt;a href="http://codeplex.com/CompositeWPF" target="_blank"&gt;Prism&lt;/a&gt;).&amp;nbsp; This guidance is simple, easy to consume, can be used piecemeal, and should not have the steep learning curve that CAB and SCSF have.&amp;nbsp; You can learn more at the &lt;a href="http://codeplex.com/CompositeWPF" target="_blank"&gt;Prism CodePlex Community Site&lt;/a&gt;, or at any of the places below.&amp;nbsp; &lt;/p&gt; &lt;p&gt;Check out Francis's post, &lt;a href="http://blogs.msdn.com/francischeung/archive/2008/07/17/shipped-composite-application-guidance-for-wpf-june-2008.aspx" target="_blank"&gt;SHIPPED!!! Composite Application Guidance for WPF June 2008&lt;/a&gt;, for details and where to get it.&lt;/p&gt; &lt;p&gt;Or take a look at Glenn's post on the subject: &lt;a href="http://blogs.msdn.com/gblock/archive/2008/07/03/composite-application-guidance-is-live.aspx"&gt;Composite Application Guidance is Live&lt;/a&gt;&lt;/p&gt; &lt;p&gt;And here are a few other posts about what they have been up to, by person in chronological order:&lt;/p&gt; &lt;p&gt;From Francis:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a href="http://blogs.msdn.com/francischeung/archive/2008/01/28/composite-wpf-guidance.aspx"&gt;Composite WPF Guidance&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://blogs.msdn.com/francischeung/archive/2008/01/28/di-or-not-di.aspx"&gt;DI or not DI&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://blogs.msdn.com/francischeung/archive/2008/05/29/decoupled-communication-with-prism-intro.aspx"&gt;Decoupled Communication with Prism (intro)&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://blogs.msdn.com/francischeung/archive/2008/05/29/decoupled-communication-with-prism-shared-views-services.aspx"&gt;Decoupled Communication with Prism (Shared Services)&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://blogs.msdn.com/francischeung/archive/2008/05/30/decoupled-communication-with-prism-commanding.aspx"&gt;Decoupled Communication with Prism (Commanding)&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://blogs.msdn.com/francischeung/archive/2008/06/02/decoupled-communication-with-prism-event-aggregation.aspx"&gt;Decoupled Communication with Prism (Event Aggregation)&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://blogs.msdn.com/francischeung/archive/2008/06/16/poor-man-s-ui-composition.aspx"&gt;Poor man's UI Composition&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://blogs.msdn.com/francischeung/archive/2008/07/16/activeaware-views-and-commands.aspx"&gt;ActiveAware Views and Commands&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;From Blaine:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a href="http://blogs.msdn.com/blaine/archive/2008/05/15/track-prim-project.aspx"&gt;Track Prism project&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://blogs.msdn.com/blaine/archive/2008/06/08/loosely-couple-communication.aspx"&gt;Loosely coupled communication&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;From Glenn:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a href="http://blogs.msdn.com/gblock/archive/2008/03/12/prism-launches-on-codeplex.aspx"&gt;'Prism' launches on CodePlex&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://blogs.msdn.com/gblock/archive/2008/03/12/prism-ri-first-drop.aspx"&gt;'Prism' RI first drop&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://blogs.msdn.com/gblock/archive/2008/03/26/prism-drop-2.aspx"&gt;Prism Drop 2&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://blogs.msdn.com/gblock/archive/2008/04/01/prism-talk-at-wpf-bootcamp.aspx"&gt;Prism talk at WPF Bootcamp&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://blogs.msdn.com/gblock/archive/2008/04/27/the-prism-team-and-how-we-develop.aspx"&gt;The Prism team and how we develop&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://blogs.msdn.com/gblock/archive/2008/04/29/brian-noyes-thoughts-on-prism.aspx"&gt;Brian Noyes thoughts on Prism&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://blogs.msdn.com/gblock/archive/2008/05/05/prismshouldnotreferenceunity.aspx"&gt;PrismShouldNotReferenceUnity&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://blogs.msdn.com/gblock/archive/2008/05/08/prism-vs-framework-xxx.aspx"&gt;Prism vs Framework XXX&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://blogs.msdn.com/gblock/archive/2008/05/08/wpf-from-this-to-that-wow.aspx"&gt;WPF, from this to that..Wow!&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://blogs.msdn.com/gblock/archive/2008/05/11/prism-cab-and-winforms-futures.aspx"&gt;Prism, CAB, and WinForms futures&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://blogs.msdn.com/gblock/archive/2008/05/24/using-viewmodels-and-datatemplates-to-compose-your-ui.aspx"&gt;Using ViewModels and DataTemplates to compose your UI&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://blogs.msdn.com/gblock/archive/2008/06/04/loosely-coupled-communication-prism-style.aspx"&gt;Loosely coupled communication - Prism style&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://blogs.msdn.com/gblock/archive/2008/06/12/stocktrader-ri-using-castle-windsor.aspx"&gt;StockTrader RI using Castle Windsor&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://blogs.msdn.com/gblock/archive/2008/06/30/composite-application-guidance-time-to-ship.aspx"&gt;Composite Application Guidance, time to ship&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://blogs.msdn.com/gblock/archive/2008/06/30/talking-about-prism-with-infoq.aspx"&gt;Talking about Prism with InfoQ&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://blogs.msdn.com/gblock/archive/2008/07/01/how-prism-supports-using-multiple-ioc-containers.aspx"&gt;How Prism supports using multiple IOC containers&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://blogs.msdn.com/gblock/archive/2008/07/02/composite-application-guidance-what-is-it.aspx"&gt;Composite Application Guidance - What is it?&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://blogs.msdn.com/gblock/archive/2008/07/03/composite-application-guidance-is-live.aspx"&gt;Composite Application Guidance is Live&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;I know I am looking forward to using this guidance when I get a chance to work with WPF more seriously.&lt;/p&gt; &lt;p&gt;Enjoy.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8793821" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/mpuleio/archive/tags/Development+Tools/default.aspx">Development Tools</category><category domain="http://blogs.msdn.com/mpuleio/archive/tags/patterns+_2600_amp_3B00_+practices/default.aspx">patterns &amp;amp; practices</category><category domain="http://blogs.msdn.com/mpuleio/archive/tags/Smart+Client+Software+Factory/default.aspx">Smart Client Software Factory</category><category domain="http://blogs.msdn.com/mpuleio/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://blogs.msdn.com/mpuleio/archive/tags/.NET/default.aspx">.NET</category><category domain="http://blogs.msdn.com/mpuleio/archive/tags/WPF/default.aspx">WPF</category></item><item><title>Proof of Concept: a simple DI solution for ASP.NET WebForms</title><link>http://blogs.msdn.com/mpuleio/archive/2008/07/17/proof-of-concept-a-simple-di-solution-for-asp-net-webforms.aspx</link><pubDate>Thu, 17 Jul 2008 23:32:22 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8744912</guid><dc:creator>mpuleio</dc:creator><slash:comments>3</slash:comments><comments>http://blogs.msdn.com/mpuleio/comments/8744912.aspx</comments><wfw:commentRss>http://blogs.msdn.com/mpuleio/commentrss.aspx?PostID=8744912</wfw:commentRss><wfw:comment>http://blogs.msdn.com/mpuleio/rsscomments.aspx?PostID=8744912</wfw:comment><description>&lt;p&gt;&lt;a href="http://www.tavaresstudios.com/Blog/" target="_blank"&gt;Chris Tavares&lt;/a&gt; and I were chatting yesterday morning about an idea Chris had: building a simple, reusable Http Module that gives folks DI scoped to the Application, Session, and Request.&amp;nbsp; Yesterday afternoon, during the p&amp;amp;p Dev team's weekly "Code Kata" we threw together a spike/proof of concept in a couple of hours.&amp;nbsp; "Code Kata" is a three hour block of time that the p&amp;amp;p Dev team uses for a number of things: &lt;/p&gt; &lt;ul&gt; &lt;li&gt;cross-project pollination of ideas, things that work, things that don't work across project teams &lt;li&gt;investigating new and emerging technologies that p&amp;amp;p may work with in the future  &lt;li&gt;investigating new and emerging platforms to determine if p&amp;amp;p may want to provide guidance in the future  &lt;li&gt;play with new shiny bits :-)&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;There are no unit tests, just simple acceptance tests written as a really simple web site.&amp;nbsp; If the site works and shows the right text, the test passes.&amp;nbsp; We started with a list of requirements (scaled to just the application level) on the whiteboard that looked sort of like this (which I am creating from memory):&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Create a DI container for the application  &lt;li&gt;Create a way to get to the container ( we choose an extension method on the Application class)  &lt;li&gt;Allow a way to configure the container  &lt;li&gt;Allow DI to work for pages  &lt;li&gt;Allow DI to work for user controls  &lt;li&gt;Allow DI to work for master pages  &lt;li&gt;Allow DI to work for ASMX web services  &lt;li&gt;Allow the above functionality in a simple and self contained way&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;So, we created a simple Web Site Application and a DLL to hold the custom HttpModule.&amp;nbsp; We created a simple web page that needed a property injected into it.&amp;nbsp; We then wrote the code to make my "test" page work properly.&amp;nbsp; First we wrote an extension method for HttpApplication.&amp;nbsp; After a short bit it changed to one for HttpApplicationState: &lt;/p&gt; &lt;blockquote&gt;&lt;pre class="code"&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Web;
&lt;span style="color: blue"&gt;using &lt;/span&gt;Microsoft.Practices.Unity;

&lt;span style="color: blue"&gt;namespace &lt;/span&gt;UnityForTheWebLib
{
    &lt;span style="color: blue"&gt;public static class &lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: #2b91af"&gt;HttpApplicationStateExtensions
    &lt;/span&gt;{
        &lt;span style="color: blue"&gt;private const string &lt;/span&gt;GlobalContainerKey = &lt;span style="color: #a31515"&gt;"Your global Unity container"&lt;/span&gt;;

        &lt;span style="color: blue"&gt;public static &lt;/span&gt;&lt;span style="color: #2b91af"&gt;IUnityContainer &lt;/span&gt;GetContainer(&lt;span style="color: blue"&gt;this &lt;/span&gt;&lt;span style="color: #2b91af"&gt;HttpApplicationState &lt;/span&gt;application)
        {
            application.Lock();
            &lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: blue"&gt;try
            &lt;/span&gt;{
                &lt;span style="color: #2b91af"&gt;IUnityContainer &lt;/span&gt;container = application[GlobalContainerKey] &lt;span style="color: blue"&gt;as &lt;/span&gt;&lt;span style="color: #2b91af"&gt;IUnityContainer&lt;/span&gt;;
                &lt;span style="color: blue"&gt;if&lt;/span&gt;(container == &lt;span style="color: blue"&gt;null&lt;/span&gt;)
                {
                    container = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;UnityContainer&lt;/span&gt;();
                    application[GlobalContainerKey] = container;
                }
                &lt;span style="color: blue"&gt;return &lt;/span&gt;container;
            }
            &lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Consolas"&gt;&lt;span style="color: blue"&gt;finally
            &lt;/span&gt;{
                application.UnLock();
            }
        }
    }
}&lt;/font&gt;&lt;/font&gt;
&lt;/pre&gt;&lt;/blockquote&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p&gt;Basically, we have lazy initialization of the container and a mechanism to stuff it into the application state.&amp;nbsp; And then the initial HttpModule that only does injection on a Page:&lt;/p&gt;
&lt;blockquote&gt;&lt;pre class="code"&gt;&lt;font size="2"&gt;&lt;font face="con"&gt;&lt;span style="color: blue"&gt;using &lt;/span&gt;System;
&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Collections.Generic;
&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Web;
&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Web.UI;
&lt;span style="color: blue"&gt;using &lt;/span&gt;Microsoft.Practices.Unity;

&lt;span style="color: blue"&gt;namespace &lt;/span&gt;UnityForTheWebLib
{
    &lt;span style="color: blue"&gt;public class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;UnityHttpModule &lt;/span&gt;: &lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="con"&gt;&lt;span style="color: #2b91af"&gt;IHttpModule
    &lt;/span&gt;{
        &lt;span style="color: blue"&gt;#region &lt;/span&gt;IHttpModule Members

        &lt;/font&gt;&lt;/font&gt;&lt;span style="color: gray"&gt;&lt;font face="con" size="2"&gt;///&amp;lt;summary&amp;gt;
        ///&lt;/font&gt;&lt;/span&gt;&lt;span style="color: green"&gt;&lt;font face="con" size="2"&gt;Initializes a module and prepares it to handle requests.
        &lt;/font&gt;&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="con"&gt;&lt;span style="color: gray"&gt;///&amp;lt;/summary&amp;gt;
        ///
        ///&amp;lt;param name="context"&amp;gt;&lt;/span&gt;&lt;span style="color: green"&gt;An &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;see cref="T:System.Web.HttpApplication"&amp;gt;&amp;lt;/see&amp;gt; &lt;/span&gt;&lt;span style="color: green"&gt;that provides access to the methods, properties, and events common to all application objects within an ASP.NET application &lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="con"&gt;&lt;span style="color: gray"&gt;&amp;lt;/param&amp;gt;
        &lt;/span&gt;&lt;span style="color: blue"&gt;public void &lt;/span&gt;Init(&lt;span style="color: #2b91af"&gt;HttpApplication &lt;/span&gt;context)
        {
            context.PreRequestHandlerExecute += OnPreRequestHandlerExecute;
        }

        &lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="con"&gt;&lt;span style="color: gray"&gt;///&amp;lt;summary&amp;gt;
        ///&lt;/span&gt;&lt;span style="color: green"&gt;Disposes of the resources (other than memory) used by the module that implements &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;see cref="T:System.Web.IHttpModule"&amp;gt;&amp;lt;/see&amp;gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: green"&gt;&lt;font face="con" size="2"&gt;.
        &lt;/font&gt;&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="con"&gt;&lt;span style="color: gray"&gt;///&amp;lt;/summary&amp;gt;
        ///
        &lt;/span&gt;&lt;span style="color: blue"&gt;public void &lt;/span&gt;Dispose()
        {
        }

        &lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="con"&gt;&lt;span style="color: blue"&gt;#endregion

        private void &lt;/span&gt;OnPreRequestHandlerExecute(&lt;span style="color: blue"&gt;object &lt;/span&gt;sender, &lt;span style="color: #2b91af"&gt;EventArgs &lt;/span&gt;e)
        {
            &lt;span style="color: #2b91af"&gt;IHttpHandler &lt;/span&gt;handler = &lt;span style="color: #2b91af"&gt;HttpContext&lt;/span&gt;.Current.Handler;
            &lt;span style="color: #2b91af"&gt;HttpContext&lt;/span&gt;.Current.Application.GetContainer().BuildUp(handler.GetType(), handler);
        }
    }
}&lt;/font&gt;&lt;/font&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p&gt;This is a very simple module that calls BuildUp on the page.&amp;nbsp; &lt;/p&gt;
&lt;p&gt;At this point we added another test, and implemented it.&amp;nbsp; After a few iterations of this we ended up with tests for injection into a User Control and a Master Page, an interface that needed to be configured on the container.&amp;nbsp; The final implementation of the Http Module looks like this &lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;font size="2"&gt;&lt;font face="con"&gt;&lt;span style="color: blue"&gt;using &lt;/span&gt;System;&lt;br&gt;&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Collections.Generic;&lt;br&gt;&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Web;&lt;br&gt;&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Web.UI;&lt;br&gt;&lt;span style="color: blue"&gt;using &lt;/span&gt;Microsoft.Practices.Unity;&lt;br&gt;&lt;br&gt;&lt;span style="color: blue"&gt;namespace &lt;/span&gt;UnityForTheWebLib&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;public class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;UnityHttpModule &lt;/span&gt;: &lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="con"&gt;&lt;span style="color: #2b91af"&gt;IHttpModule&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;#region &lt;/span&gt;IHttpModule Members&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/font&gt;&lt;span style="color: gray"&gt;&lt;font face="con" size="2"&gt;///&amp;lt;summary&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ///&lt;/font&gt;&lt;/span&gt;&lt;span style="color: green"&gt;&lt;font face="con" size="2"&gt;Initializes a module and prepares it to handle requests.&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="con"&gt;&lt;span style="color: gray"&gt;///&amp;lt;/summary&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ///&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ///&amp;lt;param name="context"&amp;gt;&lt;/span&gt;&lt;span style="color: green"&gt;An &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;see cref="T:System.Web.HttpApplication"&amp;gt;&amp;lt;/see&amp;gt; &lt;/span&gt;&lt;span style="color: green"&gt;that provides access to the methods, properties, and events common to all application objects within an ASP.NET application &lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="con"&gt;&lt;span style="color: gray"&gt;&amp;lt;/param&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;public void &lt;/span&gt;Init(&lt;span style="color: #2b91af"&gt;HttpApplication &lt;/span&gt;context)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; context.PreRequestHandlerExecute += OnPreRequestHandlerExecute;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="con"&gt;&lt;span style="color: gray"&gt;///&amp;lt;summary&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ///&lt;/span&gt;&lt;span style="color: green"&gt;Disposes of the resources (other than memory) used by the module that implements &lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;see cref="T:System.Web.IHttpModule"&amp;gt;&amp;lt;/see&amp;gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;span style="color: green"&gt;&lt;font face="con" size="2"&gt;.&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/span&gt;&lt;font size="2"&gt;&lt;font face="con"&gt;&lt;span style="color: gray"&gt;///&amp;lt;/summary&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ///&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;public void &lt;/span&gt;Dispose()&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="con"&gt;&lt;span style="color: blue"&gt;#endregion&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; private void &lt;/span&gt;OnPreRequestHandlerExecute(&lt;span style="color: blue"&gt;object &lt;/span&gt;sender, &lt;span style="color: #2b91af"&gt;EventArgs &lt;/span&gt;e)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af"&gt;IHttpHandler &lt;/span&gt;handler = &lt;span style="color: #2b91af"&gt;HttpContext&lt;/span&gt;.Current.Handler;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af"&gt;HttpContext&lt;/span&gt;.Current.Application.GetContainer().BuildUp(handler.GetType(), handler);&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="con"&gt;&lt;span style="color: green"&gt;// User Controls are ready to be built up after the page initialization is complete&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Page &lt;/span&gt;page = &lt;span style="color: #2b91af"&gt;HttpContext&lt;/span&gt;.Current.Handler &lt;span style="color: blue"&gt;as &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Page&lt;/span&gt;;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;if &lt;/span&gt;(page != &lt;span style="color: blue"&gt;null&lt;/span&gt;)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; page.InitComplete += OnPageInitComplete;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="con"&gt;&lt;span style="color: green"&gt;// Get the controls in the page's control tree excluding the page itself&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;private &lt;/span&gt;&lt;span style="color: #2b91af"&gt;IEnumerable&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;Control&lt;/span&gt;&amp;gt; GetControlTree(&lt;span style="color: #2b91af"&gt;Control &lt;/span&gt;root)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;foreach &lt;/span&gt;(&lt;span style="color: #2b91af"&gt;Control &lt;/span&gt;child &lt;span style="color: blue"&gt;in &lt;/span&gt;root.Controls)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;yield return &lt;/span&gt;child;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;foreach &lt;/span&gt;(&lt;span style="color: #2b91af"&gt;Control &lt;/span&gt;c &lt;span style="color: blue"&gt;in &lt;/span&gt;GetControlTree(child))&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;yield return &lt;/span&gt;c;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="con"&gt;&lt;span style="color: green"&gt;// Build up each control in the page's control tree&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="color: blue"&gt;private void &lt;/span&gt;OnPageInitComplete(&lt;span style="color: blue"&gt;object &lt;/span&gt;sender, &lt;span style="color: #2b91af"&gt;EventArgs &lt;/span&gt;e)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af"&gt;Page &lt;/span&gt;page = (&lt;span style="color: #2b91af"&gt;Page&lt;/span&gt;) sender;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af"&gt;IUnityContainer &lt;/span&gt;container = &lt;span style="color: #2b91af"&gt;HttpContext&lt;/span&gt;.Current.Application.GetContainer();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;foreach &lt;/span&gt;(&lt;span style="color: #2b91af"&gt;Control &lt;/span&gt;c &lt;span style="color: blue"&gt;in &lt;/span&gt;GetControlTree(page))&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; container.BuildUp(c.GetType(), c);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;}&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p&gt;Configuration of the container can happen in the Global Application_Start handler like this:&lt;/p&gt;
&lt;blockquote&gt;&lt;pre class="code"&gt;&lt;font size="2"&gt;&lt;font face="con"&gt;&lt;span style="color: blue"&gt;using &lt;/span&gt;System;
&lt;span style="color: blue"&gt;using &lt;/span&gt;Microsoft.Practices.Unity;

&lt;span style="color: blue"&gt;namespace &lt;/span&gt;UnityForTheWebTestSite
{
    &lt;span style="color: blue"&gt;public class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Global &lt;/span&gt;: System.Web.&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="con"&gt;&lt;span style="color: #2b91af"&gt;HttpApplication
    &lt;/span&gt;{

        &lt;span style="color: blue"&gt;protected void &lt;/span&gt;Application_Start(&lt;span style="color: blue"&gt;object &lt;/span&gt;sender, &lt;span style="color: #2b91af"&gt;EventArgs &lt;/span&gt;e)
        {
            &lt;span style="color: #2b91af"&gt;IUnityContainer &lt;/span&gt;c = Application.GetContainer();
            c.RegisterType&amp;lt;&lt;span style="color: #2b91af"&gt;IControlData&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;ControlData1&lt;/span&gt;&amp;gt;();
        }
    }
}&lt;/font&gt;&lt;/font&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p&gt;So, from the initial requirements we have this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strike&gt;Create a DI container for the application&lt;/strike&gt; &lt;strong&gt;Lazy initialization&lt;/strong&gt; 
&lt;li&gt;&lt;strike&gt;Create a way to get to the container ( we choose an extension method on the Application class) &lt;/strike&gt;&lt;strong&gt;Extension Method&lt;/strong&gt; 
&lt;li&gt;&lt;strike&gt;Allow a way to configure the container&lt;/strike&gt; &lt;strong&gt;Application Start&lt;/strong&gt; 
&lt;li&gt;&lt;strike&gt;Allow DI to work for pages&lt;/strike&gt;&amp;nbsp; &lt;strong&gt;Add the HttpModule and Attributes&lt;/strong&gt; 
&lt;li&gt;&lt;strike&gt;Allow DI to work for user controls &lt;/strike&gt;&lt;strong&gt;Add the HttpModule and Attributes&lt;/strong&gt; 
&lt;li&gt;&lt;strike&gt;Allow DI to work for master pages &lt;/strike&gt;&lt;strong&gt;Add the HttpModule and Attributes&lt;/strong&gt; 
&lt;li&gt;Allow DI to work for ASMX web services 
&lt;li&gt;&lt;strike&gt;Allow the above functionality in a simple and self contained way&lt;/strike&gt; &lt;strong&gt;This is all in a single module&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;We met the last requirement (simple and self contained) since all we did to the web application was add a single line to the web config.&amp;nbsp; That met the requirement. 
&lt;p&gt;The last area is one we met, but we are not happy with the solution.&amp;nbsp; Basically, we need to do a bit more research and see if there is a way to get into the pipeline for an ASMX request early enough to do injection and not screw things up for the normal use case or the Ajax extensions.&amp;nbsp; Until we get this figured out right, the solution is to have your Web Service constructor ask the container to do injection.&amp;nbsp; This is an ugly hack and looks something like this:&lt;/p&gt;
&lt;blockquote&gt;&lt;pre class="code"&gt;&lt;font size="2"&gt;&lt;font face="consol"&gt;&lt;span style="color: blue"&gt;using &lt;/span&gt;System.ComponentModel;
&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Web;
&lt;span style="color: blue"&gt;using &lt;/span&gt;System.Web.Services;
&lt;span style="color: blue"&gt;using &lt;/span&gt;Microsoft.Practices.Unity;

&lt;span style="color: blue"&gt;namespace &lt;/span&gt;UnityForTheWebTestSite
{&lt;/font&gt;&lt;/font&gt;&lt;span style="color: gray"&gt;
&lt;font face="consol" size="2"&gt;    &lt;/font&gt;&lt;/span&gt;&lt;font face="consol" size="2"&gt;[&lt;span style="color: #2b91af"&gt;WebService&lt;/span&gt;(Namespace = &lt;span style="color: #a31515"&gt;"http://tempuri.org/"&lt;/span&gt;)]
    [&lt;span style="color: #2b91af"&gt;WebServiceBinding&lt;/span&gt;(ConformsTo = &lt;span style="color: #2b91af"&gt;WsiProfiles&lt;/span&gt;.BasicProfile1_1)]
    [&lt;span style="color: #2b91af"&gt;ToolboxItem&lt;/span&gt;(&lt;span style="color: blue"&gt;false&lt;/span&gt;)]
    &lt;/font&gt;&lt;font size="2"&gt;&lt;font face="consol"&gt;&lt;span style="color: green"&gt;// To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. 
    // [System.Web.Script.Services.ScriptService]
    &lt;/span&gt;&lt;span style="color: blue"&gt;public class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;MyWebService &lt;/span&gt;: System.Web.Services.&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="consol"&gt;&lt;span style="color: #2b91af"&gt;WebService
    &lt;/span&gt;{
        &lt;span style="color: blue"&gt;public &lt;/span&gt;MyWebService()
        {
            &lt;span style="color: #2b91af"&gt;HttpContext&lt;/span&gt;.Current.Application.GetContainer().BuildUp(&lt;span style="color: blue"&gt;this&lt;/span&gt;);
        }

        [&lt;span style="color: #2b91af"&gt;Dependency&lt;/span&gt;]
        &lt;span style="color: blue"&gt;public &lt;/span&gt;&lt;span style="color: #2b91af"&gt;IControlData &lt;/span&gt;Data
        {
            &lt;span style="color: blue"&gt;get&lt;/span&gt;;
            &lt;span style="color: blue"&gt;set&lt;/span&gt;;
        }

        [&lt;span style="color: #2b91af"&gt;WebMethod&lt;/span&gt;]
        &lt;span style="color: blue"&gt;public string &lt;/span&gt;HelloWorld()
        {
            &lt;span style="color: blue"&gt;return &lt;/span&gt;&lt;span style="color: #a31515"&gt;"Hello World " &lt;/span&gt;+ Data.GetText();
        }
    }
}&lt;/font&gt;&lt;/font&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p&gt;To add the ability to have a container at the Session level and the request level should be as simple as following the pattern for the extension method and the http handler above. (I will leave it as an exercise for the reader.) You could use the same container for everything, or have the Session container a child of the application container, and the request container a child of the session container.&amp;nbsp; When and if we do a real implementation (as opposed to a proof of concept) we will figure out the best approach for most cases.&amp;nbsp; When and if this happens, I will update my CWAB with Unity solution and dramatically simplify it. :-)&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8744912" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/mpuleio/archive/tags/Development+Tools/default.aspx">Development Tools</category><category domain="http://blogs.msdn.com/mpuleio/archive/tags/patterns+_2600_amp_3B00_+practices/default.aspx">patterns &amp;amp; practices</category><category domain="http://blogs.msdn.com/mpuleio/archive/tags/Web+Client+Software+Factory/default.aspx">Web Client Software Factory</category><category domain="http://blogs.msdn.com/mpuleio/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://blogs.msdn.com/mpuleio/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://blogs.msdn.com/mpuleio/archive/tags/.NET/default.aspx">.NET</category><category domain="http://blogs.msdn.com/mpuleio/archive/tags/Unity/default.aspx">Unity</category></item><item><title>Acceptance Testing Guidance Survey</title><link>http://blogs.msdn.com/mpuleio/archive/2008/05/18/acceptance-testing-guidance-survey.aspx</link><pubDate>Sun, 18 May 2008 21:52:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8518399</guid><dc:creator>mpuleio</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/mpuleio/comments/8518399.aspx</comments><wfw:commentRss>http://blogs.msdn.com/mpuleio/commentrss.aspx?PostID=8518399</wfw:commentRss><wfw:comment>http://blogs.msdn.com/mpuleio/rsscomments.aspx?PostID=8518399</wfw:comment><description>&lt;P&gt;We have put together a survey to get a bit more input from the community about Acceptance Testing.&amp;nbsp; If you are at all involved in software development, deployment, or operations acceptance testing proabably impacts you in some way, shape, or form, so you may want to add your insight to what we are working on.&lt;/P&gt;
&lt;P&gt;You can find it here: &lt;A class="" href="http://www.zoomerang.com/Survey/survey-intro.zgi?p=WEB227T7LBST2T" target=_blank mce_href="http://www.zoomerang.com/Survey/survey-intro.zgi?p=WEB227T7LBST2T"&gt;Acceptance Testing Survey&lt;/A&gt;&lt;/P&gt;
&lt;P mce_keep="true"&gt;Thanks for the feedback and input.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8518399" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/mpuleio/archive/tags/Development+Tools/default.aspx">Development Tools</category><category domain="http://blogs.msdn.com/mpuleio/archive/tags/Testing/default.aspx">Testing</category><category domain="http://blogs.msdn.com/mpuleio/archive/tags/patterns+_2600_amp_3B00_+practices/default.aspx">patterns &amp;amp; practices</category><category domain="http://blogs.msdn.com/mpuleio/archive/tags/Acceptance+Test+Engineering+Guidance/default.aspx">Acceptance Test Engineering Guidance</category><category domain="http://blogs.msdn.com/mpuleio/archive/tags/Acceptance+Testing/default.aspx">Acceptance Testing</category></item><item><title>Converting the Composite Web Application Block to Unity - Actually Adding Unity</title><link>http://blogs.msdn.com/mpuleio/archive/2008/05/01/converting-the-composite-web-application-block-to-unity-actually-adding-unity.aspx</link><pubDate>Fri, 02 May 2008 02:44:34 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8447888</guid><dc:creator>mpuleio</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/mpuleio/comments/8447888.aspx</comments><wfw:commentRss>http://blogs.msdn.com/mpuleio/commentrss.aspx?PostID=8447888</wfw:commentRss><wfw:comment>http://blogs.msdn.com/mpuleio/rsscomments.aspx?PostID=8447888</wfw:comment><description>&lt;p&gt;This is the fifth post in a series. The other post include:  &lt;ul&gt; &lt;li&gt;&lt;a href="http://blogs.msdn.com/mpuleio/archive/2008/04/04/converting-the-composite-web-application-block-to-unity-intro.aspx"&gt;Converting the Composite Web Application Block to Unity - Intro&lt;/a&gt;.  &lt;li&gt;&lt;a href="http://blogs.msdn.com/mpuleio/archive/2008/04/04/converting-the-composite-web-application-block-to-unity-adding-an-icompositioncontainer.aspx" target="_blank"&gt;Converting the Composite Web Application Block to Unity - Adding an ICompositionContainer&lt;/a&gt;  &lt;li&gt;&lt;a href="http://blogs.msdn.com/mpuleio/archive/2008/04/09/converting-the-composite-web-application-block-to-unity-clean-up-icompositioncontainer.aspx"&gt;Converting the Composite Web Application Block to Unity - Clean Up ICompositionContainer&lt;/a&gt;  &lt;li&gt;&lt;a href="http://blogs.msdn.com/mpuleio/archive/2008/04/22/converting-the-composite-web-application-block-to-unity-ummmm-oooops.aspx"&gt;Converting the Composite Web Application Block to Unity - Ummmm...Oooops.&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;If you want background, go read the earlier posts.  &lt;p&gt;Based upon feedback, I am making the source code available at &lt;a title="http://www.codeplex.com/websf/Wiki/View.aspx?title=CWAB%20and%20Unity" href="http://www.codeplex.com/websf/Wiki/View.aspx?title=CWAB%20and%20Unity" target="_blank"&gt;CWAB and Unity&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;First off, I have moved this little side project to source control, so I can avoid the re-work I had to do before I could write this part of the series. &lt;/p&gt; &lt;p&gt;Note to self :&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;strong&gt;&lt;em&gt;NEVER work without a safety net.&amp;nbsp; That means both unit tests and source control. &lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Ok.&amp;nbsp; Now that that is out of the way....&lt;/p&gt; &lt;p&gt;Let's go add Unity to CWAB, via EDD (formerly TDD).&lt;/p&gt; &lt;p&gt;How can we do this?&amp;nbsp; First, we need a test fixture.&amp;nbsp; So, I added &lt;span style="color: #2b91af"&gt;CompositionContainerFixture&lt;/span&gt; to the CompositeWeb.Tests project as an empty test fixture.&amp;nbsp; And then I added the following very simple test as a starting point:&lt;/p&gt; &lt;blockquote&gt;&lt;pre class="code"&gt;[&lt;span style="color: #2b91af"&gt;TestMethod&lt;/span&gt;]
&lt;span style="color: blue"&gt;public void &lt;/span&gt;UnityCompositionContainerIsICompositionContainer()
{
    UnityCompositionContainer container = &lt;span style="color: blue"&gt;new &lt;/span&gt;UnityCompositionContainer();
    &lt;span style="color: #2b91af"&gt;Assert&lt;/span&gt;.IsInstanceOfType(container, &lt;span style="color: blue"&gt;typeof&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;ICompositionContainer&lt;/span&gt;));
}
&lt;/pre&gt;&lt;/blockquote&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p&gt;This will allow me to write enough code to create the &lt;span style="color: #2b91af"&gt;UnityCompositionContainer &lt;/span&gt;class and ensure that it implements the right interface.&lt;/p&gt;
&lt;p&gt;Making the test compile forces me to create a new &lt;span style="color: #2b91af"&gt;UnityCompositionContainer &lt;/span&gt;class (I added it to the fixture as a nested class for the moment), and the test fails.&amp;nbsp; No problem.&amp;nbsp; I add the interface, implement it with methods that throw, and..... We are green again.&amp;nbsp; &lt;/p&gt;
&lt;p&gt;Next step, I copied the unit test &lt;span style="color: green"&gt;RootContainerParentIsNull&lt;/span&gt; over, changed its name to NewUnityContainerParentIsNull, updated it to create a new UnityCompositionContainer, and compiled and ran the test.&amp;nbsp; It passed, which is not idea;l, but I will leave it an move on, knowing it will be important later.&amp;nbsp; For the next test, I copied &lt;span style="color: green"&gt;ChildContainerHasParent &lt;/span&gt;changed its name to NewUnityContainerParentIsNull, updated it to create a new UnityCompositionContainer, and compiled and ran the test... Red. Just like we expected.&amp;nbsp; To make this work, I could do a bit of throw away work, or I could add Unity.&amp;nbsp; I feel like I can skip the simplest thing possible, because I know where I want to go.&amp;nbsp; &lt;/p&gt;
&lt;p&gt;However, first, I'm doing a check-in.&amp;nbsp; I'll comment out the failing test, and sync up.&amp;nbsp; Just a sec.&lt;/p&gt;
&lt;p&gt;&amp;lt;click click&amp;gt;&lt;/p&gt;
&lt;p&gt;Ok, now To add Unity.&amp;nbsp; I grabbed the binaries from MSDN, dropped them in my tree in the Lib folder and we are good to go.&amp;nbsp; I added references in the CWAB projecct to Unity.DLL and ObjectBuilder2.DLL.&amp;nbsp; This means we have two completely separate DI systems as part of out code, which is awful.&amp;nbsp; However, it won't last too long.&lt;/p&gt;
&lt;p&gt;Now, we can make that test pass.&amp;nbsp; I added an IUnityContainer field to UnityCompositionContainer.&amp;nbsp; I then implemented a constructor to initialize it.&amp;nbsp; Then we needed to implement CreateChildContainer.&amp;nbsp; For this, the simplest thing was to create a new constructor for UnityCompositionContainer which takes a parent container as the only parameter.&amp;nbsp; After a little wire-up we end up with passing tests and this code:&lt;/p&gt;
&lt;blockquote&gt;&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;private &lt;/span&gt;UnityCompositionContainer(&lt;span style="color: #2b91af"&gt;UnityCompositionContainer &lt;/span&gt;parentContainer)
{
    Parent = parentContainer;
    wrappedContainer = parentContainer.wrappedContainer.CreateChildContainer();
}&lt;/pre&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;public &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ICompositionContainer &lt;/span&gt;CreateChildContainer()
{
    &lt;span style="color: #2b91af"&gt;UnityCompositionContainer &lt;/span&gt;child = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;UnityCompositionContainer&lt;/span&gt;(&lt;span style="color: blue"&gt;this&lt;/span&gt;);
    &lt;span style="color: blue"&gt;return &lt;/span&gt;child;
}&lt;/pre&gt;&lt;/blockquote&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p&gt;Fairly simple.&amp;nbsp; I will continue moving unit tests over, adapting them, and making them pass.&amp;nbsp; If there are any interesting deviations from normal, or new tests added, I'll let you know.&lt;/p&gt;
&lt;p&gt;&amp;lt;timewarp duration="a short while" /&amp;gt;&lt;/p&gt;
&lt;p&gt;That was actually fairly simple.&amp;nbsp; I copied the tests one at a time, replaced the container used with the UnityCompositionContainer, compiled, ran the tests, watched them fail due to NotImplementedExceptions, and fixed them.&amp;nbsp; Here's the test fixture:&lt;/p&gt;
&lt;blockquote&gt;&lt;pre class="code"&gt;[&lt;span style="color: #2b91af"&gt;TestClass&lt;/span&gt;]
&lt;span style="color: blue"&gt;public class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;UnityCompositionContainerFixture
&lt;/span&gt;{
    [&lt;span style="color: #2b91af"&gt;TestMethod&lt;/span&gt;]
    &lt;span style="color: blue"&gt;public void &lt;/span&gt;UnityCompositionContainerIsICompositionContainer()
    {
        &lt;span style="color: #2b91af"&gt;UnityCompositionContainer &lt;/span&gt;container = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;UnityCompositionContainer&lt;/span&gt;();
        &lt;span style="color: #2b91af"&gt;Assert&lt;/span&gt;.IsInstanceOfType(container, &lt;span style="color: blue"&gt;typeof &lt;/span&gt;(&lt;span style="color: #2b91af"&gt;ICompositionContainer&lt;/span&gt;));
    }

    [&lt;span style="color: #2b91af"&gt;TestMethod&lt;/span&gt;]
    &lt;span style="color: blue"&gt;public void &lt;/span&gt;NewUnityContainerParentIsNull()
    {
        &lt;span style="color: #2b91af"&gt;ICompositionContainer &lt;/span&gt;container = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;UnityCompositionContainer&lt;/span&gt;();
        &lt;span style="color: #2b91af"&gt;Assert&lt;/span&gt;.IsNull(container.Parent);
    }

    [&lt;span style="color: #2b91af"&gt;TestMethod&lt;/span&gt;]
    &lt;span style="color: blue"&gt;public void &lt;/span&gt;ChildContainerHasParent()
    {
        &lt;span style="color: #2b91af"&gt;ICompositionContainer &lt;/span&gt;parent = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;UnityCompositionContainer&lt;/span&gt;();

        &lt;span style="color: #2b91af"&gt;ICompositionContainer &lt;/span&gt;child = parent.CreateChildContainer();

        &lt;span style="color: #2b91af"&gt;Assert&lt;/span&gt;.AreSame(parent, child.Parent);
    }

    [&lt;span style="color: #2b91af"&gt;TestMethod&lt;/span&gt;]
    &lt;span style="color: blue"&gt;public void &lt;/span&gt;CanRegisterTypeMappingOnRootContainer()
    {
        &lt;span style="color: #2b91af"&gt;UnityCompositionContainer &lt;/span&gt;root = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;UnityCompositionContainer&lt;/span&gt;();

        root.RegisterType&amp;lt;&lt;span style="color: #2b91af"&gt;IFoo&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;Foo&lt;/span&gt;&amp;gt;();

        &lt;span style="color: #2b91af"&gt;IFoo &lt;/span&gt;resolvedIFoo = root.Resolve&amp;lt;&lt;span style="color: #2b91af"&gt;IFoo&lt;/span&gt;&amp;gt;();

        &lt;span style="color: #2b91af"&gt;Assert&lt;/span&gt;.AreEqual(&lt;span style="color: blue"&gt;typeof &lt;/span&gt;(&lt;span style="color: #2b91af"&gt;Foo&lt;/span&gt;), resolvedIFoo.GetType());
    }

    [&lt;span style="color: #2b91af"&gt;TestMethod&lt;/span&gt;]
    &lt;span style="color: blue"&gt;public void &lt;/span&gt;CanRegisterTypeMappingViaTypeObjects()
    {
        &lt;span style="color: #2b91af"&gt;UnityCompositionContainer &lt;/span&gt;root = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;UnityCompositionContainer&lt;/span&gt;();
        root.RegisterType(&lt;span style="color: blue"&gt;typeof &lt;/span&gt;(&lt;span style="color: #2b91af"&gt;IFoo&lt;/span&gt;), &lt;span style="color: blue"&gt;typeof &lt;/span&gt;(&lt;span style="color: #2b91af"&gt;Foo&lt;/span&gt;));

        &lt;span style="color: #2b91af"&gt;IFoo &lt;/span&gt;resolvedIFoo = root.Resolve&amp;lt;&lt;span style="color: #2b91af"&gt;IFoo&lt;/span&gt;&amp;gt;();

        &lt;span style="color: #2b91af"&gt;Assert&lt;/span&gt;.AreEqual(&lt;span style="color: blue"&gt;typeof &lt;/span&gt;(&lt;span style="color: #2b91af"&gt;Foo&lt;/span&gt;), resolvedIFoo.GetType());
    }

    [&lt;span style="color: #2b91af"&gt;TestMethod&lt;/span&gt;]
    &lt;span style="color: blue"&gt;public void &lt;/span&gt;RequestingTypeMappingForUnmappedTypeReturnsRequestedType()
    {
        &lt;span style="color: #2b91af"&gt;UnityCompositionContainer &lt;/span&gt;root = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;UnityCompositionContainer&lt;/span&gt;();

        &lt;span style="color: #2b91af"&gt;Foo &lt;/span&gt;resolvedFoo = root.Resolve&amp;lt;&lt;span style="color: #2b91af"&gt;Foo&lt;/span&gt;&amp;gt;();

        &lt;span style="color: #2b91af"&gt;Assert&lt;/span&gt;.AreEqual(&lt;span style="color: blue"&gt;typeof &lt;/span&gt;(&lt;span style="color: #2b91af"&gt;Foo&lt;/span&gt;), resolvedFoo.GetType());
    }

    [&lt;span style="color: #2b91af"&gt;TestMethod&lt;/span&gt;]
    [&lt;span style="color: #2b91af"&gt;ExpectedException&lt;/span&gt;(&lt;span style="color: blue"&gt;typeof &lt;/span&gt;(&lt;span style="color: #2b91af"&gt;ArgumentException&lt;/span&gt;))]
    &lt;span style="color: blue"&gt;public void &lt;/span&gt;TypeMappingsMustBeTypeCompatible()
    {
        &lt;span style="color: #2b91af"&gt;UnityCompositionContainer &lt;/span&gt;root = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;UnityCompositionContainer&lt;/span&gt;();
        root.RegisterType(&lt;span style="color: blue"&gt;typeof &lt;/span&gt;(&lt;span style="color: #2b91af"&gt;IBar&lt;/span&gt;), &lt;span style="color: blue"&gt;typeof &lt;/span&gt;(&lt;span style="color: #2b91af"&gt;Foo&lt;/span&gt;));
    }

    [&lt;span style="color: #2b91af"&gt;TestMethod&lt;/span&gt;]
    &lt;span style="color: blue"&gt;public void &lt;/span&gt;CanRegisterMultipleTypeMappings()
    {
        &lt;span style="color: #2b91af"&gt;UnityCompositionContainer &lt;/span&gt;root = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;UnityCompositionContainer&lt;/span&gt;();

        root.RegisterType&amp;lt;&lt;span style="color: #2b91af"&gt;IFoo&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;Foo&lt;/span&gt;&amp;gt;();
        root.RegisterType&amp;lt;&lt;span style="color: #2b91af"&gt;IBar&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;Bar&lt;/span&gt;&amp;gt;();
        &lt;span style="color: #2b91af"&gt;IBar &lt;/span&gt;b = root.Resolve&amp;lt;&lt;span style="color: #2b91af"&gt;IBar&lt;/span&gt;&amp;gt;();
        &lt;span style="color: #2b91af"&gt;IFoo &lt;/span&gt;f = root.Resolve&amp;lt;&lt;span style="color: #2b91af"&gt;IFoo&lt;/span&gt;&amp;gt;();

        &lt;span style="color: #2b91af"&gt;Assert&lt;/span&gt;.AreEqual(&lt;span style="color: blue"&gt;typeof &lt;/span&gt;(&lt;span style="color: #2b91af"&gt;Bar&lt;/span&gt;), b.GetType());
        &lt;span style="color: #2b91af"&gt;Assert&lt;/span&gt;.AreEqual(&lt;span style="color: blue"&gt;typeof &lt;/span&gt;(&lt;span style="color: #2b91af"&gt;Foo&lt;/span&gt;), f.GetType());
    }

    [&lt;span style="color: #2b91af"&gt;TestMethod&lt;/span&gt;]
    &lt;span style="color: blue"&gt;public void &lt;/span&gt;RequestingTypeMappingOnChildReadsFromParent()
    {
        &lt;span style="color: #2b91af"&gt;UnityCompositionContainer &lt;/span&gt;parent = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;UnityCompositionContainer&lt;/span&gt;();
        &lt;span style="color: #2b91af"&gt;ICompositionContainer &lt;/span&gt;child = (&lt;span style="color: #2b91af"&gt;ICompositionContainer&lt;/span&gt;) parent.CreateChildContainer();

        parent.RegisterType&amp;lt;&lt;span style="color: #2b91af"&gt;IFoo&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;Foo&lt;/span&gt;&amp;gt;();

        &lt;span style="color: #2b91af"&gt;Assert&lt;/span&gt;.AreEqual(&lt;span style="color: blue"&gt;typeof &lt;/span&gt;(&lt;span style="color: #2b91af"&gt;Foo&lt;/span&gt;), child.Resolve&amp;lt;&lt;span style="color: #2b91af"&gt;IFoo&lt;/span&gt;&amp;gt;().GetType());
    }

    [&lt;span style="color: #2b91af"&gt;TestMethod&lt;/span&gt;]
    &lt;span style="color: blue"&gt;public void &lt;/span&gt;ChildContainersCanOverrideParentTypeMapping()
    {
        &lt;span style="color: #2b91af"&gt;UnityCompositionContainer &lt;/span&gt;parent = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;UnityCompositionContainer&lt;/span&gt;();
        &lt;span style="color: #2b91af"&gt;ICompositionContainer &lt;/span&gt;child = (&lt;span style="color: #2b91af"&gt;UnityCompositionContainer&lt;/span&gt;) parent.CreateChildContainer();

        parent.RegisterType&amp;lt;&lt;span style="color: #2b91af"&gt;IFoo&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;Foo&lt;/span&gt;&amp;gt;();
        child.RegisterType&amp;lt;&lt;span style="color: #2b91af"&gt;IFoo&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;Foo2&lt;/span&gt;&amp;gt;();

        &lt;span style="color: #2b91af"&gt;Assert&lt;/span&gt;.AreEqual(&lt;span style="color: blue"&gt;typeof &lt;/span&gt;(&lt;span style="color: #2b91af"&gt;Foo&lt;/span&gt;), parent.Resolve&amp;lt;&lt;span style="color: #2b91af"&gt;IFoo&lt;/span&gt;&amp;gt;().GetType());
        &lt;span style="color: #2b91af"&gt;Assert&lt;/span&gt;.AreEqual(&lt;span style="color: blue"&gt;typeof &lt;/span&gt;(&lt;span style="color: #2b91af"&gt;Foo2&lt;/span&gt;), child.Resolve&amp;lt;&lt;span style="color: #2b91af"&gt;IFoo&lt;/span&gt;&amp;gt;().GetType());
    }

    [&lt;span style="color: #2b91af"&gt;TestMethod&lt;/span&gt;]
    &lt;span style="color: blue"&gt;public void &lt;/span&gt;CanCreateChildContainer()
    {
        &lt;span style="color: #2b91af"&gt;ICompositionContainer &lt;/span&gt;container = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;UnityCompositionContainer&lt;/span&gt;();

        &lt;span style="color: #2b91af"&gt;ICompositionContainer &lt;/span&gt;child = container.CreateChildContainer();
        &lt;span style="color: #2b91af"&gt;Assert&lt;/span&gt;.IsNotNull(child);
        &lt;span style="color: #2b91af"&gt;Assert&lt;/span&gt;.AreNotSame(container, child);
    }

    [&lt;span style="color: #2b91af"&gt;TestMethod&lt;/span&gt;]
    &lt;span style="color: blue"&gt;public void &lt;/span&gt;CanRegisterInstance()
    {
        &lt;span style="color: #2b91af"&gt;UnityCompositionContainer &lt;/span&gt;root = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;UnityCompositionContainer&lt;/span&gt;();
        root.RegisterInstance(&lt;span style="color: blue"&gt;typeof &lt;/span&gt;(&lt;span style="color: blue"&gt;string&lt;/span&gt;), &lt;span style="color: #a31515"&gt;"foo"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"bar"&lt;/span&gt;);
        &lt;span style="color: blue"&gt;string &lt;/span&gt;returned = (&lt;span style="color: blue"&gt;string&lt;/span&gt;) root.Resolve(&lt;span style="color: blue"&gt;typeof &lt;/span&gt;(&lt;span style="color: blue"&gt;string&lt;/span&gt;), &lt;span style="color: #a31515"&gt;"foo"&lt;/span&gt;);
        &lt;span style="color: #2b91af"&gt;Assert&lt;/span&gt;.AreEqual(&lt;span style="color: #a31515"&gt;"bar"&lt;/span&gt;, returned);
    }


    [&lt;span style="color: #2b91af"&gt;TestMethod&lt;/span&gt;]
    &lt;span style="color: blue"&gt;public void &lt;/span&gt;CanRegisterInstanceViaGenericWithoutName()
    {
        &lt;span style="color: #2b91af"&gt;ICompositionContainer &lt;/span&gt;root = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;UnityCompositionContainer&lt;/span&gt;();
        &lt;span style="color: #2b91af"&gt;Foo &lt;/span&gt;f1 = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Foo&lt;/span&gt;();
        root.RegisterInstance&amp;lt;&lt;span style="color: #2b91af"&gt;Foo&lt;/span&gt;&amp;gt;(f1);
        &lt;span style="color: #2b91af"&gt;Foo &lt;/span&gt;returnedFoo = (&lt;span style="color: #2b91af"&gt;Foo&lt;/span&gt;) root.Resolve(&lt;span style="color: blue"&gt;typeof &lt;/span&gt;(&lt;span style="color: #2b91af"&gt;Foo&lt;/span&gt;));
        &lt;span style="color: #2b91af"&gt;Assert&lt;/span&gt;.AreEqual(f1, returnedFoo);
    }

    [&lt;span style="color: #2b91af"&gt;TestMethod&lt;/span&gt;]
    &lt;span style="color: blue"&gt;public void &lt;/span&gt;CanRegisterInstanceViaGenericWithName()
    {
        &lt;span style="color: #2b91af"&gt;ICompositionContainer &lt;/span&gt;root = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;UnityCompositionContainer&lt;/span&gt;();
        &lt;span style="color: #2b91af"&gt;Foo &lt;/span&gt;f1 = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Foo&lt;/span&gt;();
        root.RegisterInstance&amp;lt;&lt;span style="color: #2b91af"&gt;Foo&lt;/span&gt;&amp;gt;(&lt;span style="color: #a31515"&gt;"asdf"&lt;/span&gt;, f1);
        &lt;span style="color: #2b91af"&gt;Foo &lt;/span&gt;returnedFoo = (&lt;span style="color: #2b91af"&gt;Foo&lt;/span&gt;) root.Resolve(&lt;span style="color: blue"&gt;typeof &lt;/span&gt;(&lt;span style="color: #2b91af"&gt;Foo&lt;/span&gt;), &lt;span style="color: #a31515"&gt;"asdf"&lt;/span&gt;);
        &lt;span style="color: #2b91af"&gt;Assert&lt;/span&gt;.AreEqual(f1, returnedFoo);
    }


    [&lt;span style="color: #2b91af"&gt;TestMethod&lt;/span&gt;]
    &lt;span style="color: blue"&gt;public void &lt;/span&gt;CanResolveViaGenericWithoutName()
    {
        &lt;span style="color: #2b91af"&gt;ICompositionContainer &lt;/span&gt;root = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;UnityCompositionContainer&lt;/span&gt;();
        &lt;span style="color: #2b91af"&gt;Foo &lt;/span&gt;f1 = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Foo&lt;/span&gt;();
        root.RegisterInstance&amp;lt;&lt;span style="color: #2b91af"&gt;Foo&lt;/span&gt;&amp;gt;(f1);
        &lt;span style="color: #2b91af"&gt;Foo &lt;/span&gt;returnedFoo = root.Resolve&amp;lt;&lt;span style="color: #2b91af"&gt;Foo&lt;/span&gt;&amp;gt;();
        &lt;span style="color: #2b91af"&gt;Assert&lt;/span&gt;.AreEqual(f1, returnedFoo);
    }

    [&lt;span style="color: #2b91af"&gt;TestMethod&lt;/span&gt;]
    &lt;span style="color: blue"&gt;public void &lt;/span&gt;CanResolveInstanceViaGenericWithName()
    {
        &lt;span style="color: #2b91af"&gt;ICompositionContainer &lt;/span&gt;root = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;UnityCompositionContainer&lt;/span&gt;();
        &lt;span style="color: #2b91af"&gt;Foo &lt;/span&gt;f1 = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Foo&lt;/span&gt;();
        root.RegisterInstance&amp;lt;&lt;span style="color: #2b91af"&gt;Foo&lt;/span&gt;&amp;gt;(&lt;span style="color: #a31515"&gt;"asdf"&lt;/span&gt;, f1);
        &lt;span style="color: #2b91af"&gt;Foo &lt;/span&gt;returnedFoo = root.Resolve&amp;lt;&lt;span style="color: #2b91af"&gt;Foo&lt;/span&gt;&amp;gt;(&lt;span style="color: #a31515"&gt;"asdf"&lt;/span&gt;);
        &lt;span style="color: #2b91af"&gt;Assert&lt;/span&gt;.AreEqual(f1, returnedFoo);
    }

    [&lt;span style="color: #2b91af"&gt;TestMethod&lt;/span&gt;]
    &lt;span style="color: blue"&gt;public void &lt;/span&gt;UnityCompositionContainerImplementsIDisposable()
    {
        &lt;span style="color: #2b91af"&gt;UnityCompositionContainer &lt;/span&gt;disposableContainer = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;UnityCompositionContainer&lt;/span&gt;();
        &lt;span style="color: #2b91af"&gt;Assert&lt;/span&gt;.IsNotNull(disposableContainer &lt;span style="color: blue"&gt;as &lt;/span&gt;&lt;span style="color: #2b91af"&gt;IDisposable&lt;/span&gt;);
    }

    &lt;span style="color: green"&gt;// This test is commented out intentionally. The purpose of this test is to show 
    // that if you use the generic version of the RegisterTypeMapping method, if the
    // types aren't compatible it'll fail at compile time. 
    // 
    // This is exactly what happens. However that also means this file won't compile.
    // The test is left in as comments, if you wish to verify this then remove the comments,
    // watch the compile file, and then comment it out again.

    //[TestMethod]
    //public void GenericTypeMappingRegistrationEnforcesCompileTimeCompatibility()
    //{
    //    UnityCompositionContainer root = new UnityCompositionContainer();
    //    root.RegisterType&amp;lt;IBar, Foo&amp;gt;();
    //}
&lt;/span&gt;}&lt;/pre&gt;&lt;/blockquote&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p&gt;Notice, there are no tests for the Services collection.&amp;nbsp; This is intentional.&amp;nbsp; We will see if we can avoid implementing the methods at all.&lt;/p&gt;
&lt;p&gt;And here is the code to make those tests pass:&lt;/p&gt;
&lt;blockquote&gt;&lt;pre class="code"&gt;&lt;span style="color: blue"&gt;public class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;UnityCompositionContainer &lt;/span&gt;: &lt;span style="color: #2b91af"&gt;ICompositionContainer&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;IDisposable
&lt;/span&gt;{
    &lt;span style="color: blue"&gt;private &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ICompositionContainer &lt;/span&gt;parent = &lt;span style="color: blue"&gt;null&lt;/span&gt;;
    &lt;span style="color: blue"&gt;private &lt;/span&gt;&lt;span style="color: #2b91af"&gt;IUnityContainer &lt;/span&gt;wrappedContainer;

    &lt;span style="color: blue"&gt;public &lt;/span&gt;UnityCompositionContainer()
    {
        wrappedContainer = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;UnityContainer&lt;/span&gt;();
    }

    &lt;span style="color: blue"&gt;private &lt;/span&gt;UnityCompositionContainer(&lt;span style="color: #2b91af"&gt;UnityCompositionContainer &lt;/span&gt;parentContainer)
    {
        Parent = parentContainer;
        wrappedContainer = parentContainer.wrappedContainer.CreateChildContainer();
    }

    &lt;span style="color: blue"&gt;public &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ICompositionContainer &lt;/span&gt;Parent
    {
        &lt;span style="color: blue"&gt;get &lt;/span&gt;{ &lt;span style="color: blue"&gt;return &lt;/span&gt;parent; }
        &lt;span style="color: blue"&gt;set &lt;/span&gt;{ parent = &lt;span style="color: blue"&gt;value&lt;/span&gt;; }
    }

    &lt;span style="color: blue"&gt;public &lt;/span&gt;&lt;span style="color: #2b91af"&gt;IServiceCollection &lt;/span&gt;Services
    {
        &lt;span style="color: blue"&gt;get &lt;/span&gt;{ &lt;span style="color: blue"&gt;throw new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;NotImplementedException&lt;/span&gt;(); &lt;span style="color: green"&gt;// return services; 
        &lt;/span&gt;}
    }

    &lt;span style="color: blue"&gt;public void &lt;/span&gt;RegisterInstance(&lt;span style="color: #2b91af"&gt;Type &lt;/span&gt;t, &lt;span style="color: blue"&gt;object &lt;/span&gt;instance)
    {
        wrappedContainer.RegisterInstance(t, instance);
    }

    &lt;span style="color: blue"&gt;public void &lt;/span&gt;RegisterInstance(&lt;span style="color: #2b91af"&gt;Type &lt;/span&gt;t, &lt;span style="color: blue"&gt;string &lt;/span&gt;name, &lt;span style="color: blue"&gt;object &lt;/span&gt;instance)
    {
        wrappedContainer.RegisterInstance(t, name, instance);
    }

    &lt;span style="color: blue"&gt;public void &lt;/span&gt;RegisterInstance&amp;lt;TInterface&amp;gt;(TInterface instance)
    {
        wrappedContainer.RegisterInstance&amp;lt;TInterface&amp;gt;(instance);
    }

    &lt;span style="color: blue"&gt;public void &lt;/span&gt;RegisterInstance&amp;lt;TInterface&amp;gt;(&lt;span style="color: blue"&gt;string &lt;/span&gt;name, TInterface instance)
    {
        wrappedContainer.RegisterInstance&amp;lt;TInterface&amp;gt;(name, instance);
    }

    &lt;span style="color: blue"&gt;public void &lt;/span&gt;RegisterType&amp;lt;TRequested, TReturned&amp;gt;() &lt;span style="color: blue"&gt;where &lt;/span&gt;TReturned : TRequested
    {
        wrappedContainer.RegisterType&amp;lt;TRequested, TReturned&amp;gt;();
    }

    &lt;span style="color: blue"&gt;public void &lt;/span&gt;RegisterType(&lt;span style="color: #2b91af"&gt;Type &lt;/span&gt;requested, &lt;span style="color: #2b91af"&gt;Type &lt;/span&gt;returned)
    {
        wrappedContainer.RegisterType(requested, returned);
    }

    &lt;span style="color: blue"&gt;public object &lt;/span&gt;Resolve(&lt;span style="color: #2b91af"&gt;Type &lt;/span&gt;typeOfItem)
    {
        &lt;span style="color: blue"&gt;return &lt;/span&gt;wrappedContainer.Resolve(typeOfItem);
    }

    &lt;span style="color: blue"&gt;public object &lt;/span&gt;Resolve(&lt;span style="color: #2b91af"&gt;Type &lt;/span&gt;typeOfItem, &lt;span style="color: blue"&gt;string &lt;/span&gt;name)
    {
        &lt;span style="color: blue"&gt;return &lt;/span&gt;wrappedContainer.Resolve(typeOfItem, name);
    }

    &lt;span style="color: blue"&gt;public &lt;/span&gt;T Resolve&amp;lt;T&amp;gt;()
    {
        &lt;span style="color: blue"&gt;return &lt;/span&gt;wrappedContainer.Resolve&amp;lt;T&amp;gt;();
    }

    &lt;span style="color: blue"&gt;public &lt;/span&gt;T Resolve&amp;lt;T&amp;gt;(&lt;span style="color: blue"&gt;string &lt;/span&gt;name)
    {
        &lt;span style="color: blue"&gt;return &lt;/span&gt;wrappedContainer.Resolve&amp;lt;T&amp;gt;(name);
    }

    &lt;span style="color: blue"&gt;public object &lt;/span&gt;BuildItem(&lt;span style="color: #2b91af"&gt;IBuilder&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;WCSFBuilderStage&lt;/span&gt;&amp;gt; builder, &lt;span style="color: blue"&gt;object &lt;/span&gt;item)
    {
        &lt;span style="color: blue"&gt;throw new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;NotImplementedException&lt;/span&gt;();
    }

    &lt;span style="color: blue"&gt;public &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ICompositionContainer &lt;/span&gt;CreateChildContainer()
    {
        &lt;span style="color: #2b91af"&gt;UnityCompositionContainer &lt;/span&gt;child = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;UnityCompositionContainer&lt;/span&gt;(&lt;span style="color: blue"&gt;this&lt;/span&gt;);
        &lt;span style="color: blue"&gt;return &lt;/span&gt;child;
    }

    &lt;span style="color: blue"&gt;public void &lt;/span&gt;Dispose()
    {
        wrappedContainer.Dispose();
        wrappedContainer = &lt;span style="color: blue"&gt;null&lt;/span&gt;;
    }
}&lt;/pre&gt;&lt;/blockquote&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;
&lt;p&gt;We are now in a green state, time to check in.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Abusing Source Control&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Agile teams usually check in very often.&amp;nbsp; Some teams check in every time they hit green.&amp;nbsp; I think that is a bit of overkill, unless you have a source control system with NO overhead.&amp;nbsp; I check in when I complete a feature or a story, and usually at a few good, green stopping points in the process, like I have been doing.&amp;nbsp; This was a good stopping point, and my next task is a bit risky, so this is a perfect time to check in.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;This is a long enough post, even though I didn't do all that much, that I will call it quits for today.&amp;nbsp; Next post, actually use the UnityCompositionContainer, and then nuke the old CompositionContainer.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8447888" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/mpuleio/archive/tags/Example+Driven+Design+_2800_Formerly+TDD_2900_/default.aspx">Example Driven Design (Formerly TDD)</category><category domain="http://blogs.msdn.com/mpuleio/archive/tags/Development+Tools/default.aspx">Development Tools</category><category domain="http://blogs.msdn.com/mpuleio/archive/tags/patterns+_2600_amp_3B00_+practices/default.aspx">patterns &amp;amp; practices</category><category domain="http://blogs.msdn.com/mpuleio/archive/tags/Web+Client+Software+Factory/default.aspx">Web Client Software Factory</category><category domain="http://blogs.msdn.com/mpuleio/archive/tags/ASP.NET/default.aspx">ASP.NET</category><category domain="http://blogs.msdn.com/mpuleio/archive/tags/ASP.NET+AJAX/default.aspx">ASP.NET AJAX</category><category domain="http://blogs.msdn.com/mpuleio/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://blogs.msdn.com/mpuleio/archive/tags/.NET/default.aspx">.NET</category><category domain="http://blogs.msdn.com/mpuleio/archive/tags/Unity/default.aspx">Unity</category></item><item><title>We really do listen to community feedback</title><link>http://blogs.msdn.com/mpuleio/archive/2008/04/28/we-really-do-listen-to-community-feedback.aspx</link><pubDate>Tue, 29 Apr 2008 00:27:31 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8436154</guid><dc:creator>mpuleio</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/mpuleio/comments/8436154.aspx</comments><wfw:commentRss>http://blogs.msdn.com/mpuleio/commentrss.aspx?PostID=8436154</wfw:commentRss><wfw:comment>http://blogs.msdn.com/mpuleio/rsscomments.aspx?PostID=8436154</wfw:comment><description>&lt;p&gt;The other day, we shipped the &lt;a href="https://www.codeplex.com/Release/ProjectReleases.aspx?ProjectName=smartclient&amp;amp;ReleaseId=12893" target="_blank"&gt;Smart Client Software Factory April 2008 Release&lt;/a&gt;. Before we shipped, I asked the team to audit all the open work items in the queue on the &lt;a href="http://www.codeplex.com/smartclient/WorkItem/AdvancedList.aspx" target="_blank"&gt;SCSF community site's Issue Tracker&lt;/a&gt; and determine what we had fixed.&amp;nbsp; We had used the items in the Issue Tracker before and during the project, to help guide some of the bug fixes and features.&amp;nbsp; However, the audit allowed us to do some clean up and &lt;em&gt;ensure&lt;/em&gt; we fixed a few things.&amp;nbsp; Today, I used the results of that audit, and closed a few work items.&amp;nbsp; &lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&amp;lt;Sidebar&amp;gt;&lt;/p&gt; &lt;p&gt;I did cheat a bit: I used the Visual Studio Team System integration with CodePlex so I could open up the list of all open work items in an Excel spreadsheet and publish changes back to the live Codeplex site.&amp;nbsp; This made bulk editing a whole lot simpler, and saved me a lot of time.&amp;nbsp; &lt;/p&gt; &lt;p&gt;&amp;lt;/Sidebar&amp;gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;Here are the results of the audit and work item closures:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Out of 89 open work items/ issues, we closed 45 today.&amp;nbsp; A number of these had been fixed in the May 2007 release and never closed, a number were fixed in this release, and some were related to different weekly drops.&lt;/li&gt; &lt;li&gt;Out of the top 25 items (by community votes), we closed 13.&lt;/li&gt; &lt;li&gt;Looked at another way, we closed 1/2 of the open issues, and 1/2 of the top issues. Not bad.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;So, keep up the discussion in our communities.&amp;nbsp; We reply on the discussion boards, we actually do look at the open work items on occasion, and we do listen to the community.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8436154" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/mpuleio/archive/tags/Development+Tools/default.aspx">Development Tools</category><category domain="http://blogs.msdn.com/mpuleio/archive/tags/Non-Technical/default.aspx">Non-Technical</category><category domain="http://blogs.msdn.com/mpuleio/archive/tags/patterns+_2600_amp_3B00_+practices/default.aspx">patterns &amp;amp; practices</category><category domain="http://blogs.msdn.com/mpuleio/archive/tags/Smart+Client+Software+Factory/default.aspx">Smart Client Software Factory</category></item><item><title>Smart Client Software Factory – April 2008 Release is available on MSDN</title><link>http://blogs.msdn.com/mpuleio/archive/2008/04/25/smart-client-software-factory-april-2008-release-is-available-on-msdn.aspx</link><pubDate>Sat, 26 Apr 2008 03:25:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8425078</guid><dc:creator>mpuleio</dc:creator><slash:comments>5</slash:comments><comments>http://blogs.msdn.com/mpuleio/comments/8425078.aspx</comments><wfw:commentRss>http://blogs.msdn.com/mpuleio/commentrss.aspx?PostID=8425078</wfw:commentRss><wfw:comment>http://blogs.msdn.com/mpuleio/rsscomments.aspx?PostID=8425078</wfw:comment><description>&lt;P&gt;The April 2008 release of the Smart Client Software Factory is now available at &lt;A href="http://msdn2.microsoft.com/en-us/library/aa480482.aspx" target=_blank&gt;&lt;FONT color=#0000ff&gt;http://msdn2.microsoft.com/en-us/library/aa480482.aspx&lt;/FONT&gt;&lt;/A&gt;.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;This is a port of the last release&amp;nbsp;(May 2007,&amp;nbsp;if I recall&amp;nbsp;correctly)&amp;nbsp;to VS2008.&amp;nbsp; No new features were added.&amp;nbsp; A few bugs were fixed, and a number of work items from CodePlex were closed.&lt;/P&gt;
&lt;P&gt;This release supports Enterprise Library 3.1.&amp;nbsp; It does not support Enterprise Library 4.0.&amp;nbsp; If you want EntLib 4.0 (once it is released) you have the source code, and should be able to get it to work, if you really need to.&amp;nbsp; I would not recommend it, as you will end up with two containers (Unity and the CAB container), which means code bloat and challenges deciding where objects should go.&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8425078" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/mpuleio/archive/tags/Example+Driven+Design+_2800_Formerly+TDD_2900_/default.aspx">Example Driven Design (Formerly TDD)</category><category domain="http://blogs.msdn.com/mpuleio/archive/tags/Development+Tools/default.aspx">Development Tools</category><category domain="http://blogs.msdn.com/mpuleio/archive/tags/patterns+_2600_amp_3B00_+practices/default.aspx">patterns &amp;amp; practices</category><category domain="http://blogs.msdn.com/mpuleio/archive/tags/Smart+Client+Software+Factory/default.aspx">Smart Client Software Factory</category><category domain="http://blogs.msdn.com/mpuleio/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://blogs.msdn.com/mpuleio/archive/tags/.NET/default.aspx">.NET</category><category domain="http://blogs.msdn.com/mpuleio/archive/tags/WPF/default.aspx">WPF</category><category domain="http://blogs.msdn.com/mpuleio/archive/tags/Windows+Forms/default.aspx">Windows Forms</category></item><item><title>Smart Client Software Factory April 2008 Release Candidate Available</title><link>http://blogs.msdn.com/mpuleio/archive/2008/04/21/smart-client-software-factory-april-2008-release-candidate-available.aspx</link><pubDate>Tue, 22 Apr 2008 00:09:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8415422</guid><dc:creator>mpuleio</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/mpuleio/comments/8415422.aspx</comments><wfw:commentRss>http://blogs.msdn.com/mpuleio/commentrss.aspx?PostID=8415422</wfw:commentRss><wfw:comment>http://blogs.msdn.com/mpuleio/rsscomments.aspx?PostID=8415422</wfw:comment><description>&lt;P&gt;Friday, I posted we had a solid Beta.&amp;nbsp; Today, I am letting you know that &lt;A href="http://www.codeplex.com/smartclient/Release/ProjectReleases.aspx?ReleaseId=12765" target=_blank mce_href="http://www.codeplex.com/smartclient/Release/ProjectReleases.aspx?ReleaseId=12765"&gt;SCSF now has a Release Candidate (RC)&lt;/A&gt;.&amp;nbsp; The bug that appeared Friday is, we think, fixed.&amp;nbsp; We actually published the RC before we completed any internal testing, so the customer who reported the issue would have a chance to verify the fix works on their system ASAP.&amp;nbsp; Don't worry, we will&amp;nbsp;do a&amp;nbsp;solid test pass before determining if&amp;nbsp;this RC will become&amp;nbsp;the official release.&amp;nbsp;(The fact that we are confident in our build system and the automated tests there helps with this sort of turnaround. :-) ) &lt;/P&gt;
&lt;P&gt;Please try out the &lt;A href="http://www.codeplex.com/smartclient/Release/ProjectReleases.aspx?ReleaseId=12765" target=_blank mce_href="http://www.codeplex.com/smartclient/Release/ProjectReleases.aspx?ReleaseId=12765"&gt;Smart Client Software Factory April 2008 Release Candidate,&lt;/A&gt; and report any issues on the &lt;A href="http://www.codeplex.com/smartclient" target=_blank mce_href="http://www.codeplex.com/smartclient"&gt;SCSF CodePlex community site&lt;/A&gt;.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8415422" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/mpuleio/archive/tags/Development+Tools/default.aspx">Development Tools</category><category domain="http://blogs.msdn.com/mpuleio/archive/tags/patterns+_2600_amp_3B00_+practices/default.aspx">patterns &amp;amp; practices</category><category domain="http://blogs.msdn.com/mpuleio/archive/tags/Smart+Client+Software+Factory/default.aspx">Smart Client Software Factory</category><category domain="http://blogs.msdn.com/mpuleio/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://blogs.msdn.com/mpuleio/archive/tags/WPF/default.aspx">WPF</category><category domain="http://blogs.msdn.com/mpuleio/archive/tags/Windows+Forms/default.aspx">Windows Forms</category></item><item><title>Smart Client Software Factory April 2008 Beta Available</title><link>http://blogs.msdn.com/mpuleio/archive/2008/04/18/smart-client-software-factory-april-2008-beta-available.aspx</link><pubDate>Sat, 19 Apr 2008 01:34:08 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8409262</guid><dc:creator>mpuleio</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/mpuleio/comments/8409262.aspx</comments><wfw:commentRss>http://blogs.msdn.com/mpuleio/commentrss.aspx?PostID=8409262</wfw:commentRss><wfw:comment>http://blogs.msdn.com/mpuleio/rsscomments.aspx?PostID=8409262</wfw:comment><description>&lt;p&gt;The &lt;a href="http://www.codeplex.com/smartclient/Release/ProjectReleases.aspx?ReleaseId=12699"&gt;SCSF April 2008 Beta Release&lt;/a&gt; that supports Visual Studio 2008 is now available.&lt;/p&gt; &lt;p&gt;We fixed all the known issues from the Alpha.&amp;nbsp; It is &lt;strong&gt;solid&lt;/strong&gt;, and may actually be a release candidate, rather than a beta.&lt;/p&gt; &lt;p&gt;Enjoy.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8409262" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/mpuleio/archive/tags/Development+Tools/default.aspx">Development Tools</category><category domain="http://blogs.msdn.com/mpuleio/archive/tags/patterns+_2600_amp_3B00_+practices/default.aspx">patterns &amp;amp; practices</category><category domain="http://blogs.msdn.com/mpuleio/archive/tags/Smart+Client+Software+Factory/default.aspx">Smart Client Software Factory</category><category domain="http://blogs.msdn.com/mpuleio/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://blogs.msdn.com/mpuleio/archive/tags/WPF/default.aspx">WPF</category><category domain="http://blogs.msdn.com/mpuleio/archive/tags/Windows+Forms/default.aspx">Windows Forms</category></item><item><title>Acceptance Test Engineering Guidance</title><link>http://blogs.msdn.com/mpuleio/archive/2008/04/18/acceptance-test-engineering-guidance.aspx</link><pubDate>Sat, 19 Apr 2008 00:48:23 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8409159</guid><dc:creator>mpuleio</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/mpuleio/comments/8409159.aspx</comments><wfw:commentRss>http://blogs.msdn.com/mpuleio/commentrss.aspx?PostID=8409159</wfw:commentRss><wfw:comment>http://blogs.msdn.com/mpuleio/rsscomments.aspx?PostID=8409159</wfw:comment><description>&lt;p&gt;As I mentioned before (&lt;a href="http://blogs.msdn.com/mpuleio/archive/2008/04/03/acceptance-testing-guidance.aspx"&gt;Acceptance Testing Guidance&lt;/a&gt;, &lt;a href="http://blogs.msdn.com/mpuleio/archive/2008/04/08/grigori-s-take-on-the-acceptance-testing-project.aspx"&gt;Grigori's Take on the Acceptance Testing Project&lt;/a&gt;), I am working on guidance around acceptance testing with &lt;a href="http://blogs.msdn.com/agile" target="_blank"&gt;Grigori&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;We now have alive CodePlex site that we can work from: &lt;a href="http://www.codeplex.com/TestingGuidance" target="_blank"&gt;patterns &amp;amp; practices: Acceptance Test Engineering Guidance&lt;/a&gt;&lt;/p&gt; &lt;p&gt;We will be posting more as we really get ramped up.&amp;nbsp; We have a LOT of ideas that we will post and talk about.&amp;nbsp; We will also post bi-weekly (or close) drops, probably in the form of Word documents, showing what we have so far, and asking for input.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8409159" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/mpuleio/archive/tags/Development+Tools/default.aspx">Development Tools</category><category domain="http://blogs.msdn.com/mpuleio/archive/tags/Agile/default.aspx">Agile</category><category domain="http://blogs.msdn.com/mpuleio/archive/tags/Testing/default.aspx">Testing</category><category domain="http://blogs.msdn.com/mpuleio/archive/tags/patterns+_2600_amp_3B00_+practices/default.aspx">patterns &amp;amp; practices</category><category domain="http://blogs.msdn.com/mpuleio/archive/tags/Acceptance+Test+Engineering+Guidance/default.aspx">Acceptance Test Engineering Guidance</category><category domain="http://blogs.msdn.com/mpuleio/archive/tags/Acceptance+Testing/default.aspx">Acceptance Testing</category></item><item><title>Smart Client Software Factory April 2008 Alpha Available</title><link>http://blogs.msdn.com/mpuleio/archive/2008/04/10/smart-client-software-factory-april-2008-alpha-available.aspx</link><pubDate>Fri, 11 Apr 2008 01:16:03 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8376894</guid><dc:creator>mpuleio</dc:creator><slash:comments>4</slash:comments><comments>http://blogs.msdn.com/mpuleio/comments/8376894.aspx</comments><wfw:commentRss>http://blogs.msdn.com/mpuleio/commentrss.aspx?PostID=8376894</wfw:commentRss><wfw:comment>http://blogs.msdn.com/mpuleio/rsscomments.aspx?PostID=8376894</wfw:comment><description>&lt;p&gt;For the past month or so, Blaine and I have been &lt;em&gt;overseeing&lt;/em&gt; the development of the April release of the Smart Client Software Factory.&amp;nbsp; This release is being done mostly by a team of vendors, freeing Blaine to run Prism and I to run the Acceptance Testing Guidance project.&amp;nbsp; Blaine and I are still very involved, and I still review code changes at random, but the team does most of the work.&amp;nbsp; The team has been doing a great job, and I think the community will be pleased with the results.&lt;/p&gt; &lt;p&gt;This is a port of SCSF to VS2008 and the .NET 3.5 framework.&amp;nbsp; It uses Enterprise Library 3.1, not 4.0, intentionally.&amp;nbsp; There is very little in 4.0 that will effect CAB and SCSF development, except Unity.&amp;nbsp; Using Unity would require a nearly full re-write of CAB, and we don't currently have the time or people to do it right and deliver on our other commitments.&amp;nbsp; However, if you really need EntLib4.0, it should work, and if not, you have the source code to fix it.&lt;/p&gt; &lt;p&gt;We did need to create a custom data provider to wrap the SqlCE functionality, as the version number of the platform DLL went from 9.x to 3.5.&amp;nbsp; This replaces the EntLib 3.1 provider for SQLCE.&amp;nbsp; &lt;/p&gt; &lt;p&gt;Also, this version of SCSF, just like the last one, supports hosting WPF controls in your WinForms CAB application.&amp;nbsp; It does not support a full WPF app.&amp;nbsp; For that, you want to see &lt;a href="http://www.codeplex.com/prism" target="_blank"&gt;Prism&lt;/a&gt; or the Smart Client Factory Contrib project on CodePlex.&lt;/p&gt; &lt;p&gt;We are also fixing a few bugs, and updating the guidance package (Visual Studio automation) to work in VS2008.&lt;/p&gt; &lt;p&gt;You can &lt;a href="https://www.codeplex.com/Release/ProjectReleases.aspx?ProjectName=smartclient&amp;amp;ReleaseId=12468" target="_blank"&gt;download the Alpha release&lt;/a&gt; from the &lt;a href="http://www.codeplex.com/smartclient" target="_blank"&gt;SCSF CodePlex community site&lt;/a&gt;.&amp;nbsp; &lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;strong&gt;&lt;em&gt;Warning&lt;/em&gt;&lt;/strong&gt;: This is an Alpha.&amp;nbsp; We did a &lt;em&gt;minimal&lt;/em&gt; amount of testing ("It compiles and links."&amp;nbsp; -- "Good enough.&amp;nbsp; Ship it"), and the computer we installed it on still boots, still runs VS, and &lt;em&gt;seems&lt;/em&gt; ok.&amp;nbsp; Use at your own risk.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;We are trying to get this project wrapped up this month.&amp;nbsp; If you see issues, please post them to the Issue Tracker at the &lt;a href="http://www.codeplex.com/smartclient" target="_blank"&gt;SCSF CodePlex community site&lt;/a&gt;, and/or post to the discussion forum there.&amp;nbsp; We will try to get any major problems, but will not be adding features.&lt;/p&gt; &lt;p&gt;Blaine is also posting about this &lt;a href="http://blogs.msdn.com/blaine/archive/2008/04/10/scsf-april-2008-alpha-for-visual-studio-2008-published-to-codeplex.aspx" target="_blank"&gt;SCSF April 2008 Alpha for Visual Studio 2008 Published to CodePlex&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8376894" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/mpuleio/archive/tags/Development+Tools/default.aspx">Development Tools</category><category domain="http://blogs.msdn.com/mpuleio/archive/tags/patterns+_2600_amp_3B00_+practices/default.aspx">patterns &amp;amp; practices</category><category domain="http://blogs.msdn.com/mpuleio/archive/tags/Smart+Client+Software+Factory/default.aspx">Smart Client Software Factory</category><category domain="http://blogs.msdn.com/mpuleio/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://blogs.msdn.com/mpuleio/archive/tags/WPF/default.aspx">WPF</category><category domain="http://blogs.msdn.com/mpuleio/archive/tags/Windows+Forms/default.aspx">Windows Forms</category></item></channel></rss>