<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.jeffreypalermo.com/~d/styles/itemcontent.css"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><title>Jeffrey Palermo (.com)</title><link>http://jeffreypalermo.com/</link><description>Chief Technology Officer, Headspring Systems</description><generator>Graffiti CMS 1.2 (build 1.2.0.2308)</generator><lastBuildDate>Tue, 09 Feb 2010 05:33:44 GMT</lastBuildDate><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.jeffreypalermo.com/jeffreypalermo" /><feedburner:info uri="jeffreypalermo" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><feedburner:emailServiceId>jeffreypalermo</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><item><title>Code Magazine article on ASP.NET MVC 2 source code download</title><link>http://feeds.jeffreypalermo.com/~r/jeffreypalermo/~3/FMbCZMTaw_Y/</link><pubDate>Tue, 09 Feb 2010 04:33:44 GMT</pubDate><guid isPermaLink="false">http://jeffreypalermo.com/blog/code-magazine-article-on-asp-net-mvc-2-source-code-download/</guid><dc:creator>Jeffrey Palermo</dc:creator><slash:comments>0</slash:comments><category domain="http://jeffreypalermo.com/blog/">Blog</category><description>&lt;p&gt;In the Nov/Dec 2009 issue of CODE Magazine, I submitted an article entitle “ASP.NET MVC 2 in Action”.&amp;#160; You can read the &lt;a href="http://www.code-magazine.com/Article.aspx?quickid=0911081"&gt;full article online here&lt;/a&gt;.&amp;#160; I wanted to write this short post to let the public know where to get the source code used for the article.&amp;#160; You can &lt;a href="http://palermo.googlecode.com/svn/ArticleCoDeMagazineDec2009/"&gt;download the code here&lt;/a&gt;.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.jeffreypalermo.com/~ff/jeffreypalermo?a=FMbCZMTaw_Y:Kq7OwzqwW3k:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jeffreypalermo?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.jeffreypalermo.com/~ff/jeffreypalermo?a=FMbCZMTaw_Y:Kq7OwzqwW3k:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jeffreypalermo?i=FMbCZMTaw_Y:Kq7OwzqwW3k:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/jeffreypalermo/~4/FMbCZMTaw_Y" height="1" width="1"/&gt;</description><feedburner:origLink>http://jeffreypalermo.com/blog/code-magazine-article-on-asp-net-mvc-2-source-code-download/</feedburner:origLink></item><item><title>Windows 7 brings new life to devices that don’t have Vista drivers</title><link>http://feeds.jeffreypalermo.com/~r/jeffreypalermo/~3/cPNLtU1iK74/</link><pubDate>Mon, 08 Feb 2010 02:28:14 GMT</pubDate><guid isPermaLink="false">http://jeffreypalermo.com/blog/windows-7-brings-new-life-to-devices-that-don-rsquo-t-have-vista-drivers/</guid><dc:creator>Jeffrey Palermo</dc:creator><slash:comments>2</slash:comments><category domain="http://jeffreypalermo.com/blog/">Blog</category><description>&lt;p&gt;&lt;a href="http://www.amazon.com/gp/product/B0007W2E64?ie=UTF8&amp;amp;tag=jeffreypalerm-20&amp;amp;link_code=as3&amp;amp;camp=211189&amp;amp;creative=373489&amp;amp;creativeASIN=B0007W2E64"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px" border="0" alt="MiniVox USB Speakerphone" align="right" src="http://ecx.images-amazon.com/images/I/312oRaaJMYL._SL500_AA280_.jpg" width="101" height="101" /&gt;&lt;/a&gt;Back in 2005, I purchased an &lt;a href="http://www.amazon.com/gp/product/B0007W2E64?ie=UTF8&amp;amp;tag=jeffreypalerm-20&amp;amp;link_code=as3&amp;amp;camp=211189&amp;amp;creative=373489&amp;amp;creativeASIN=B0007W2E64"&gt;mVox 100&lt;/a&gt; (mv100).&amp;#160; This device worked great on Windows XP, and I used it in various VOIP application.&amp;#160; Really great USB speakerphone.&amp;#160; It’s tiny, also, and I kept it tucked in my back for the last 5 years.&lt;/p&gt;  &lt;p&gt;When I upgraded my computer to Windows Vista, I was rather disappointed that this useful little device no longer worked.&lt;/p&gt;  &lt;p&gt;I could not find any Vista drivers.&amp;#160; From what I gleaned from forums, it relied on usbaudio.sys, which was overhauled in Windows Vista.&amp;#160; Even though I couldn’t use the device, it stayed in my computer bag for 2 years!&amp;#160; I switched computer bags today and uncovered this little speakerphone.&amp;#160; I decided to give it a shot on my Windows 7 computer.&amp;#160; Lo and behold, it worked!&amp;#160; No driver install.&amp;#160; I plugged it in, it detected it, and registered both the built-in microphone and sound card/speaker.&amp;#160; I happened to have Skype open, and Skype immediately registered the device as the microphone and speaker.&amp;#160; Bottom line:&amp;#160; &lt;strong&gt;I am impressed by Windows 7 once again!&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.amazon.com/gp/product/B000HCRVQ2?ie=UTF8&amp;amp;tag=jeffreypalerm-20&amp;amp;link_code=as3&amp;amp;camp=211189&amp;amp;creative=373489&amp;amp;creativeASIN=B000HCRVQ2"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px" title="image" border="0" alt="image" align="left" src="http://jeffreypalermo.com/files/media/image/WindowsLiveWriter/Windows7bringsnewlifetodevicesthatdontha_12018/image_3.png" width="103" height="59" /&gt;&lt;/a&gt; My mobile telephony kit now contains this &lt;a href="http://www.amazon.com/gp/product/B0007W2E64?ie=UTF8&amp;amp;tag=jeffreypalerm-20&amp;amp;link_code=as3&amp;amp;camp=211189&amp;amp;creative=373489&amp;amp;creativeASIN=B0007W2E64"&gt;mVox 100 USB speakerphone&lt;/a&gt; as well as my trusty &lt;a href="http://www.amazon.com/gp/product/B000HCRVQ2?ie=UTF8&amp;amp;tag=jeffreypalerm-20&amp;amp;link_code=as3&amp;amp;camp=211189&amp;amp;creative=373489&amp;amp;creativeASIN=B000HCRVQ2"&gt;Logitech notebook headset&lt;/a&gt;.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.jeffreypalermo.com/~ff/jeffreypalermo?a=cPNLtU1iK74:xY4ut0ti7Yo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jeffreypalermo?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.jeffreypalermo.com/~ff/jeffreypalermo?a=cPNLtU1iK74:xY4ut0ti7Yo:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jeffreypalermo?i=cPNLtU1iK74:xY4ut0ti7Yo:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/jeffreypalermo/~4/cPNLtU1iK74" height="1" width="1"/&gt;</description><feedburner:origLink>http://jeffreypalermo.com/blog/windows-7-brings-new-life-to-devices-that-don-rsquo-t-have-vista-drivers/</feedburner:origLink></item><item><title>IE, Firefox, Chrome, Safari, Opera – what browser does a .Net developer choose?</title><link>http://feeds.jeffreypalermo.com/~r/jeffreypalermo/~3/YVAyYbqMahk/</link><pubDate>Tue, 02 Feb 2010 15:30:57 GMT</pubDate><guid isPermaLink="false">http://jeffreypalermo.com/blog/ie-firefox-chrome-safari-opera-ndash-what-browser-does-a-net-developer-choose/</guid><dc:creator>Jeffrey Palermo</dc:creator><slash:comments>11</slash:comments><category domain="http://jeffreypalermo.com/blog/">Blog</category><description>&lt;p&gt;The short answer:&amp;#160; all of them.&lt;/p&gt;  &lt;p&gt;According to &lt;a href="http://marketshare.hitslink.com/browser-market-share.aspx?qprid=0"&gt;NetMarketShare&lt;/a&gt;, Internet Explorer still has, what is considered in politics, a 62.18% complete landslide domination of the other browsers.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://jeffreypalermo.com/files/media/image/WindowsLiveWriter/IEFirefoxChromeSafari.Netdeveloperchoose_85EB/image_4.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://jeffreypalermo.com/files/media/image/WindowsLiveWriter/IEFirefoxChromeSafari.Netdeveloperchoose_85EB/image_thumb_1.png" width="664" height="174" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;So we can read:&amp;#160; 62% IE, and 38% “not IE”.&amp;#160; But that doesn’t work in practice because the other 38% is fragmented among at least 4 other major players (major being defined as more than 1% market share, or about 17,300,000 installations).&amp;#160; Think about it.&amp;#160; Opera has over 41 MILLION users.&amp;#160; So that 2.38% is still not anything to sneeze at. . . unless you are serving the 1,075,714,000 IE users.&amp;#160; Wow.&amp;#160; over 1 billion Internet Explorer users.&amp;#160; (Internet stats from “&lt;a href="http://www.internetworldstats.com/emarketing.htm"&gt;Internet World Stats&lt;/a&gt;”)&lt;/p&gt;  &lt;p&gt;At &lt;a href="http://www.headspring.com/"&gt;Headspring&lt;/a&gt;, most of the current market wants a mix of web, windows, and mobile business applications with a heavy, heavy lean towards web applications.&amp;#160; As a Microsoft shop, ASP.NET is dominating the line-of-business space for us.&amp;#160; We have to decide which browsers to support (which really means which browsers to heavily test).&amp;#160; Yes, the client might have some browser preferences, but most of our clients trust us to do the right thing for them.&amp;#160; So what do we do, and what browser do “I” run?&amp;#160; See above (I run them all).&lt;/p&gt;  &lt;p&gt;First, we have to look at the base of users and what browser they are typically running.&amp;#160; A really popular combination is IE 7 and Firefox 2.&amp;#160; Yep.&amp;#160; Version numbers.&amp;#160; We have successfully deprecated IE 6 support down to the functional level (must work in IE 6, but visual discrepancies won’t be fixed) because clients have either migrated or they plan to migrate within a year, and we present the cost/benefit of the alternatives.&amp;#160; Any clients needing Chrome support?&amp;#160; Nope.&amp;#160; none.&amp;#160; not even a mention.&amp;#160; Now, in our experience, if a web application works properly in IE 7 AND Firefox 2, it is highly likely to be just fine in the other browsers.&lt;/p&gt;  &lt;p&gt;Now for me.&amp;#160; Yes, I run all the browsers, but I have chosen one for my day-to-day browsing needs.&amp;#160; That browser is Google Chrome 4.&amp;#160; Not Chrome 3 or 2.&amp;#160; But 4.&amp;#160; And it’s only today.&amp;#160; Why?&amp;#160; Because I think Microsoft is going to wake up and deliver a really killer Internet Explorer that will push it’s market share back to 90% in the coming years.&lt;/p&gt;  &lt;p&gt;Let me back up:&amp;#160; for running software applications, it is critical to use the browser that the client will be using (and if it requires a different version of IE, then just run it from Windows 7 XP Mode).&amp;#160; If your client is predominantly Firefox (like some timid IT departments now), then you must test your app predominantly in Firefox.&amp;#160; Same for IE.&amp;#160; Ignoring the dominant browser at your client is a really good recipe for obvious bugs to slip through.&lt;/p&gt;  &lt;p&gt;Now, why Google Chrome 4?&amp;#160; Because of the architecture of the browser coupled with new support for extensions.&amp;#160; Each tab runs in its own process.&amp;#160; This is critical because it delegate memory isolation and threading to the operation system instead of trying to manage them all within a single browser process.&amp;#160; Next is extensions.&amp;#160; First, and my favorite, is the IE Tab extension, ported from IE Tab as a Firefox extension.&amp;#160; It runs the page in the IE rendering engine but inside a Chrome tab (which is isolated to one process).&amp;#160; Note that this cannot fully replace actually TESTING with IE proper for your clients.&lt;/p&gt;  &lt;p&gt;Below is an image of two Chrome tabs.&amp;#160; The top is regular, and the bottom is with IE Tab.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://jeffreypalermo.com/files/media/image/WindowsLiveWriter/IEFirefoxChromeSafari.Netdeveloperchoose_85EB/image_2.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://jeffreypalermo.com/files/media/image/WindowsLiveWriter/IEFirefoxChromeSafari.Netdeveloperchoose_85EB/image_thumb.png" width="665" height="566" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;My next favorite extension is just named “&lt;a href="https://chrome.google.com/extensions/search?q=keyboard"&gt;Keyboard Navigation&lt;/a&gt;”.&amp;#160; It’s just like the really great Numbered Links Firefox extension that makes it possible to really browse the web without the mouse.&amp;#160; You press the comma(,) hotkey to pop up the shortcuts, then choose your link.&amp;#160; The enter key directs your browser to follow the link.&amp;#160; All while keeping your fingers on the home row.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://jeffreypalermo.com/files/media/image/WindowsLiveWriter/IEFirefoxChromeSafari.Netdeveloperchoose_85EB/image_6.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://jeffreypalermo.com/files/media/image/WindowsLiveWriter/IEFirefoxChromeSafari.Netdeveloperchoose_85EB/image_thumb_2.png" width="633" height="539" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;I don’t use IE and Firefox anymore for my normal browsing for one single reason:&amp;#160; The process architecture.&amp;#160; Having all the tabs in a single process produces a slow browsing experience (when contrasted with the alternative).&amp;#160; Does Chrome slurp up more memory?&amp;#160; Absolutely.&amp;#160; Here is a screen shot of all the processes.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://jeffreypalermo.com/files/media/image/WindowsLiveWriter/IEFirefoxChromeSafari.Netdeveloperchoose_85EB/image_8.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://jeffreypalermo.com/files/media/image/WindowsLiveWriter/IEFirefoxChromeSafari.Netdeveloperchoose_85EB/image_thumb_3.png" width="479" height="720" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;A quick glance produces over 500MB or RAM used just for the browser.&amp;#160; If I was worried about RAM (and willing to spend my time waiting in order to save RAM) I would probably make another decision.&amp;#160; But, when &lt;a href="http://jeffreypalermo.com/blog/hard-drive-is-officially-the-bottleneck-on-the-development-laptop/"&gt;all my guys are equipped with 8GB of RAM&lt;/a&gt; in the company computers, it’s just not a constraint to worry about.&lt;/p&gt;  &lt;p&gt;I’m not an &lt;a href="https://mvp.support.microsoft.com/communities/mvp.aspx?product=1&amp;amp;competency=Internet+Explorer"&gt;Internet Explorer MVP&lt;/a&gt;, so I don’t get early access to IE information and roadmap plans, but I do expect a big breakthrough on that front to be announced in 2010.&amp;#160; I think the sleeping browser giant is about to wake up.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.jeffreypalermo.com/~ff/jeffreypalermo?a=YVAyYbqMahk:4lqpRsvRXnA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jeffreypalermo?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.jeffreypalermo.com/~ff/jeffreypalermo?a=YVAyYbqMahk:4lqpRsvRXnA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jeffreypalermo?i=YVAyYbqMahk:4lqpRsvRXnA:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/jeffreypalermo/~4/YVAyYbqMahk" height="1" width="1"/&gt;</description><feedburner:origLink>http://jeffreypalermo.com/blog/ie-firefox-chrome-safari-opera-ndash-what-browser-does-a-net-developer-choose/</feedburner:origLink></item><item><title>AutoMapper hits 1.0!  Download now</title><link>http://feeds.jeffreypalermo.com/~r/jeffreypalermo/~3/OpSIF2FWQmM/</link><pubDate>Mon, 01 Feb 2010 23:09:05 GMT</pubDate><guid isPermaLink="false">http://jeffreypalermo.com/blog/automapper-hits-1-0-download-now/</guid><dc:creator>Jeffrey Palermo</dc:creator><slash:comments>0</slash:comments><category domain="http://jeffreypalermo.com/blog/">Blog</category><description>&lt;p&gt;&lt;a href="http://www.lostechies.com/blogs/jimmy_bogard/default.aspx"&gt;Jimmy Bogard&lt;/a&gt; just made the &lt;a href="http://www.lostechies.com/blogs/jimmy_bogard/archive/2010/02/01/automapper-1-0-rtw.aspx"&gt;announcement&lt;/a&gt; that &lt;a href="http://automapper.codeplex.com/"&gt;AutoMapper&lt;/a&gt; is now 1.0.&amp;#160; Babies grow up so fast.&amp;#160; Jimmy has cultivated this project since it’s infancy, although I think almost everyone from &lt;a href="http://www.headspring.com/"&gt;Headspring&lt;/a&gt; has at least one commit (I think I had a total of 3 commits, perhaps).&lt;/p&gt;  &lt;p&gt;Anyway, &lt;a href="http://automapper.codeplex.com/"&gt;go download and upgrade now&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;For those who don’t know, AutoMapper is an object-to-object mapper, and you can read more about it on the CodePlex documentation wiki as well as inside the book, &lt;a href="http://bit.ly/mvcinaction"&gt;ASP.NET MVC in Action&lt;/a&gt;.&amp;#160; AutoMapper is very, very useful when mapping from persistent objects to view model objects, but that is just one of the uses.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.jeffreypalermo.com/~ff/jeffreypalermo?a=OpSIF2FWQmM:0WN9a_I09cg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jeffreypalermo?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.jeffreypalermo.com/~ff/jeffreypalermo?a=OpSIF2FWQmM:0WN9a_I09cg:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jeffreypalermo?i=OpSIF2FWQmM:0WN9a_I09cg:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/jeffreypalermo/~4/OpSIF2FWQmM" height="1" width="1"/&gt;</description><feedburner:origLink>http://jeffreypalermo.com/blog/automapper-hits-1-0-download-now/</feedburner:origLink></item><item><title>Architecture Analysis: Onion Architecture webcast</title><link>http://feeds.jeffreypalermo.com/~r/jeffreypalermo/~3/IL9ElZSfhw4/</link><pubDate>Tue, 26 Jan 2010 20:38:43 GMT</pubDate><guid isPermaLink="false">http://jeffreypalermo.com/blog/architecture-analysis-onion-architecture-webcast/</guid><dc:creator>Jeffrey Palermo</dc:creator><slash:comments>5</slash:comments><category domain="http://jeffreypalermo.com/blog/">Blog</category><description>&lt;p&gt;Here is a portion of a webcast I did for the &lt;a href="http://www.iasahome.org/web/home/home"&gt;International Association of Software Architects&lt;/a&gt; (IASA).&amp;#160; There are more webcasts available on their website:&lt;/p&gt; &lt;object id="scPlayer" width="640" height="498"&gt; &lt;param name="movie" value="http://content.screencast.com/users/HeadspringSystems/folders/Community/media/828f0914-26ff-4b98-91a0-cf298abcab0a/Architecture%20Analysis%20Patterns_controller.swf"&gt;&lt;/param&gt; &lt;param name="quality" value="high"&gt;&lt;/param&gt; &lt;param name="bgcolor" value="#FFFFFF"&gt;&lt;/param&gt; &lt;param name="flashVars" value="thumb=http://content.screencast.com/users/HeadspringSystems/folders/Community/media/828f0914-26ff-4b98-91a0-cf298abcab0a/FirstFrame.png&amp;amp;containerwidth=640&amp;amp;containerheight=498&amp;amp;showstartscreen=true&amp;amp;showendscreen=true&amp;amp;loop=false&amp;amp;autostart=false&amp;amp;color=000000,000000&amp;amp;thumb=FirstFrame.png&amp;amp;thumbscale=45&amp;amp;content=http://content.screencast.com/users/HeadspringSystems/folders/Community/media/828f0914-26ff-4b98-91a0-cf298abcab0a/Architecture%20Analysis%20Patterns.mp4"&gt;&lt;/param&gt; &lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt; &lt;param name="scale" value="showall"&gt;&lt;/param&gt; &lt;param name="allowScriptAccess" value="always"&gt;&lt;/param&gt; &lt;param name="base" value="http://content.screencast.com/users/HeadspringSystems/folders/Community/media/828f0914-26ff-4b98-91a0-cf298abcab0a/"&gt;&lt;/param&gt;  &lt;embed src="http://content.screencast.com/users/HeadspringSystems/folders/Community/media/828f0914-26ff-4b98-91a0-cf298abcab0a/Architecture%20Analysis%20Patterns_controller.swf" quality="high" bgcolor="#FFFFFF" width="640" height="498" type="application/x-shockwave-flash" allowScriptAccess="always" flashVars="thumb=http://content.screencast.com/users/HeadspringSystems/folders/Community/media/828f0914-26ff-4b98-91a0-cf298abcab0a/FirstFrame.png&amp;containerwidth=640&amp;containerheight=498&amp;showstartscreen=true&amp;showendscreen=true&amp;loop=false&amp;autostart=false&amp;color=000000,000000&amp;thumb=FirstFrame.png&amp;thumbscale=45&amp;content=http://content.screencast.com/users/HeadspringSystems/folders/Community/media/828f0914-26ff-4b98-91a0-cf298abcab0a/Architecture%20Analysis%20Patterns.mp4" allowFullScreen="true" base="http://content.screencast.com/users/HeadspringSystems/folders/Community/media/828f0914-26ff-4b98-91a0-cf298abcab0a/" scale="showall"&gt;&lt;/embed&gt; &lt;/object&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.jeffreypalermo.com/~ff/jeffreypalermo?a=IL9ElZSfhw4:7zblrHM8Vuw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jeffreypalermo?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.jeffreypalermo.com/~ff/jeffreypalermo?a=IL9ElZSfhw4:7zblrHM8Vuw:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jeffreypalermo?i=IL9ElZSfhw4:7zblrHM8Vuw:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/jeffreypalermo/~4/IL9ElZSfhw4" height="1" width="1"/&gt;</description><feedburner:origLink>http://jeffreypalermo.com/blog/architecture-analysis-onion-architecture-webcast/</feedburner:origLink></item><item><title>My ASP.NET MVC in Action talk from Houston TechFest (webcast)</title><link>http://feeds.jeffreypalermo.com/~r/jeffreypalermo/~3/cgZ0_g1X3e8/</link><pubDate>Mon, 25 Jan 2010 22:02:00 GMT</pubDate><guid isPermaLink="false">http://jeffreypalermo.com/blog/my-asp-net-mvc-in-action-talk-from-houston-techfest-webcast/</guid><dc:creator>Jeffrey Palermo</dc:creator><slash:comments>4</slash:comments><category domain="http://jeffreypalermo.com/blog/">Blog</category><description>&lt;p&gt;Here is a talk I gave on 26 September 2009 at the Houston TechFest.&amp;#160; Thanks to &lt;a href="http://www.drowningintechnicaldebt.com/ShawnWeisfeld/archive/2009/10/15/ineta-live-recordings.aspx"&gt;Shawn Weisfeld&lt;/a&gt; for recording it!&lt;/p&gt; &lt;embed height="300" width="400" allowfullscreen="true" allowscriptaccess="always" type="application/x-shockwave-flash" src="http://blip.tv/play/hYpfgb_fSQA" /&gt;&lt;p&gt;&lt;/p&gt;&lt;/embed&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.jeffreypalermo.com/~ff/jeffreypalermo?a=cgZ0_g1X3e8:W0_KOQ9FnXY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jeffreypalermo?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.jeffreypalermo.com/~ff/jeffreypalermo?a=cgZ0_g1X3e8:W0_KOQ9FnXY:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jeffreypalermo?i=cgZ0_g1X3e8:W0_KOQ9FnXY:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/jeffreypalermo/~4/cgZ0_g1X3e8" height="1" width="1"/&gt;</description><feedburner:origLink>http://jeffreypalermo.com/blog/my-asp-net-mvc-in-action-talk-from-houston-techfest-webcast/</feedburner:origLink></item><item><title>Architecture Analysis Webcast 9am Friday</title><link>http://feeds.jeffreypalermo.com/~r/jeffreypalermo/~3/Ia2A7W-28gk/</link><pubDate>Fri, 22 Jan 2010 04:05:20 GMT</pubDate><guid isPermaLink="false">http://jeffreypalermo.com/blog/architecture-analysis-webcast-9am-friday/</guid><dc:creator>Jeffrey Palermo</dc:creator><slash:comments>6</slash:comments><category domain="http://jeffreypalermo.com/blog/">Blog</category><description>&lt;p&gt;The &lt;a href="http://www.iasahome.org/web/home/home"&gt;International Association of Software Architects&lt;/a&gt; is hosting a webcast Friday, January 22, 2010 at 9am.&amp;#160; You can register here:&amp;#160; &lt;a href="https://www2.gotomeeting.com/register/579164130"&gt;https://www2.gotomeeting.com/register/579164130&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;It will be a 1.5 hour talk about architecture, but specifically structure of an application.&amp;#160; Here are the full details:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Architecture Analysis - Reasoning About Structure&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;img src="https://www2.gotomeeting.com/default/images/1x1.gif" width="20" height="1" /&gt;&lt;/p&gt;  &lt;p&gt;&lt;img src="https://www2.gotomeeting.com/default/images/1x1.gif" width="20" height="1" /&gt;&lt;img src="https://www2.gotomeeting.com/default/images/1x1.gif" width="20" height="1" /&gt;    &lt;br /&gt;&lt;img style="display: inline; margin-left: 0px; margin-right: 0px" align="right" src="https://www2.gotomeeting.com/default/images/webinar/themes/business/defaultUserImage.jpg" width="160" height="160" /&gt;This presentation is about fundamentals. Layering is a basic concept of IT architecture. Layers help to seperate dependencies and to decouple concerns. Most of the industry does layering in name only. It's lip service. In these slides and accompanying commentary we will explore the concepts of layering and isolation of dependencies and it's impact on the success of your architecture.    &lt;br /&gt;&lt;img src="https://www2.gotomeeting.com/default/images/1x1.gif" width="20" height="1" /&gt;    &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;When:   &lt;br /&gt;Friday, January 22, 2010    &lt;br /&gt;9:00 AM - 10:30 AM CST&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.jeffreypalermo.com/~ff/jeffreypalermo?a=Ia2A7W-28gk:YcA59DSnws0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jeffreypalermo?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.jeffreypalermo.com/~ff/jeffreypalermo?a=Ia2A7W-28gk:YcA59DSnws0:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jeffreypalermo?i=Ia2A7W-28gk:YcA59DSnws0:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/jeffreypalermo/~4/Ia2A7W-28gk" height="1" width="1"/&gt;</description><feedburner:origLink>http://jeffreypalermo.com/blog/architecture-analysis-webcast-9am-friday/</feedburner:origLink></item><item><title>Constructor over-injection smell – follow up</title><link>http://feeds.jeffreypalermo.com/~r/jeffreypalermo/~3/GqD6Zq3tsXI/</link><pubDate>Thu, 21 Jan 2010 18:03:22 GMT</pubDate><guid isPermaLink="false">http://jeffreypalermo.com/blog/constructor-over-injection-smell-ndash-follow-up/</guid><dc:creator>Jeffrey Palermo</dc:creator><slash:comments>20</slash:comments><category domain="http://jeffreypalermo.com/blog/">Blog</category><description>&lt;p&gt;This is a follow up to my article: “&lt;a href="http://jeffreypalermo.com/blog/constructor-over-injection-anti-pattern/"&gt;Constructor over-injection anti-pattern&lt;/a&gt;”.&amp;#160; I’ve title this a bit differently because as with any heuristic, there are degrees of goodness and smelliness.&amp;#160; Constructor over-injection, therefore, is a code smell, I believe.&amp;#160; Without concrete do’s and don’ts, I believe it doesn’t deserve the explicit title of “anti-pattern”.&lt;/p&gt;  &lt;p&gt;I have expanded the code sample (and it is available as a &lt;a href="http://github.com/jeffreypalermo/DICodeSmells/archives/master"&gt;zip or tar file here&lt;/a&gt;).&lt;/p&gt;  &lt;p&gt;I’ve modified the OrderProcessor as shown here.&amp;#160; I believe this is more egregious and is more of an obvious example.&amp;#160; Small samples get so trivial, that the pain show doesn’t seem like a problem at all, but when injected constructor arguments increase (think 5, 10, 20), the pain is greater.&lt;/p&gt;  &lt;div class="csharpcode"&gt;   &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; DIAntiPattern&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;{&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; OrderProcessor : IOrderProcessor&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;    {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;readonly&lt;/span&gt; IOrderValidator _validator;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;readonly&lt;/span&gt; IAccountsReceivable _receivable;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;readonly&lt;/span&gt; IRateExchange _exchange;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;readonly&lt;/span&gt; IUserContext _userContext;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; OrderProcessor(IOrderValidator validator,&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;                              IAccountsReceivable receivable,&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;                              IRateExchange exchange, IUserContext userContext)&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;        {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;            _validator = validator;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;            _receivable = receivable;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;            _exchange = exchange;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;            _userContext = userContext;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;        }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; SuccessResult Process(Order order)&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;        {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;            &lt;span class="kwrd"&gt;bool&lt;/span&gt; isValid = _validator.Validate(order);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  23:  &lt;/span&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (isValid)&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  24:  &lt;/span&gt;            {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  25:  &lt;/span&gt;                Collect(order);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  26:  &lt;/span&gt;                IOrderShipper shipper = &lt;span class="kwrd"&gt;new&lt;/span&gt; OrderShipperFactory().GetDefault();&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  27:  &lt;/span&gt;                shipper.Ship(order);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  28:  &lt;/span&gt;            }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  29:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  30:  &lt;/span&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; CreateStatus(isValid);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  31:  &lt;/span&gt;        }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  32:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  33:  &lt;/span&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Collect(Order order)&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  34:  &lt;/span&gt;        {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  35:  &lt;/span&gt;            User user = _userContext.GetCurrentUser();&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  36:  &lt;/span&gt;            Price price = order.GetPrice(_exchange, _userContext);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  37:  &lt;/span&gt;            _receivable.Collect(user, price);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  38:  &lt;/span&gt;        }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  39:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  40:  &lt;/span&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; SuccessResult CreateStatus(&lt;span class="kwrd"&gt;bool&lt;/span&gt; isValid)&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  41:  &lt;/span&gt;        {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  42:  &lt;/span&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; isValid ? SuccessResult.Success : SuccessResult.Failed;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  43:  &lt;/span&gt;        }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  44:  &lt;/span&gt;    }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  45:  &lt;/span&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;Notice specifically that IRateExchange is NOT a dependency of OrderProcessor at all.&amp;#160; It is actually needed by an aggregate root, Order, so that it can do the price conversion based on exchange rates and prices.&amp;#160; This particular design attempted put put that logic as close to the domain model as possible (inside an aggregate).&amp;#160; This code works, but it requires the caller to pass through the dependency.&amp;#160; Here is the Order class:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; DIAntiPattern&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;{&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Order&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;    {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; DateTime Placed { get; set; }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; OtherInfo { get; set; }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; Price GetPrice(IRateExchange exchange, IUserContext userContext)&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;        {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;            User currentUser = userContext.GetCurrentUser();&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;            Currency currency = userContext.GetSelectedCurrency(currentUser);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;            &lt;span class="kwrd"&gt;int&lt;/span&gt; priceInSelectedCurrency = exchange.Convert(GetPrice(), currency);&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;            var price = &lt;span class="kwrd"&gt;new&lt;/span&gt; Price{Currency = currency, Value = priceInSelectedCurrency};&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; price;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;        }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; GetPrice()&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;        {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;            &lt;span class="rem"&gt;//do work to aggregate prices from line items, and total up order.&lt;/span&gt;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; 1000;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;        }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  23:  &lt;/span&gt;    }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  24:  &lt;/span&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;

