<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.microsoft.co.il/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>I&amp;#39;m on a mission from God object : testability</title><link>http://blogs.microsoft.co.il/blogs/roadan/archive/tags/testability/default.aspx</link><description>Tags: testability</description><dc:language>en</dc:language><generator>CommunityServer 2007.1 (Build: 20917.1142)</generator><item><title>Improve WCF services testability with simple Dependency Injection</title><link>http://blogs.microsoft.co.il/blogs/roadan/archive/2012/01/30/improve-wcf-services-testability-with-simple-dependency-injection.aspx</link><pubDate>Mon, 30 Jan 2012 17:38:00 GMT</pubDate><guid isPermaLink="false">b5c4f5bc-c09b-4439-a595-91a98c1847df:1002247</guid><dc:creator>Yaniv Rodenski</dc:creator><slash:comments>5</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blogs.microsoft.co.il/blogs/roadan/rsscomments.aspx?PostID=1002247</wfw:commentRss><comments>http://blogs.microsoft.co.il/blogs/roadan/archive/2012/01/30/improve-wcf-services-testability-with-simple-dependency-injection.aspx#comments</comments><description>&lt;div class="wlWriterHeaderFooter" style="float:none;margin:0px;padding:4px 0px 4px 0px;"&gt;&lt;iframe src="http://www.facebook.com/widgets/like.php?href=http://blogs.microsoft.co.il/blogs/roadan/archive/2012/01/30/improve-wcf-services-testability-with-simple-dependency-injection.aspx" scrolling="no" frameborder="0" style="border:none;width:450px;height:80px;"&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/Dependency_injection" target="_blank"&gt;Dependency injection&lt;/a&gt; is a great technique to reduce coupling between components and improve testability. There are few techniques we can create dependency injections, you can use a framework like MEF or spring to Automate dependency injection but I personally favor &lt;strong&gt;manually injected dependencies&lt;/strong&gt;. call me old fashion, but I like creating object via simple constructor calls (most of the time).&lt;/p&gt;  &lt;p&gt;This is really straight forward most of the time but when dealing with WCF services there is a slight complexity to take in to consideration. In most scenarios WCF is in charge of instantiating the service class (the only exception here is with single instance context mode, where we can supply ServiceHost with a ready made instance of our service class).&lt;/p&gt;  &lt;p&gt;Lately I have come across a really cool (and simple) option in &lt;a href="http://wcf.codeplex.com/" target="_blank"&gt;WCF Web API&lt;/a&gt;. The WCF Web API supply an HttpConfiguration API that exposes a CreateInstance delegate we can use to manually create a new instance of our service class:&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:a38cc0bb-2192-4bdb-8f43-df672c591339" class="wlWriterSmartContent"&gt; &lt;div class="le-pavsc-container"&gt; &lt;div style="background-color:#ffffff;max-height:300px;overflow:auto;padding:2px 5px;white-space:nowrap;"&gt;&lt;span style="color:#2b91af;"&gt;HttpConfiguration&lt;/span&gt; config = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;HttpConfiguration&lt;/span&gt;();&lt;br /&gt; config.CreateInstance = (type, context, message) =&amp;gt;&lt;br /&gt; {&lt;br /&gt;     &lt;span style="color:#2b91af;"&gt;IPlayersDal&lt;/span&gt; dal = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;PlayersDal&lt;/span&gt;();&lt;br /&gt;     &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;PlayersCURD&lt;/span&gt;(dal);&lt;br /&gt; };&lt;br /&gt; &lt;br /&gt; &lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; factory = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;HttpServiceHostFactory&lt;/span&gt;() { Configuration = config };&lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;While this API is cool, it can only be used for http based services (using the WCF Web API). I really felt like using something like that in a SOAP based project I am currently working on so I figured what the hack, I can create the similar solution (source code can be found &lt;a href="https://skydrive.live.com/?cid=8de1cdea3626e8c0#cid=8DE1CDEA3626E8C0&amp;amp;id=8DE1CDEA3626E8C0!123" target="_blank"&gt;here&lt;/a&gt;) for any WCF service host out there.&lt;/p&gt;  &lt;p&gt;The first stop was creating an &lt;strong&gt;IExtension&amp;lt;ServiceHostBase&amp;gt;&lt;/strong&gt; that can transport the delegate down the WCF pipeline:&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:1ebd1c7d-9892-47d8-9ef6-f53a81271025" class="wlWriterSmartContent"&gt; &lt;div class="le-pavsc-container"&gt; &lt;div style="background-color:#ffffff;max-height:300px;overflow:auto;padding:2px 5px;white-space:nowrap;"&gt;&lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;InstanceInitializerExtension&lt;/span&gt; : &lt;span style="color:#2b91af;"&gt;IExtension&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af;"&gt;ServiceHostBase&lt;/span&gt;&amp;gt;&lt;br /&gt; {&lt;br /&gt;     &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;Func&lt;/span&gt;&amp;lt;&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt;&amp;gt; InstanceInitializer;&lt;br /&gt; &lt;br /&gt;     &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; Attach(&lt;span style="color:#2b91af;"&gt;ServiceHostBase&lt;/span&gt; owner)&lt;br /&gt;     {&lt;br /&gt;     }&lt;br /&gt; &lt;br /&gt;     &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; Detach(&lt;span style="color:#2b91af;"&gt;ServiceHostBase&lt;/span&gt; owner)&lt;br /&gt;     {&lt;br /&gt;     }&lt;br /&gt; }&lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Next we need to create an instance provider. this is the runtime component that WCF actually uses to create a new instance of the service class:&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:17808074-eb90-4ab4-a51a-ed49be8cec97" class="wlWriterSmartContent"&gt; &lt;div class="le-pavsc-container"&gt; &lt;div style="background-color:#ffffff;max-height:500px;overflow:auto;padding:2px 5px;white-space:nowrap;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ManualInstanceProvider&lt;/span&gt; : &lt;span style="color:#2b91af;"&gt;IInstanceProvider&lt;/span&gt;&lt;br /&gt; {&lt;br /&gt;     &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; GetInstance(&lt;span style="color:#2b91af;"&gt;InstanceContext&lt;/span&gt; instanceContext, &lt;span style="color:#2b91af;"&gt;Message&lt;/span&gt; message)&lt;br /&gt;     {&lt;br /&gt;         &lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; extension = instanceContext.Host.Extensions.Find&amp;lt;&lt;span style="color:#2b91af;"&gt;InstanceInitializerExtension&lt;/span&gt;&amp;gt;();&lt;br /&gt;         &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; extension.InstanceInitializer();&lt;br /&gt;     }&lt;br /&gt; &lt;br /&gt;     &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; GetInstance(System.ServiceModel.&lt;span style="color:#2b91af;"&gt;InstanceContext&lt;/span&gt; instanceContext)&lt;br /&gt;     {&lt;br /&gt;         &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; GetInstance(instanceContext, &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;);&lt;br /&gt;     }&lt;br /&gt; &lt;br /&gt;     &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; ReleaseInstance(System.ServiceModel.&lt;span style="color:#2b91af;"&gt;InstanceContext&lt;/span&gt; instanceContext, &lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; instance)&lt;br /&gt;     {&lt;br /&gt;     }&lt;br /&gt; }&lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;To hook the the ManualInstanceProvider we need to create a service behavior and implement the ApplyDispatchBehavior method like this:&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:fbbef6a2-40f8-487f-bf03-cd3cdb24d830" class="wlWriterSmartContent"&gt; &lt;div class="le-pavsc-container"&gt; &lt;div style="background-color:#ffffff;max-height:500px;overflow:auto;padding:2px 5px;white-space:nowrap;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; ApplyDispatchBehavior(&lt;span style="color:#2b91af;"&gt;ServiceDescription&lt;/span&gt; serviceDescription, &lt;span style="color:#2b91af;"&gt;ServiceHostBase&lt;/span&gt; serviceHostBase)&lt;br /&gt; {&lt;br /&gt;     &lt;span style="color:#0000ff;"&gt;foreach&lt;/span&gt; (&lt;span style="color:#2b91af;"&gt;ChannelDispatcherBase&lt;/span&gt; cdb &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; serviceHostBase.ChannelDispatchers)&lt;br /&gt;     {&lt;br /&gt;         &lt;span style="color:#2b91af;"&gt;ChannelDispatcher&lt;/span&gt; cd = cdb &lt;span style="color:#0000ff;"&gt;as&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ChannelDispatcher&lt;/span&gt;;&lt;br /&gt;         &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (cd != &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;)&lt;br /&gt;         {&lt;br /&gt;             &lt;span style="color:#0000ff;"&gt;foreach&lt;/span&gt; (&lt;span style="color:#2b91af;"&gt;EndpointDispatcher&lt;/span&gt; ed &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; cd.Endpoints)&lt;br /&gt;             {&lt;br /&gt;                 ed.DispatchRuntime.InstanceProvider = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ManualInstanceProvider&lt;/span&gt;();&lt;br /&gt;             }&lt;br /&gt;         }&lt;br /&gt;     }&lt;br /&gt; }&lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;The last thing we need to do is create an extension method for &lt;strong&gt;ServiceHostBase&lt;/strong&gt; that will allow setting the delegate as the factory function of our host:&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:95930096-9674-448d-8791-7ead0222f2d7" class="wlWriterSmartContent"&gt; &lt;div class="le-pavsc-container"&gt; &lt;div style="background-color:#ffffff;max-height:300px;overflow:auto;padding:2px 5px;white-space:nowrap;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; ConfigureInstanceFactory(&lt;span style="color:#0000ff;"&gt;this&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ServiceHostBase&lt;/span&gt; host, &lt;span style="color:#2b91af;"&gt;Func&lt;/span&gt;&amp;lt;&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt;&amp;gt; instanceInitializer)&lt;br /&gt; {&lt;br /&gt;     &lt;span style="color:#008000;"&gt;// adding a behavior that hocks up the ManualInstanceProvider&lt;/span&gt;&lt;br /&gt;     host.Description.Behaviors.Add(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;InstanceCreationBehavior&lt;/span&gt;());&lt;br /&gt; &lt;br /&gt;     &lt;span style="color:#008000;"&gt;// passing the instance initialize down the rabbit hole&lt;/span&gt;&lt;br /&gt;     host.Extensions.Add(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;InstanceInitializerExtension&lt;/span&gt; &lt;br /&gt;                             { InstanceInitializer = instanceInitializer });&lt;br /&gt; }&lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Now we are ready to create our service host:&lt;/p&gt;  &lt;div style="padding-bottom:0px;margin:0px;padding-left:0px;padding-right:0px;display:inline;float:none;padding-top:0px;" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:4acdced2-ae36-4afb-8d85-e5f0cd985078" class="wlWriterSmartContent"&gt; &lt;div class="le-pavsc-container"&gt; &lt;div style="background-color:#ffffff;max-height:500px;overflow:auto;padding:2px 5px;white-space:nowrap;"&gt;&lt;span style="color:#0000ff;"&gt;var&lt;/span&gt; host = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;ServiceHost&lt;/span&gt;(&lt;span style="color:#0000ff;"&gt;typeof&lt;/span&gt;(&lt;span style="color:#2b91af;"&gt;PlayersService&lt;/span&gt;));&lt;br /&gt; host.ConfigureInstanceFactory(() =&amp;gt; &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;PlayersService&lt;/span&gt;(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;PlayersDal&lt;/span&gt;()));&lt;br /&gt; &lt;br /&gt; host.Open();&lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;&lt;strong&gt;Summary&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Using dependency injection can some (if not most) of the time a simple task. Using this extension we can utilize whichever technique we choose.&lt;/p&gt;  &lt;p&gt;Yaniv&lt;/p&gt; &lt;a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fblogs.microsoft.co.il%2fblogs%2froadan%2farchive%2f2012%2f01%2f30%2fimprove-wcf-services-testability-with-simple-dependency-injection.aspx"&gt;&lt;img border="0" alt="kick it on DotNetKicks.com" src="http://www.dotnetkicks.com//Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fblogs.microsoft.co.il%2fblogs%2froadan%2farchive%2f2012%2f01%2f30%2fimprove-wcf-services-testability-with-simple-dependency-injection.aspx" /&gt;&lt;/a&gt; &lt;a href="http://dotnetshoutout.com/Improve-WCF-services-testability-with-simple-Dependency-Injection"&gt;&lt;img style="border-right-width:0px;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" alt="Shout it" src="http://dotnetshoutout.com/image.axd?url=http%3A%2F%2Fblogs.microsoft.co.il%2Fblogs%2Froadan%2Farchive%2F2012%2F01%2F30%2Fimprove-wcf-services-testability-with-simple-dependency-injection.aspx" /&gt;&lt;/a&gt;&lt;img src="http://blogs.microsoft.co.il/aggbug.aspx?PostID=1002247" width="1" height="1"&gt;</description><category domain="http://blogs.microsoft.co.il/blogs/roadan/archive/tags/DEV/default.aspx">DEV</category><category domain="http://blogs.microsoft.co.il/blogs/roadan/archive/tags/TDD/default.aspx">TDD</category><category domain="http://blogs.microsoft.co.il/blogs/roadan/archive/tags/WCF/default.aspx">WCF</category><category domain="http://blogs.microsoft.co.il/blogs/roadan/archive/tags/testability/default.aspx">testability</category><category domain="http://blogs.microsoft.co.il/blogs/roadan/archive/tags/Dependency+Injection/default.aspx">Dependency Injection</category></item></channel></rss>