<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><title type="html">Espresso Fueled Agile Development</title><subtitle type="html">Comments on my work at patterns &amp; practices, agile development, and caffeine sources.</subtitle><id>http://blogs.msdn.com/mpuleio/atom.xml</id><link rel="alternate" type="text/html" href="http://blogs.msdn.com/mpuleio/default.aspx" /><link rel="self" type="application/atom+xml" href="http://blogs.msdn.com/mpuleio/atom.xml" /><generator uri="http://communityserver.org" version="2.1.61025.2">Community Server</generator><updated>2008-07-17T13:32:22Z</updated><entry><title>Data Access Guidance Drops available</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/mpuleio/archive/2009/07/02/data-access-guidance-drops-available.aspx" /><id>http://blogs.msdn.com/mpuleio/archive/2009/07/02/data-access-guidance-drops-available.aspx</id><published>2009-07-02T21:16:07Z</published><updated>2009-07-02T21:16:07Z</updated><content type="html">&lt;p&gt;For the last few months, I have been working with &lt;a href="http://blogs.msdn.com/donsmith/" target="_blank"&gt;Don&lt;/a&gt; on developing guidance for developers who have to deal with data access. We have a CodePlex project over at &lt;a title="http://dataguidance.codeplex.com/" href="http://dataguidance.codeplex.com/" target="_blank"&gt;http://dataguidance.codeplex.com/&lt;/a&gt; up and running. We have been working for a while, but (unlike most p&amp;amp;p projects) we have been building on pre-beta technologies, which meant we could not ship our source code in a way that you could consume it.&amp;#160; Recently, Visual Studio 2010 Beta 1 and ASP.NET MVC for VS2010 Beta 1 were made available publicly, meaning we could ship our code.&amp;#160; Two weeks ago, we finished an iteration and made available our first public drop (&lt;a href="http://dataguidance.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=28998" target="_blank"&gt;Drop 2009.06.17&lt;/a&gt;) using &lt;a href="http://msdn.microsoft.com/en-us/teamsystem/dd819231.aspx" target="_blank"&gt;Visual Studio 2010 Beta 1&lt;/a&gt;, Entity Framework 4, &lt;a href="http://aspnet.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=28527" target="_blank"&gt;ASP.NET MVC for Visual Studio 2010 Beta 1&lt;/a&gt;, and the &lt;a href="http://compositewpf.codeplex.com/" target="_blank"&gt;Composite Application Library from Prism&lt;/a&gt;.&amp;#160; This week, (after another two week iteration) we released another drop (&lt;a href="http://dataguidance.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=29628" target="_blank"&gt;Drop 2009.07.02&lt;/a&gt;), building on what we had and improving it a bit.&amp;#160; Check out the project and the code (which is still evolving), and &lt;a href="http://dataguidance.codeplex.com/Thread/List.aspx" target="_blank"&gt;give us some feedback&lt;/a&gt; on how we are doing things and what you think of our implementations of the Repository pattern, the specification pattern, our RESTful service implementation, and the rest of the code.&amp;#160; Keep in mind, we are focusing on the data access part of the project, and the rest (the web app and WPF app) is there to show how to use the data access layer. &lt;/p&gt;  &lt;p&gt;Also, look for a new drop every two weeks (or so) until we finish the project.&lt;/p&gt;  &lt;p&gt;Enjoy…&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9814691" width="1" height="1"&gt;</content><author><name>mpuleio</name><uri>http://blogs.msdn.com/members/mpuleio.aspx</uri></author></entry><entry><title>If you missed the patterns &amp; practices summit....</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/mpuleio/archive/2008/12/04/if-you-missed-the-patterns-practices-summit.aspx" /><id>http://blogs.msdn.com/mpuleio/archive/2008/12/04/if-you-missed-the-patterns-practices-summit.aspx</id><published>2008-12-04T12:37:00Z</published><updated>2008-12-04T12:37:00Z</updated><content type="html">&lt;P&gt;&lt;A target=_blank href="http://blogs.msdn.com/ajoyk" mce_href="http://blogs.msdn.com/ajoyk"&gt;Ajoy&lt;/A&gt; has posted that three of the sessions have been made available online at &lt;A target=_blank href="http://blogs.msdn.com/ajoyk/archive/2008/12/03/pnp-summit-videos-online.aspx" mce_href="http://blogs.msdn.com/ajoyk/archive/2008/12/03/pnp-summit-videos-online.aspx"&gt;pnp Summit videos online&lt;/A&gt;.&amp;nbsp; Since one of the three sessions is one that Grigori and I did about the Acceptance Testing Guide, &lt;A target=_blank href="http://wm.microsoft.com/ms/patterns-and-practices/2008-11-pnp-summit/acceptance-testing.wmv" mce_href="http://wm.microsoft.com/ms/patterns-and-practices/2008-11-pnp-summit/acceptance-testing.wmv"&gt;Driving Development with Acceptance Testing&lt;/A&gt;, I figured I'd share the information.&amp;nbsp; The other two sessions are Ade talking about distributed agile development, and a discussion with Ajoy on the new SharePoint guidance from p&amp;amp;p that I have mentioned before (&lt;A id=bp___ctl00___RecentPosts___postlist___EntryItems_ctl08_PostTitle href="http://blogs.msdn.com/mpuleio/archive/2008/08/13/guidance-on-sharepoint.aspx"&gt;&lt;FONT color=#006bad&gt;Guidance on SharePoint&lt;/FONT&gt;&lt;/A&gt;, &lt;A id=bp___ctl00___RecentPosts___postlist___EntryItems_ctl07_PostTitle href="http://blogs.msdn.com/mpuleio/archive/2008/08/22/unit-testing-sharepoint.aspx"&gt;&lt;FONT color=#006bad&gt;Unit testing SharePoint&lt;/FONT&gt;&lt;/A&gt;).&amp;nbsp; If you missed the Summit and want to attend next year in Redmond (or elsewhere), keep an eye on &lt;A href="http://www.pnpsummit.com/"&gt;http://www.pnpsummit.com/&lt;/A&gt;, which will eventually be updated with information on the next conference.&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9174526" width="1" height="1"&gt;</content><author><name>mpuleio</name><uri>http://blogs.msdn.com/members/mpuleio.aspx</uri></author><category term="Agile" scheme="http://blogs.msdn.com/mpuleio/archive/tags/Agile/default.aspx" /><category term="Testing" scheme="http://blogs.msdn.com/mpuleio/archive/tags/Testing/default.aspx" /><category term="patterns &amp;amp; practices" scheme="http://blogs.msdn.com/mpuleio/archive/tags/patterns+_2600_amp_3B00_+practices/default.aspx" /><category term="Acceptance Test Engineering Guidance" scheme="http://blogs.msdn.com/mpuleio/archive/tags/Acceptance+Test+Engineering+Guidance/default.aspx" /><category term="Acceptance Testing" scheme="http://blogs.msdn.com/mpuleio/archive/tags/Acceptance+Testing/default.aspx" /><category term="SharePoint" scheme="http://blogs.msdn.com/mpuleio/archive/tags/SharePoint/default.aspx" /></entry><entry><title>Who is using WCSF?</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/mpuleio/archive/2008/12/03/who-is-using-wcsf.aspx" /><id>http://blogs.msdn.com/mpuleio/archive/2008/12/03/who-is-using-wcsf.aspx</id><published>2008-12-03T21:48:51Z</published><updated>2008-12-03T21:48:51Z</updated><content type="html">&lt;p&gt;Blaine and I would like to ask the community to let us know &amp;quot;who is using WCSF?&amp;quot;&amp;#160; We know that WCSF has been fairly successful based on: &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;WCSF has been downloaded a few times (ok, it is really many thousands of times) &lt;/li&gt;    &lt;li&gt;The discussion forums on CodePlex are fairly busy &lt;/li&gt;    &lt;li&gt;Direct customer engagement with a number of companies &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;However, there are a lot of folks who are using WCSF that we do not know about.&amp;#160; Since we get requests all the time about who is using WCSF, the size of projects, the size of dev teams, etc, we would love to collect some more data and statistics.&amp;#160; So, if you have used or are using WCSF on a project, let us know via comments, email, or discussions on CodePlex.&amp;#160; If you have stopped using it, please let us know why, so we can possibly address concerns.&lt;/p&gt;  &lt;p&gt;To make things simple, I have created a thread on the WCSF CodePlex discussion forum so you can easily provide feedback: &lt;a title="http://www.codeplex.com/websf/Thread/View.aspx?ThreadId=41405" href="http://www.codeplex.com/websf/Thread/View.aspx?ThreadId=41405"&gt;http://www.codeplex.com/websf/Thread/View.aspx?ThreadId=41405&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Thanks. &lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9171225" width="1" height="1"&gt;</content><author><name>mpuleio</name><uri>http://blogs.msdn.com/members/mpuleio.aspx</uri></author><category term="patterns &amp;amp; practices" scheme="http://blogs.msdn.com/mpuleio/archive/tags/patterns+_2600_amp_3B00_+practices/default.aspx" /><category term="Web Client Software Factory" scheme="http://blogs.msdn.com/mpuleio/archive/tags/Web+Client+Software+Factory/default.aspx" /><category term="ASP.NET" scheme="http://blogs.msdn.com/mpuleio/archive/tags/ASP.NET/default.aspx" /><category term="ASP.NET AJAX" scheme="http://blogs.msdn.com/mpuleio/archive/tags/ASP.NET+AJAX/default.aspx" /><category term="C#" scheme="http://blogs.msdn.com/mpuleio/archive/tags/C_2300_/default.aspx" /></entry><entry><title>Where is WCSF headed?</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/mpuleio/archive/2008/12/03/where-is-wcsf-headed.aspx" /><id>http://blogs.msdn.com/mpuleio/archive/2008/12/03/where-is-wcsf-headed.aspx</id><published>2008-12-03T21:24:19Z</published><updated>2008-12-03T21:24:19Z</updated><content type="html">&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;</content><author><name>mpuleio</name><uri>http://blogs.msdn.com/members/mpuleio.aspx</uri></author><category term="Development Tools" scheme="http://blogs.msdn.com/mpuleio/archive/tags/Development+Tools/default.aspx" /><category term="patterns &amp;amp; practices" scheme="http://blogs.msdn.com/mpuleio/archive/tags/patterns+_2600_amp_3B00_+practices/default.aspx" /><category term="Web Client Software Factory" scheme="http://blogs.msdn.com/mpuleio/archive/tags/Web+Client+Software+Factory/default.aspx" /><category term="ASP.NET" scheme="http://blogs.msdn.com/mpuleio/archive/tags/ASP.NET/default.aspx" /><category term="ASP.NET AJAX" scheme="http://blogs.msdn.com/mpuleio/archive/tags/ASP.NET+AJAX/default.aspx" /><category term="C#" scheme="http://blogs.msdn.com/mpuleio/archive/tags/C_2300_/default.aspx" /><category term=".NET" scheme="http://blogs.msdn.com/mpuleio/archive/tags/.NET/default.aspx" /></entry><entry><title>Back from vacation... and a lot has happened in the last week</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/mpuleio/archive/2008/11/03/back-from-vacation-and-a-lot-has-happened-in-the-last-week.aspx" /><id>http://blogs.msdn.com/mpuleio/archive/2008/11/03/back-from-vacation-and-a-lot-has-happened-in-the-last-week.aspx</id><published>2008-11-03T22:48:30Z</published><updated>2008-11-03T22:48:30Z</updated><content type="html">&lt;p&gt;I took a week off, which was good.&amp;nbsp; I visited family and spent time relaxing and playing video games. (Fallout3 rocks so far!!).&amp;nbsp; I got back this morning to hundreds of emails to go through.&amp;nbsp; After reading almost all of it, there were a few things that happened recently I wanted to share... Here are the highlights:&lt;/p&gt; &lt;p&gt;Grigori and I have been working (with Gerard and Jon) on the Acceptance Testing Guide...and we released a beta.&amp;nbsp; (Grigori talks about it here: &lt;a href="http://blogs.msdn.com/agile/archive/2008/10/31/news-acceptance-test-engineering-guidance-beta1-and-other-great-releases.aspx"&gt;News: Acceptance Test Engineering Guidance BETA1&lt;/a&gt;, and the guide is under Releases here: &lt;a href="http://codeplex.com/TestingGuidance"&gt;http://codeplex.com/TestingGuidance&lt;/a&gt;).&amp;nbsp; We would appreciate feedback.&lt;/p&gt; &lt;p&gt;Unity 1.2 and Enterprise Library 4.1 were both released.&amp;nbsp; Way to go Chris, Grigori, and the rest of the team. (&lt;a href="http://blogs.msdn.com/agile/archive/2008/10/28/just-released-microsoft-enterprise-library-4-1-and-unity-1-2.aspx"&gt;Just Released: Microsoft Enterprise Library 4.1 and Unity 1.2&lt;/a&gt; and &lt;a href="http://www.tavaresstudios.com/Blog/post/And-were-live!-Entlib-41-and-Unity-12-are-released.aspx"&gt;And we're live! Entlib 4.1 and Unity 1.2 are released.&lt;/a&gt;)&amp;nbsp; Unity had some very neat (and hard to implement) stuff added to it in this release.&amp;nbsp; I know since I paired with Chris on a small part of re-work that allowed the Policy Injection Block functionality to be added.&amp;nbsp; This is a good, solid release of both projects.&lt;/p&gt; &lt;p&gt;p&amp;amp;p opened up the &lt;em&gt;patterns &amp;amp; practices&lt;/em&gt; &lt;a href="http://msdn.microsoft.com/en-us/dd128747.aspx"&gt;Agile Development Showcase&lt;/a&gt;, starting with a paper Ade wrote on &lt;strong&gt;&lt;a href="http://download.microsoft.com/download/4/4/a/44a2cebd-63fb-4379-898d-9cf24822c6cc/distributed_agile_development_at_microsoft_patterns_and_practices.pdf"&gt;Distributed Agile Development at Microsoft patterns &amp;amp; practices&lt;/a&gt;&lt;/strong&gt;.&amp;nbsp; I reviewed the paper and bounced ideas around with Ade.&amp;nbsp; The paper has a LOT of information and helpful hints. (Ade's blog post about it is here: &lt;a href="http://www.ademiller.com/blogs/tech/2008/10/patterns-practices-agile-showcase/"&gt;patterns &amp;amp; practices Agile Showcase&lt;/a&gt;)&lt;/p&gt; &lt;p&gt;The Redmond patterns &amp;amp; practices Summit is this week (&lt;a title="http://www.pnpsummit.com/" href="http://www.pnpsummit.com/"&gt;http://www.pnpsummit.com/&lt;/a&gt;).&amp;nbsp; I've got to prep for a talk tomorrow after being out for a week (fun).&amp;nbsp; Here are a few other random posts on the topic: &lt;a href="http://www.ademiller.com/blogs/tech/2008/11/patterns-practices-summit-in-redmond/"&gt;patterns &amp;amp; practices Summit in Redmond&lt;/a&gt;, &lt;a href="http://www.peterprovost.org/blog/post/Crazy-Times-Ahead-PDC-Pamp3bP-Summit-Tech-Ed-EMEA.aspx"&gt;Crazy Times Ahead - PDC, P&amp;amp;P Summit, Tech Ed EMEA&lt;/a&gt;).&amp;nbsp; The Summit is always fun, and I am looking forward to it.&lt;/p&gt; &lt;p&gt;After the Summit, I'll be ramping down on the Acceptance Testing project now that the Beta is out.&amp;nbsp; I will continue to work on it, just not as my primary focus, as it gets cleaned up, reviewed, re-worked, edited, etc.&amp;nbsp; I'll blog soon about my next challenge.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9034750" width="1" height="1"&gt;</content><author><name>mpuleio</name><uri>http://blogs.msdn.com/members/mpuleio.aspx</uri></author><category term="Agile" scheme="http://blogs.msdn.com/mpuleio/archive/tags/Agile/default.aspx" /><category term="patterns &amp;amp; practices" scheme="http://blogs.msdn.com/mpuleio/archive/tags/patterns+_2600_amp_3B00_+practices/default.aspx" /><category term="Unity" scheme="http://blogs.msdn.com/mpuleio/archive/tags/Unity/default.aspx" /><category term="Acceptance Test Engineering Guidance" scheme="http://blogs.msdn.com/mpuleio/archive/tags/Acceptance+Test+Engineering+Guidance/default.aspx" /><category term="Acceptance Testing" scheme="http://blogs.msdn.com/mpuleio/archive/tags/Acceptance+Testing/default.aspx" /></entry><entry><title>How to migrate from CAB/SCSF to Composite WPF</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/mpuleio/archive/2008/10/14/how-to-migrate-from-cab-scsf-to-composite-wpf.aspx" /><id>http://blogs.msdn.com/mpuleio/archive/2008/10/14/how-to-migrate-from-cab-scsf-to-composite-wpf.aspx</id><published>2008-10-14T20:12:10Z</published><updated>2008-10-14T20:12:10Z</updated><content type="html">&lt;p&gt;Blaine recently posted that there is a &lt;a target="_blank" href="http://blogs.msdn.com/blaine/archive/2008/09/30/cab-to-prism-comparison-available-on-codeplex.aspx"&gt;CAB to Prism Comparison Available on Codeplex&lt;/a&gt;.&amp;nbsp; This links to &lt;a target="_blank" href="http://www.codeplex.com/CompositeWPF/Release/ProjectReleases.aspx?ReleaseId=16941"&gt;Composite Application Guidance for CAB Developers&lt;/a&gt;, a download from the CompositeWPF community site.&lt;/p&gt; &lt;p&gt;While this document does not help you decide &lt;strong&gt;IF&lt;/strong&gt;[*]&lt;strong&gt; &lt;/strong&gt;you should switch from &lt;a target="_blank" href="http://www.codeplex.com/smartclient"&gt;CAB/SCSF&lt;/a&gt; to &lt;a target="_blank" href="http://www.codeplex.com/CompositeWPF"&gt;CompositeWPF&lt;/a&gt;, it does help with &lt;strong&gt;HOW&lt;/strong&gt;, the differences between the two coding models, where the WorkItem went, how to emulate the behavior of WorkItems, and a few other interesting things.&amp;nbsp; I&lt;em&gt;f you are a CAB developer considering the transition to WPF, you should definitely read this.&lt;/em&gt;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;[*] Deciding which to use should be fairly simple:&amp;nbsp; If you already know CAB/SCSF and you need to work in Windows Forms, stick with CAB/SCSF.&amp;nbsp; If you need to host some WPF widgets in a Windows Forms environment, use CAB/SCSF.&amp;nbsp; If you need a full WPF stack, use the Composite WPF guidance.&amp;nbsp; If you are not constrained by the technology choice, things get tricky and the decision should factor in a whole bunch of factors including (but not limited to) which framework you are more comfortable in, which your team is more comfortable with, and where you see future investments in technology going.&amp;nbsp; For each team/group/organization/company this is a different decision with different factors to consider.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8998323" width="1" height="1"&gt;</content><author><name>mpuleio</name><uri>http://blogs.msdn.com/members/mpuleio.aspx</uri></author><category term="patterns &amp;amp; practices" scheme="http://blogs.msdn.com/mpuleio/archive/tags/patterns+_2600_amp_3B00_+practices/default.aspx" /><category term="Smart Client Software Factory" scheme="http://blogs.msdn.com/mpuleio/archive/tags/Smart+Client+Software+Factory/default.aspx" /><category term="WPF" scheme="http://blogs.msdn.com/mpuleio/archive/tags/WPF/default.aspx" /><category term="Windows Forms" scheme="http://blogs.msdn.com/mpuleio/archive/tags/Windows+Forms/default.aspx" /></entry><entry><title>Finally, a common Service Locator</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/mpuleio/archive/2008/10/13/finally-a-common-service-locator.aspx" /><id>http://blogs.msdn.com/mpuleio/archive/2008/10/13/finally-a-common-service-locator.aspx</id><published>2008-10-13T20:03:57Z</published><updated>2008-10-13T20:03:57Z</updated><content type="html">&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;</content><author><name>mpuleio</name><uri>http://blogs.msdn.com/members/mpuleio.aspx</uri></author><category term="Development Tools" scheme="http://blogs.msdn.com/mpuleio/archive/tags/Development+Tools/default.aspx" /><category term="patterns &amp;amp; practices" scheme="http://blogs.msdn.com/mpuleio/archive/tags/patterns+_2600_amp_3B00_+practices/default.aspx" /><category term="C#" scheme="http://blogs.msdn.com/mpuleio/archive/tags/C_2300_/default.aspx" /><category term="Unity" scheme="http://blogs.msdn.com/mpuleio/archive/tags/Unity/default.aspx" /></entry><entry><title>Acceptance Test Engineering guide Alpha Available</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/mpuleio/archive/2008/08/27/acceptance-test-engineering-guide-alpha-available.aspx" /><id>http://blogs.msdn.com/mpuleio/archive/2008/08/27/acceptance-test-engineering-guide-alpha-available.aspx</id><published>2008-08-27T21:00:00Z</published><updated>2008-08-27T21:00:00Z</updated><content type="html">&lt;p&gt;Last night I posted the &lt;a href="http://www.codeplex.com/TestingGuidance/Release/ProjectReleases.aspx?ReleaseId=16696" target="_blank"&gt;Alpha version of &lt;em&gt;Acceptance Test Engineering guide - How to Decide if Software is Ready for You or Your Customer&lt;/em&gt;&lt;/a&gt;&lt;em&gt;&amp;nbsp;&lt;/em&gt;to the &lt;a href="http://www.codeplex.com/TestingGuidance" target="_blank"&gt;Acceptance Test Engineering CodePlex community site&lt;/a&gt;.&amp;nbsp; There are 300+ pages of content.&amp;nbsp; It is still a bit rough, has some gaps in it, and needs some work, but there is a lot of good information too.&amp;nbsp; &lt;/p&gt; &lt;p&gt;I would ask for some help from the public (developers, testers, PMs, and folks who act as customers or sponsor software projects): Read the &lt;a href="http://www.codeplex.com/TestingGuidance/Release/ProjectReleases.aspx?ReleaseId=16696" target="_blank"&gt;Alpha&lt;/a&gt; (or just part of it) and reply to the &lt;a href="http://www.codeplex.com/TestingGuidance/Thread/View.aspx?ThreadId=34340" target="_blank"&gt;Feedback Discussion&lt;/a&gt; with anything you think we got wrong, anything we got right, or anything we missed entirely.&amp;nbsp; Thanks.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8900963" width="1" height="1"&gt;</content><author><name>mpuleio</name><uri>http://blogs.msdn.com/members/mpuleio.aspx</uri></author><category term="Testing" scheme="http://blogs.msdn.com/mpuleio/archive/tags/Testing/default.aspx" /><category term="patterns &amp;amp; practices" scheme="http://blogs.msdn.com/mpuleio/archive/tags/patterns+_2600_amp_3B00_+practices/default.aspx" /><category term="Acceptance Test Engineering Guidance" scheme="http://blogs.msdn.com/mpuleio/archive/tags/Acceptance+Test+Engineering+Guidance/default.aspx" /></entry><entry><title>What is a "brown-bag talk"?</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/mpuleio/archive/2008/08/25/what-is-a-brown-bag-talk.aspx" /><id>http://blogs.msdn.com/mpuleio/archive/2008/08/25/what-is-a-brown-bag-talk.aspx</id><published>2008-08-25T19:20:56Z</published><updated>2008-08-25T19:20:56Z</updated><content type="html">&lt;p&gt;In past posts, and the recent &lt;a href="http://blogs.msdn.com/mpuleio/archive/2008/08/22/unit-testing-sharepoint.aspx"&gt;Unit testing SharePoint&lt;/a&gt; post, I have mentioned "brown-bag talks."&amp;nbsp; This has spurred emails from non-native English speakers asking me what in the heck a brown-bag talk is...&lt;/p&gt; &lt;p&gt;I am not sure if this is a Microsoft term, or a wider industry term (I think I remember it from my pre-MS employment, but that was a long time ago).&amp;nbsp; Either way, it is a meeting over lunch where one person presents something they found interesting.&amp;nbsp; The p&amp;amp;p dev team has organized a series of lunches every couple of weeks to talk about new and interesting technologies we are working with, and I have also seen brown-bag talks that cover just about any subject you can think of.... from reports about a conference someone just attended to a slide show about someone's vacation.&amp;nbsp; The "brown-bag" part of the name is an indication that even though the meeting is at lunch time, lunch is not provided and you need to bring your own lunch.&amp;nbsp; As a weird quirk of American culture, folks who bring their own lunch to work (rather than eating in the cafeteria or elsewhere) often carry it in a brown paper bag, hence the term.&lt;/p&gt; &lt;p&gt;Sorry about the confusion.&amp;nbsp; In the future, I'll try to explain colloquialisms or not use them at all.&amp;nbsp; &lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8894216" width="1" height="1"&gt;</content><author><name>mpuleio</name><uri>http://blogs.msdn.com/members/mpuleio.aspx</uri></author><category term="Non-Technical" scheme="http://blogs.msdn.com/mpuleio/archive/tags/Non-Technical/default.aspx" /></entry><entry><title>Unit testing SharePoint</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/mpuleio/archive/2008/08/22/unit-testing-sharepoint.aspx" /><id>http://blogs.msdn.com/mpuleio/archive/2008/08/22/unit-testing-sharepoint.aspx</id><published>2008-08-23T00:38:00Z</published><updated>2008-08-23T00:38:00Z</updated><content type="html">&lt;p&gt;&lt;a href="http://blogs.msdn.com/francischeung" target="_blank"&gt;Francis&lt;/a&gt; has an article on &lt;a href="http://blogs.msdn.com/francischeung/archive/2008/08/22/unit-testing-sharepoint-2007-applications.aspx" target="_blank"&gt;Unit Testing SharePoint 2007 Applications&lt;/a&gt;&lt;/p&gt; &lt;p&gt;He also did a brownbag talk on this yesterday, which was very interesting and brought up a few big challenges and ways to work around them.&lt;/p&gt; &lt;p&gt;Enjoy&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8888899" width="1" height="1"&gt;</content><author><name>mpuleio</name><uri>http://blogs.msdn.com/members/mpuleio.aspx</uri></author><category term="Example Driven Design (Formerly TDD)" scheme="http://blogs.msdn.com/mpuleio/archive/tags/Example+Driven+Design+_2800_Formerly+TDD_2900_/default.aspx" /><category term="Testing" scheme="http://blogs.msdn.com/mpuleio/archive/tags/Testing/default.aspx" /><category term="patterns &amp;amp; practices" scheme="http://blogs.msdn.com/mpuleio/archive/tags/patterns+_2600_amp_3B00_+practices/default.aspx" /><category term="ASP.NET" scheme="http://blogs.msdn.com/mpuleio/archive/tags/ASP.NET/default.aspx" /><category term="SharePoint" scheme="http://blogs.msdn.com/mpuleio/archive/tags/SharePoint/default.aspx" /></entry><entry><title>Guidance on SharePoint</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/mpuleio/archive/2008/08/13/guidance-on-sharepoint.aspx" /><id>http://blogs.msdn.com/mpuleio/archive/2008/08/13/guidance-on-sharepoint.aspx</id><published>2008-08-14T01:38:31Z</published><updated>2008-08-14T01:38:31Z</updated><content type="html">&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;</content><author><name>mpuleio</name><uri>http://blogs.msdn.com/members/mpuleio.aspx</uri></author><category term="Development Tools" scheme="http://blogs.msdn.com/mpuleio/archive/tags/Development+Tools/default.aspx" /><category term="patterns &amp;amp; practices" scheme="http://blogs.msdn.com/mpuleio/archive/tags/patterns+_2600_amp_3B00_+practices/default.aspx" /><category term="Web Client Software Factory" scheme="http://blogs.msdn.com/mpuleio/archive/tags/Web+Client+Software+Factory/default.aspx" /><category term="Smart Client Software Factory" scheme="http://blogs.msdn.com/mpuleio/archive/tags/Smart+Client+Software+Factory/default.aspx" /><category term="SharePoint" scheme="http://blogs.msdn.com/mpuleio/archive/tags/SharePoint/default.aspx" /></entry><entry><title>See Real Results With patterns &amp; practices</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/mpuleio/archive/2008/08/12/see-real-results-with-patterns-practices.aspx" /><id>http://blogs.msdn.com/mpuleio/archive/2008/08/12/see-real-results-with-patterns-practices.aspx</id><published>2008-08-13T01:38:43Z</published><updated>2008-08-13T01:38:43Z</updated><content type="html">&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;</content><author><name>mpuleio</name><uri>http://blogs.msdn.com/members/mpuleio.aspx</uri></author><category term="Development Tools" scheme="http://blogs.msdn.com/mpuleio/archive/tags/Development+Tools/default.aspx" /><category term="patterns &amp;amp; practices" scheme="http://blogs.msdn.com/mpuleio/archive/tags/patterns+_2600_amp_3B00_+practices/default.aspx" /></entry><entry><title>Acceptance Testing Guide Community Preview 2 Available!</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/mpuleio/archive/2008/08/04/acceptance-testing-guide-community-preview-2-available.aspx" /><id>http://blogs.msdn.com/mpuleio/archive/2008/08/04/acceptance-testing-guide-community-preview-2-available.aspx</id><published>2008-08-04T20:16:38Z</published><updated>2008-08-04T20:16:38Z</updated><content type="html">&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;</content><author><name>mpuleio</name><uri>http://blogs.msdn.com/members/mpuleio.aspx</uri></author><category term="Development Tools" scheme="http://blogs.msdn.com/mpuleio/archive/tags/Development+Tools/default.aspx" /><category term="Agile" scheme="http://blogs.msdn.com/mpuleio/archive/tags/Agile/default.aspx" /><category term="Testing" scheme="http://blogs.msdn.com/mpuleio/archive/tags/Testing/default.aspx" /><category term="patterns &amp;amp; practices" scheme="http://blogs.msdn.com/mpuleio/archive/tags/patterns+_2600_amp_3B00_+practices/default.aspx" /><category term="Acceptance Test Engineering Guidance" scheme="http://blogs.msdn.com/mpuleio/archive/tags/Acceptance+Test+Engineering+Guidance/default.aspx" /><category term="Acceptance Testing" scheme="http://blogs.msdn.com/mpuleio/archive/tags/Acceptance+Testing/default.aspx" /></entry><entry><title>Composite Application Guidance for WPF Shipped!</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/mpuleio/archive/2008/07/31/composite-application-guidance-for-wpf-shipped.aspx" /><id>http://blogs.msdn.com/mpuleio/archive/2008/07/31/composite-application-guidance-for-wpf-shipped.aspx</id><published>2008-07-31T20:26:13Z</published><updated>2008-07-31T20:26:13Z</updated><content type="html">&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;</content><author><name>mpuleio</name><uri>http://blogs.msdn.com/members/mpuleio.aspx</uri></author><category term="Development Tools" scheme="http://blogs.msdn.com/mpuleio/archive/tags/Development+Tools/default.aspx" /><category term="patterns &amp;amp; practices" scheme="http://blogs.msdn.com/mpuleio/archive/tags/patterns+_2600_amp_3B00_+practices/default.aspx" /><category term="Smart Client Software Factory" scheme="http://blogs.msdn.com/mpuleio/archive/tags/Smart+Client+Software+Factory/default.aspx" /><category term="C#" scheme="http://blogs.msdn.com/mpuleio/archive/tags/C_2300_/default.aspx" /><category term=".NET" scheme="http://blogs.msdn.com/mpuleio/archive/tags/.NET/default.aspx" /><category term="WPF" scheme="http://blogs.msdn.com/mpuleio/archive/tags/WPF/default.aspx" /></entry><entry><title>Proof of Concept: a simple DI solution for ASP.NET WebForms</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/mpuleio/archive/2008/07/17/proof-of-concept-a-simple-di-solution-for-asp-net-webforms.aspx" /><id>http://blogs.msdn.com/mpuleio/archive/2008/07/17/proof-of-concept-a-simple-di-solution-for-asp-net-webforms.aspx</id><published>2008-07-17T23:32:22Z</published><updated>2008-07-17T23:32:22Z</updated><content type="html">&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;</content><author><name>mpuleio</name><uri>http://blogs.msdn.com/members/mpuleio.aspx</uri></author><category term="Development Tools" scheme="http://blogs.msdn.com/mpuleio/archive/tags/Development+Tools/default.aspx" /><category term="patterns &amp;amp; practices" scheme="http://blogs.msdn.com/mpuleio/archive/tags/patterns+_2600_amp_3B00_+practices/default.aspx" /><category term="Web Client Software Factory" scheme="http://blogs.msdn.com/mpuleio/archive/tags/Web+Client+Software+Factory/default.aspx" /><category term="ASP.NET" scheme="http://blogs.msdn.com/mpuleio/archive/tags/ASP.NET/default.aspx" /><category term="C#" scheme="http://blogs.msdn.com/mpuleio/archive/tags/C_2300_/default.aspx" /><category term=".NET" scheme="http://blogs.msdn.com/mpuleio/archive/tags/.NET/default.aspx" /><category term="Unity" scheme="http://blogs.msdn.com/mpuleio/archive/tags/Unity/default.aspx" /></entry></feed>