&lt;p&gt;There are plenty of options to fix this code, and I’m sure you will comment on the one you prefer.&amp;#160; The SMELL here is constructor over-injection.&amp;#160; The injected dependency isn’t a dependency, and another dependency is sometimes a dependency of a particular supported operation of a class.&lt;/p&gt;

&lt;p&gt;However you fix this example, IRateExchange does not deserve to be constructor-injected into OrderProcessor.&amp;#160; Next, LineItem will need a dependency to calculate something, and then the dependency has to flow through from an object that is managed by the IoC container.&lt;/p&gt;

&lt;p&gt;IoC containers are just tools, but we still have to be careful of constructor over-injection.&amp;#160; &lt;/p&gt;

&lt;p&gt;I welcome the comments, and don’t forget to &lt;a href="http://github.com/jeffreypalermo/DICodeSmells/archives/master"&gt;&lt;strong&gt;download the code&lt;/strong&gt;&lt;/a&gt; (and fork it to post about your own counter example).&amp;#160; &lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.jeffreypalermo.com/~ff/jeffreypalermo?a=GqD6Zq3tsXI:WrW_ud8r-0Y:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jeffreypalermo?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.jeffreypalermo.com/~ff/jeffreypalermo?a=GqD6Zq3tsXI:WrW_ud8r-0Y:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jeffreypalermo?i=GqD6Zq3tsXI:WrW_ud8r-0Y:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/jeffreypalermo/~4/GqD6Zq3tsXI" height="1" width="1"/&gt;</description><feedburner:origLink>http://jeffreypalermo.com/blog/constructor-over-injection-smell-ndash-follow-up/</feedburner:origLink></item><item><title>Constructor over-injection anti-pattern</title><link>http://feeds.jeffreypalermo.com/~r/jeffreypalermo/~3/qjqsiaq66fo/</link><pubDate>Tue, 19 Jan 2010 22:28:00 GMT</pubDate><guid isPermaLink="false">http://jeffreypalermo.com/blog/constructor-over-injection-anti-pattern/</guid><dc:creator>Jeffrey Palermo</dc:creator><slash:comments>30</slash:comments><category domain="http://jeffreypalermo.com/blog/">Blog</category><description>&lt;p&gt;Check out&amp;nbsp;&lt;span class="Apple-style-span" style="background-color: rgb(255, 255, 255); "&gt;&lt;a href="http://jeffreypalermo.com/blog/constructor-over-injection-smell-ndash-follow-up/"&gt;http://jeffreypalermo.com/blog/constructor-over-injection-smell-ndash-follow-up/&lt;/a&gt;&amp;nbsp;for a follow-up&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m interested in structure.&amp;nbsp; We hear lots of talk about convention over configuration.&amp;nbsp; I&amp;rsquo;m all for structure over convention (over configuration).&amp;nbsp; This post is about laying out some code that is an anti-pattern.&amp;nbsp; It uses 100% constructor injection.&amp;nbsp; This code makes it easy for a container to bootstrap the construction of the objects, but let&amp;rsquo;s take a look at why this specific scenario is an anti-pattern and what design would be better.&lt;/p&gt;
&lt;h2&gt;Example&lt;/h2&gt;
&lt;p&gt;I have an order processing application that gets 10 orders at a time and tries to process them to shipping.&amp;nbsp; There are some validation steps, and then there is some work to ship the order.&amp;nbsp; Here is our Main() method:&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Main()&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;{&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;    DateTime startTime = DateTime.Now;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;    Console.WriteLine(&lt;span class="str"&gt;&amp;quot;Begin: &amp;quot;&lt;/span&gt; + startTime.TimeOfDay);&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;    IEnumerable&amp;lt;Order&amp;gt; orders = GetNextTenOrders();&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;    &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (var order &lt;span class="kwrd"&gt;in&lt;/span&gt; orders)&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;    {&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;        IOrderProcessor processor =&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;            ObjectFactory.GetInstance&amp;lt;IOrderProcessor&amp;gt;();&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;        SuccessResult successResult = processor.Process(order);&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt; (successResult == SuccessResult.Success)&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;        {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;            RecordSuccess(order);&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;            &lt;span class="kwrd"&gt;continue&lt;/span&gt;;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;        }&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;        ReportFailure(order);&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;    }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;    DateTime endTime = DateTime.Now;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;    Console.WriteLine(&lt;span class="str"&gt;&amp;quot;End:   &amp;quot;&lt;/span&gt; + endTime.TimeOfDay);&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;    Console.WriteLine(&lt;span class="str"&gt;&amp;quot;Total time: &amp;quot;&lt;/span&gt; + endTime.Subtract(startTime));&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  23:  &lt;/span&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;/p&gt;
&lt;p&gt;&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s just run it:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://jeffreypalermo.com/files/media/image/WindowsLiveWriter/ConstructorinjectionantipatternDIexample_E70F/image_2.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" width="468" height="203" src="http://jeffreypalermo.com/files/media/image/WindowsLiveWriter/ConstructorinjectionantipatternDIexample_E70F/image_thumb.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Hmm.&amp;nbsp; This little example code took over 7 seconds to run.&amp;nbsp; Given that I&amp;rsquo;ve stubbed out all implementations, it should just breeze through.&amp;nbsp; Here is the code of OrderProcessor, which is the class that is wired up to IOrderProcessor.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; OrderProcessor : IOrderProcessor&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;{&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;readonly&lt;/span&gt; IOrderValidator _validator;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;readonly&lt;/span&gt; IOrderShipper _shipper;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; OrderProcessor(IOrderValidator validator, IOrderShipper shipper)&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;    {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;        _validator = validator;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;        _shipper = shipper;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;    }&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; SuccessResult Process(Order order)&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;    {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;        &lt;span class="kwrd"&gt;bool&lt;/span&gt; isValid = _validator.Validate(order);&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt; (isValid)&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;        {&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;            _shipper.Ship(order);&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;        }&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;        &lt;span class="kwrd"&gt;return&lt;/span&gt; CreateStatus(isValid);&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;    }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  23:  &lt;/span&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; SuccessResult CreateStatus(&lt;span class="kwrd"&gt;bool&lt;/span&gt; isValid)&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  24:  &lt;/span&gt;    {&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  25:  &lt;/span&gt;        &lt;span class="kwrd"&gt;return&lt;/span&gt; isValid ? SuccessResult.Success : SuccessResult.Failed;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  26:  &lt;/span&gt;    }&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  27:  &lt;/span&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Ok.&amp;nbsp; Standard constructor injection.&amp;nbsp; The anti-pattern is that one of these constructor arguments is really not a class dependency.&amp;nbsp; The problem is that the constructor of OrderProcessor is too greedy.&amp;nbsp; It doesn&amp;rsquo;t need IOrderShipper all the time, but it requires it ALL THE TIME.&amp;nbsp; In fact, this company finds that 30% of orders are not valid the first time around.&amp;nbsp; This particular implementation if IOrderShipper is a little bit expensive to create (like ISessionFactory of NHibernate is expensive to create).&amp;nbsp; Forcing the creating when the false branch of the IF statement would render it useless is the smell.&lt;/p&gt;
&lt;p&gt;Just for transparency, here is OrderShipper:&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; OrderShipper : IOrderShipper&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;{&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; OrderShipper()&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;    {&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;        Thread.Sleep(TimeSpan.FromMilliseconds(777));&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;    }&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Ship(Order order)&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;    {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;        &lt;span class="rem"&gt;//ship the order&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;    }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;/p&gt;
&lt;p&gt;If you are truly coupling yourself to an abstraction (the interface), you should now care how the abstraction is implemented.&lt;/p&gt;
&lt;p&gt;You might say:&amp;nbsp; &amp;ldquo;What?&amp;nbsp; Just move that long-running work to the Ship()&lt;/p&gt;
&lt;p&gt;method!&amp;rdquo;&lt;/p&gt;
&lt;p&gt;I would agree with that if you were designing the OrderShipper class.&amp;nbsp; That only puts very elusive semantic coupling on all your classes.&amp;nbsp; What you are really assuming is:&amp;nbsp; I will code to interfaces. . . AND. . . as long as all of the implementations have constructors that don&amp;rsquo;t do much work, my whole application should work.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;I am not decrying constructor injection as a useful method.&amp;nbsp; In fact, we at &lt;a href="http://www.headspring.com/"&gt;Headspring&lt;/a&gt; do more constructor injection that abstract factory resolution.&amp;nbsp; However, constructor arguments are API artifacts that shout loudly: &amp;ldquo;I can do NOTHING unless you pass these things in.&amp;rdquo;&amp;nbsp; If that isn&amp;rsquo;t true, then don&amp;rsquo;t make the constructor announce a lie.&lt;/p&gt;
&lt;h2&gt;Cleaning up the smell&lt;/h2&gt;
&lt;p&gt;We can modify OrderProcessor to use an abstract factory and only require an IOrderShipper if the order is valid.&amp;nbsp; Here is the new run:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://jeffreypalermo.com/files/media/image/WindowsLiveWriter/ConstructorinjectionantipatternDIexample_E70F/image_4.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" width="434" height="201" src="http://jeffreypalermo.com/files/media/image/WindowsLiveWriter/ConstructorinjectionantipatternDIexample_E70F/image_thumb_1.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Down from 7 seconds to less than 1.&amp;nbsp; Why?&amp;nbsp; Because the invalid order did not need to be shipped.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Here is the new OrderProcessor:&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; OrderProcessor : IOrderProcessor&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;{&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;readonly&lt;/span&gt; IOrderValidator _validator;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; OrderProcessor(IOrderValidator validator)&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;    {&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;        _validator = validator;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;    }&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; SuccessResult Process(Order order)&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;    {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;        &lt;span class="kwrd"&gt;bool&lt;/span&gt; isValid = _validator.Validate(order);&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt; (isValid)&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;        {&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;            IOrderShipper shipper = &lt;span class="kwrd"&gt;new&lt;/span&gt; OrderShipperFactory().GetDefault();&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;            shipper.Ship(order);&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;        }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;        &lt;span class="kwrd"&gt;return&lt;/span&gt; CreateStatus(isValid);&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;    }&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; SuccessResult CreateStatus(&lt;span class="kwrd"&gt;bool&lt;/span&gt; isValid)&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  23:  &lt;/span&gt;    {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  24:  &lt;/span&gt;        &lt;span class="kwrd"&gt;return&lt;/span&gt; isValid ? SuccessResult.Success : SuccessResult.Failed;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  25:  &lt;/span&gt;    }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  26:  &lt;/span&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Because we don&amp;rsquo;t require any implementation of IOrderShipper (line 15) unless the order is valid, our code is simpler.&amp;nbsp; The class itself has 1 fewer class-level dependency, and only one method has the extra dependency.&amp;nbsp; We employ a new type, OrderShipperFactory&amp;nbsp; to keep the Inverted Control where OrderProcessor still doesn&amp;rsquo;t know the concrete implementation.&amp;nbsp; There is one more step because factories need start-up configuration.&amp;nbsp; If you are currently using an IoC container, you are familiar with start-up configuration because you configure the container&amp;rsquo;s global factory at start-up time.&amp;nbsp; Here is the code for the factory:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; OrderShipperFactory&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;{&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; Func&amp;lt;IOrderShipper&amp;gt; CreationClosure;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; IOrderShipper GetDefault()&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;    {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;        &lt;span class="kwrd"&gt;return&lt;/span&gt; CreationClosure();&lt;span class="rem"&gt;//executes closure&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;    }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;And here is the method that configures this factory at start-up time:&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; ConfigureFactories()&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;{&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;    OrderShipperFactory.CreationClosure =&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;        () =&amp;gt; ObjectFactory.GetInstance&amp;lt;IOrderShipper&amp;gt;();&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Notice that the IoC container is still in control over creating the concrete implementations, but the abstract factories keep the production code dependencies inverted without being greedy toward optional dependencies.&lt;/p&gt;
&lt;h2&gt;Counter Argument&lt;/h2&gt;
&lt;p&gt;Ok, well, then I&amp;rsquo;ll just create ONE factory like this and use it everywhere:&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; GenericFactory&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;{&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; Func&amp;lt;&lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt; CreationClosure;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; T GetDefault&amp;lt;T&amp;gt;()&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;    {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;        &lt;span class="kwrd"&gt;return&lt;/span&gt; (T) CreationClosure();&lt;span class="rem"&gt;//executes closure&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;    }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;This factory will ONLY work with an IoC container that has the same semantics as the one you are currently using.&amp;nbsp; For instance, you still need to unit test the code that uses the factory, so you will have to implement a stub for the factory (and unit tests don&amp;rsquo;t have expensive dependencies like IoC containers).&amp;nbsp; Bottom line:&amp;nbsp; this API is hard to implement by coding by hand.&amp;nbsp; Any API that is hard to implement is a bad API.&amp;nbsp; You want factories to be explicitly, and a method or class that can create anything????&lt;/p&gt;
&lt;p&gt;Hmm.&amp;nbsp; Isn&amp;rsquo;t that Activator.CreateInstance()?&amp;nbsp; But even that is limited because it doesn&amp;rsquo;t do constructor argument chaining.&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;Bottom Line&lt;/h2&gt;
&lt;p&gt;Architecture and structure are agnostic of tools.&amp;nbsp; IoC containers are just tools.&amp;nbsp; Your design should be robust with or WITHOUT them.&amp;nbsp; Taking away the IoC container should not make the structure of the application crumble.&lt;/p&gt;
&lt;p&gt;Why do we use an IoC container, then?&amp;nbsp; Because of the DRY Principle.&amp;nbsp; It keeps us from having to write lots of abstract factory implementations that are essentially the same except for one line.&amp;nbsp; It keeps each class from having a factory call from the no-arg constructor passing in the dependency to the greedy constructor.&amp;nbsp; IoC containers have limited the need for hand-coded factories, but they have not eliminated the need.&lt;/p&gt;
&lt;p&gt;The inspiration for this article came while I was sitting in a workshop where &lt;a href="http://mhinze.com/"&gt;Matt Hinze&lt;/a&gt; was teaching a class about Inversion of Control (one of the public workshops that &lt;a href="http://www.headspring.com/"&gt;Headspring&lt;/a&gt; puts on each month).&amp;nbsp; I thought about the response to &lt;a href="http://blog.objectmentor.com"&gt;Robert Martin&lt;/a&gt;&amp;rsquo;s &lt;a href="http://blog.objectmentor.com/articles/2010/01/17/dependency-injection-inversion"&gt;recent blog post&lt;/a&gt; (which I quite like).&amp;nbsp; Then a student in the class recalled a project where constructor injection was used everywhere.&amp;nbsp; They felt the pain that is sure to come from this constructor over-injection anti-pattern.&lt;/p&gt;
&lt;p&gt;One final word:&amp;nbsp; Don&amp;rsquo;t be in a hurry to agree or disagree with me.&amp;nbsp; Take the time to ponder.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;UPDATE: &lt;/strong&gt;Good discussion below. &amp;nbsp;I've expanded the code sample in an attempt to make this code smell more obvious (because in reality, we don't fret over 2 constructor arguments. &amp;nbsp;We fret about 5, 10, 20). &amp;nbsp;New post here:&amp;nbsp;&lt;span class="Apple-style-span" style="background-color: rgb(255, 255, 255); "&gt;&lt;a href="http://jeffreypalermo.com/blog/constructor-over-injection-smell-ndash-follow-up/"&gt;http://jeffreypalermo.com/blog/constructor-over-injection-smell-ndash-follow-up/&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.jeffreypalermo.com/~ff/jeffreypalermo?a=qjqsiaq66fo:kjxqnyaZj8A:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jeffreypalermo?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.jeffreypalermo.com/~ff/jeffreypalermo?a=qjqsiaq66fo:kjxqnyaZj8A:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jeffreypalermo?i=qjqsiaq66fo:kjxqnyaZj8A:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/jeffreypalermo/~4/qjqsiaq66fo" height="1" width="1"/&gt;</description><feedburner:origLink>http://jeffreypalermo.com/blog/constructor-over-injection-anti-pattern/</feedburner:origLink></item><item><title>Headspring MVC Boot Camp review</title><link>http://feeds.jeffreypalermo.com/~r/jeffreypalermo/~3/RZB6GTWneu8/</link><pubDate>Tue, 19 Jan 2010 16:36:28 GMT</pubDate><guid isPermaLink="false">http://jeffreypalermo.com/blog/headspring-mvc-boot-camp-review/</guid><dc:creator>Jeffrey Palermo</dc:creator><slash:comments>0</slash:comments><category domain="http://jeffreypalermo.com/blog/">Blog</category><description>&lt;p&gt;&lt;a href="http://www.lostechies.com/blogs/jimmy_bogard/default.aspx"&gt;Jimmy Bogard&lt;/a&gt; taught the last installment of &lt;a href="http://www.headspring.com/"&gt;Headspring&lt;/a&gt;’s &lt;a href="http://www.headspringsystems.com/services/agile-training/mvc-training/"&gt;ASP.NET MVC Boot Camp&lt;/a&gt; training class last week.&amp;#160; &lt;a href="http://charliesolomon.blogspot.com"&gt;Charlie Solomon&lt;/a&gt; wrote a &lt;a href="http://charliesolomon.blogspot.com/2010/01/mvc-bootcamp-takeaway.html"&gt;thorough review&lt;/a&gt; of the class.&amp;#160; It was a very interesting read.&amp;#160; Here is an excerpt:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;“Great training, I would highly recommend anything these guys offer. I enjoy a fast pace, hands on (lots of programming exercises) style of training, and that's what I got. Jimmy is a good teacher... I already knew that, since I've been reading his blog for the past year or so and I've picked up a lot a good pointers to things that help me in my work. He is also a good communicator teaching in front of a room full of diverse programmers. If you are new to MVC like I am, this course is great for introducing concepts that may be new to web forms programmers... but like the &lt;/em&gt;&lt;a href="http://www.amazon.com/ASP-Net-MVC-Action-Jeffrey-Palermo/dp/1933988622"&gt;&lt;em&gt;MVC book&lt;/em&gt;&lt;/a&gt;&lt;em&gt; that Jimmy co-authored, the class goes way beyond the introduction by showing how they leverage some of the features in MVC (ActionFilters and ResultFilters, HtmlTemplates, Model binding and validation...) to build applications quickly that are easier to maintain. We used the release candidate of &lt;/em&gt;&lt;a href="http://weblogs.asp.net/scottgu/archive/2010/01/10/asp-net-mvc-2.aspx"&gt;&lt;em&gt;ASP.Net MVC 2&lt;/em&gt;&lt;/a&gt;&lt;em&gt; in class.”&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.jeffreypalermo.com/~ff/jeffreypalermo?a=RZB6GTWneu8:c2VG2csgybc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jeffreypalermo?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.jeffreypalermo.com/~ff/jeffreypalermo?a=RZB6GTWneu8:c2VG2csgybc:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/jeffreypalermo?i=RZB6GTWneu8:c2VG2csgybc:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/jeffreypalermo/~4/RZB6GTWneu8" height="1" width="1"/&gt;</description><feedburner:origLink>http://jeffreypalermo.com/blog/headspring-mvc-boot-camp-review/</feedburner:origLink></item></channel></rss>
