<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" version="2.0">
  <channel>
    <title>ploeh blog - Services</title>
    <link>http://blog.ploeh.dk/</link>
    <description>Mark Seemann's .NET blog</description>
    <language>en-us</language>
    <copyright>Mark Seemann</copyright>
    <lastBuildDate>Tue, 18 May 2010 05:27:56 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 2.3.9074.18820</generator>
    <managingEditor>mark@seemann.ms</managingEditor>
    <webMaster>mark@seemann.ms</webMaster>
    <item>
      <trackback:ping>http://blog.ploeh.dk/Trackback.aspx?guid=f1a71969-0584-4a15-9395-9f2ac65f104b</trackback:ping>
      <pingback:server>http://blog.ploeh.dk/pingback.aspx</pingback:server>
      <pingback:target>http://blog.ploeh.dk/PermaLink,guid,f1a71969-0584-4a15-9395-9f2ac65f104b.aspx</pingback:target>
      <dc:creator>Mark Seemann</dc:creator>
      <wfw:comment>http://blog.ploeh.dk/CommentView,guid,f1a71969-0584-4a15-9395-9f2ac65f104b.aspx</wfw:comment>
      <wfw:commentRss>http://blog.ploeh.dk/SyndicationService.asmx/GetEntryCommentsRss?guid=f1a71969-0584-4a15-9395-9f2ac65f104b</wfw:commentRss>
      <slash:comments>6</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
One of Castle Windsor’s facilities addresses wiring up of WCF services. So far, the
sparse documentation for the WCF Facility seems to indicate <a href="http://www.castleproject.org/container/facilities/trunk/wcf/index.html">that
you have to configure your container in a global.asax</a>. That’s not much to my liking.
First of all, it reeks of ASP.NET, and secondly, it’s not going to work if you expose
WCF over protocols other than HTTP.
</p>
        <p>
However, now that we know that <a href="http://blog.ploeh.dk/2010/05/17/ServiceHostFactoryLifetime.aspx">a
custom ServiceHostFactory is effectively a Singleton</a>, a much better alternative
is to derive from the WCF Facility’s DefaultServiceHost class:
</p>
        <!--
{\rtf\ansi{\fonttbl{\f0 Consolas;}}{\colortbl;\red0\green0\blue255;\red43\green145\blue175;}\f0 \fs19 \cf1 public\cf0  \cf1 class\cf0  \cf2 FooServiceHostFactory\cf0  : \par     \cf2 DefaultServiceHostFactory\cf0 \par \{\par     \cf1 public\cf0  FooServiceHostFactory()\par         : \cf1 base\cf0 (\cf2 FooServiceHostFactory\cf0 .CreateKernel())\par     \{\par     \}\par \par     \cf1 private\cf0  \cf1 static\cf0  \cf2 IKernel\cf0  CreateKernel()\par     \{\par         \cf1 var\cf0  container = \cf1 new\cf0  \cf2 WindsorContainer\cf0 ();\par \par         container.AddFacility&lt;\cf2 WcfFacility\cf0 &gt;();\par \par         container.Register(\cf2 Component\cf0 \par             .For&lt;\cf2 FooService\cf0 &gt;()\par             .LifeStyle.Transient);\par         container.Register(\cf2 Component\cf0 \par             .For&lt;\cf2 IBar\cf0 &gt;()\par             .ImplementedBy&lt;\cf2 Bar\cf0 &gt;());\par \par         \cf1 return\cf0  container.Kernel;\par     \}\par \}\par }
-->
        <div style="font-family: consolas; background: white; color: black; font-size: 10pt">
          <pre style="margin: 0px">
            <span style="color: blue">public</span>
            <span style="color: blue">class</span>
            <span style="color: #2b91af">FooServiceHostFactory</span> : </pre>
          <pre style="margin: 0px">    <span style="color: #2b91af">DefaultServiceHostFactory</span></pre>
          <pre style="margin: 0px">{</pre>
          <pre style="margin: 0px">    <span style="color: blue">public</span> FooServiceHostFactory()</pre>
          <pre style="margin: 0px">        : <span style="color: blue">base</span>(<span style="color: #2b91af">FooServiceHostFactory</span>.CreateKernel())</pre>
          <pre style="margin: 0px">    {</pre>
          <pre style="margin: 0px">    }</pre>
          <pre style="margin: 0px"> </pre>
          <pre style="margin: 0px">    <span style="color: blue">private</span><span style="color: blue">static</span><span style="color: #2b91af">IKernel</span> CreateKernel()</pre>
          <pre style="margin: 0px">    {</pre>
          <pre style="margin: 0px">        <span style="color: blue">var</span> container
= <span style="color: blue">new</span><span style="color: #2b91af">WindsorContainer</span>();</pre>
          <pre style="margin: 0px"> </pre>
          <pre style="margin: 0px">        container.AddFacility&lt;<span style="color: #2b91af">WcfFacility</span>&gt;();</pre>
          <pre style="margin: 0px"> </pre>
          <pre style="margin: 0px">        container.Register(<span style="color: #2b91af">Component</span></pre>
          <pre style="margin: 0px">            .For&lt;<span style="color: #2b91af">FooService</span>&gt;()</pre>
          <pre style="margin: 0px">            .LifeStyle.Transient);</pre>
          <pre style="margin: 0px">        container.Register(<span style="color: #2b91af">Component</span></pre>
          <pre style="margin: 0px">            .For&lt;<span style="color: #2b91af">IBar</span>&gt;()</pre>
          <pre style="margin: 0px">            .ImplementedBy&lt;<span style="color: #2b91af">Bar</span>&gt;());</pre>
          <pre style="margin: 0px"> </pre>
          <pre style="margin: 0px">        <span style="color: blue">return</span> container.Kernel;</pre>
          <pre style="margin: 0px">    }</pre>
          <pre style="margin: 0px">}</pre>
        </div>
        <p>
Although it feels a little odd to create a container and then not really use it, but
only its Kernel property, this works like a charm. It correctly wires up this FooService:
</p>
        <!--
{\rtf\ansi{\fonttbl{\f0 Consolas;}}{\colortbl;\red0\green0\blue255;\red43\green145\blue175;\red163\green21\blue21;}\f0 \fs19 \cf1 public\cf0  \cf1 class\cf0  \cf2 FooService\cf0  : \cf2 IFooService\cf0 \par \{\par     \cf1 private\cf0  \cf1 readonly\cf0  \cf2 IBar\cf0  bar;\par \par     \cf1 public\cf0  FooService(\cf2 IBar\cf0  bar)\par     \{\par         \cf1 if\cf0  (bar == \cf1 null\cf0 )\par         \{\par             \cf1 throw\cf0  \cf1 new\cf0  \cf2 ArgumentNullException\cf0 (\cf3 "bar"\cf0 );\par         \}\par \par         \cf1 this\cf0 .bar = bar;\par     \}\par \par \cf1     #region\cf0  IFooService Members\par \par     \cf1 public\cf0  \cf1 string\cf0  Foo()\par     \{\par         \cf1 return\cf0  \cf1 this\cf0 .bar.Baz;\par     \}\par \par \cf1     #endregion\cf0 \par \}\par }
-->
        <div style="font-family: consolas; background: white; color: black; font-size: 10pt">
          <pre style="margin: 0px">
            <span style="color: blue">public</span>
            <span style="color: blue">class</span>
            <span style="color: #2b91af">FooService</span> : <span style="color: #2b91af">IFooService</span></pre>
          <pre style="margin: 0px">{</pre>
          <pre style="margin: 0px">    <span style="color: blue">private</span><span style="color: blue">readonly</span><span style="color: #2b91af">IBar</span> bar;</pre>
          <pre style="margin: 0px"> </pre>
          <pre style="margin: 0px">    <span style="color: blue">public</span> FooService(<span style="color: #2b91af">IBar</span> bar)</pre>
          <pre style="margin: 0px">    {</pre>
          <pre style="margin: 0px">        <span style="color: blue">if</span> (bar
== <span style="color: blue">null</span>)</pre>
          <pre style="margin: 0px">        {</pre>
          <pre style="margin: 0px">            <span style="color: blue">throw</span><span style="color: blue">new</span><span style="color: #2b91af">ArgumentNullException</span>(<span style="color: #a31515">"bar"</span>);</pre>
          <pre style="margin: 0px">        }</pre>
          <pre style="margin: 0px"> </pre>
          <pre style="margin: 0px">        <span style="color: blue">this</span>.bar
= bar;</pre>
          <pre style="margin: 0px">    }</pre>
          <pre style="margin: 0px"> </pre>
          <pre style="margin: 0px">
            <span style="color: blue">   
#region</span> IFooService Members</pre>
          <pre style="margin: 0px"> </pre>
          <pre style="margin: 0px">    <span style="color: blue">public</span><span style="color: blue">string</span> Foo()</pre>
          <pre style="margin: 0px">    {</pre>
          <pre style="margin: 0px">        <span style="color: blue">return</span><span style="color: blue">this</span>.bar.Baz;</pre>
          <pre style="margin: 0px">    }</pre>
          <pre style="margin: 0px"> </pre>
          <pre style="margin: 0px">
            <span style="color: blue">   
#endregion</span>
          </pre>
          <pre style="margin: 0px">}</pre>
        </div>
        <p>
However, instead of the static CreateKernel method that creates the IKernel instance, <a href="http://groups.google.com/group/castle-project-users/browse_thread/thread/5401a7189f8295af/2dabe6cbb3c63488?q=">I
suggest that the WCF Facility utilizes the Factory Method pattern</a>. As the WCF
Facility has not yet been released, perhaps there’s still time for that change.
</p>
        <p>
In any case, the WCF Facility saves you from writing a lot of infrastructure code
if you would like to wire your WCF services with Castle Windsor.
</p>
        <img width="0" height="0" src="http://blog.ploeh.dk/aggbug.ashx?id=f1a71969-0584-4a15-9395-9f2ac65f104b" />
      </body>
      <title>Sneak view at Castle’s WCF Facility</title>
      <guid isPermaLink="false">http://blog.ploeh.dk/PermaLink,guid,f1a71969-0584-4a15-9395-9f2ac65f104b.aspx</guid>
      <link>http://blog.ploeh.dk/2010/05/18/SneakViewAtCastlesWCFFacility.aspx</link>
      <pubDate>Tue, 18 May 2010 05:27:56 GMT</pubDate>
      <description>&lt;p&gt;
One of Castle Windsor’s facilities addresses wiring up of WCF services. So far, the
sparse documentation for the WCF Facility seems to indicate &lt;a href="http://www.castleproject.org/container/facilities/trunk/wcf/index.html"&gt;that
you have to configure your container in a global.asax&lt;/a&gt;. That’s not much to my liking.
First of all, it reeks of ASP.NET, and secondly, it’s not going to work if you expose
WCF over protocols other than HTTP.
&lt;/p&gt;
&lt;p&gt;
However, now that we know that &lt;a href="http://blog.ploeh.dk/2010/05/17/ServiceHostFactoryLifetime.aspx"&gt;a
custom ServiceHostFactory is effectively a Singleton&lt;/a&gt;, a much better alternative
is to derive from the WCF Facility’s DefaultServiceHost class:
&lt;/p&gt;
&lt;!--
{\rtf\ansi{\fonttbl{\f0 Consolas;}}{\colortbl;\red0\green0\blue255;\red43\green145\blue175;}\f0 \fs19 \cf1 public\cf0  \cf1 class\cf0  \cf2 FooServiceHostFactory\cf0  : \par     \cf2 DefaultServiceHostFactory\cf0 \par \{\par     \cf1 public\cf0  FooServiceHostFactory()\par         : \cf1 base\cf0 (\cf2 FooServiceHostFactory\cf0 .CreateKernel())\par     \{\par     \}\par \par     \cf1 private\cf0  \cf1 static\cf0  \cf2 IKernel\cf0  CreateKernel()\par     \{\par         \cf1 var\cf0  container = \cf1 new\cf0  \cf2 WindsorContainer\cf0 ();\par \par         container.AddFacility&amp;lt;\cf2 WcfFacility\cf0 &amp;gt;();\par \par         container.Register(\cf2 Component\cf0 \par             .For&amp;lt;\cf2 FooService\cf0 &amp;gt;()\par             .LifeStyle.Transient);\par         container.Register(\cf2 Component\cf0 \par             .For&amp;lt;\cf2 IBar\cf0 &amp;gt;()\par             .ImplementedBy&amp;lt;\cf2 Bar\cf0 &amp;gt;());\par \par         \cf1 return\cf0  container.Kernel;\par     \}\par \}\par }
--&gt;
&lt;div style="font-family: consolas; background: white; color: black; font-size: 10pt"&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;FooServiceHostFactory&lt;/span&gt; : &lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af"&gt;DefaultServiceHostFactory&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;{&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;public&lt;/span&gt; FooServiceHostFactory()&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : &lt;span style="color: blue"&gt;base&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;FooServiceHostFactory&lt;/span&gt;.CreateKernel())&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;private&lt;/span&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: #2b91af"&gt;IKernel&lt;/span&gt; CreateKernel()&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;var&lt;/span&gt; container
= &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;WindsorContainer&lt;/span&gt;();&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; container.AddFacility&amp;lt;&lt;span style="color: #2b91af"&gt;WcfFacility&lt;/span&gt;&amp;gt;();&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; container.Register(&lt;span style="color: #2b91af"&gt;Component&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .For&amp;lt;&lt;span style="color: #2b91af"&gt;FooService&lt;/span&gt;&amp;gt;()&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .LifeStyle.Transient);&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; container.Register(&lt;span style="color: #2b91af"&gt;Component&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .For&amp;lt;&lt;span style="color: #2b91af"&gt;IBar&lt;/span&gt;&amp;gt;()&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .ImplementedBy&amp;lt;&lt;span style="color: #2b91af"&gt;Bar&lt;/span&gt;&amp;gt;());&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;return&lt;/span&gt; container.Kernel;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
Although it feels a little odd to create a container and then not really use it, but
only its Kernel property, this works like a charm. It correctly wires up this FooService:
&lt;/p&gt;
&lt;!--
{\rtf\ansi{\fonttbl{\f0 Consolas;}}{\colortbl;\red0\green0\blue255;\red43\green145\blue175;\red163\green21\blue21;}\f0 \fs19 \cf1 public\cf0  \cf1 class\cf0  \cf2 FooService\cf0  : \cf2 IFooService\cf0 \par \{\par     \cf1 private\cf0  \cf1 readonly\cf0  \cf2 IBar\cf0  bar;\par \par     \cf1 public\cf0  FooService(\cf2 IBar\cf0  bar)\par     \{\par         \cf1 if\cf0  (bar == \cf1 null\cf0 )\par         \{\par             \cf1 throw\cf0  \cf1 new\cf0  \cf2 ArgumentNullException\cf0 (\cf3 "bar"\cf0 );\par         \}\par \par         \cf1 this\cf0 .bar = bar;\par     \}\par \par \cf1     #region\cf0  IFooService Members\par \par     \cf1 public\cf0  \cf1 string\cf0  Foo()\par     \{\par         \cf1 return\cf0  \cf1 this\cf0 .bar.Baz;\par     \}\par \par \cf1     #endregion\cf0 \par \}\par }
--&gt;
&lt;div style="font-family: consolas; background: white; color: black; font-size: 10pt"&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;FooService&lt;/span&gt; : &lt;span style="color: #2b91af"&gt;IFooService&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;{&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;private&lt;/span&gt; &lt;span style="color: blue"&gt;readonly&lt;/span&gt; &lt;span style="color: #2b91af"&gt;IBar&lt;/span&gt; bar;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;public&lt;/span&gt; FooService(&lt;span style="color: #2b91af"&gt;IBar&lt;/span&gt; bar)&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;if&lt;/span&gt; (bar
== &lt;span style="color: blue"&gt;null&lt;/span&gt;)&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px"&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;throw&lt;/span&gt; &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;ArgumentNullException&lt;/span&gt;(&lt;span style="color: #a31515"&gt;"bar"&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;this&lt;/span&gt;.bar
= bar;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;
#region&lt;/span&gt; IFooService Members&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; Foo()&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;return&lt;/span&gt; &lt;span style="color: blue"&gt;this&lt;/span&gt;.bar.Baz;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;
#endregion&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
However, instead of the static CreateKernel method that creates the IKernel instance, &lt;a href="http://groups.google.com/group/castle-project-users/browse_thread/thread/5401a7189f8295af/2dabe6cbb3c63488?q="&gt;I
suggest that the WCF Facility utilizes the Factory Method pattern&lt;/a&gt;. As the WCF
Facility has not yet been released, perhaps there’s still time for that change.
&lt;/p&gt;
&lt;p&gt;
In any case, the WCF Facility saves you from writing a lot of infrastructure code
if you would like to wire your WCF services with Castle Windsor.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.ploeh.dk/aggbug.ashx?id=f1a71969-0584-4a15-9395-9f2ac65f104b" /&gt;</description>
      <comments>http://blog.ploeh.dk/CommentView,guid,f1a71969-0584-4a15-9395-9f2ac65f104b.aspx</comments>
      <category>Castle Windsor</category>
      <category>Dependency Injection</category>
      <category>Services</category>
    </item>
    <item>
      <trackback:ping>http://blog.ploeh.dk/Trackback.aspx?guid=b0aa9448-ae3b-4b35-a897-54069e8a5c5f</trackback:ping>
      <pingback:server>http://blog.ploeh.dk/pingback.aspx</pingback:server>
      <pingback:target>http://blog.ploeh.dk/PermaLink,guid,b0aa9448-ae3b-4b35-a897-54069e8a5c5f.aspx</pingback:target>
      <dc:creator>Mark Seemann</dc:creator>
      <wfw:comment>http://blog.ploeh.dk/CommentView,guid,b0aa9448-ae3b-4b35-a897-54069e8a5c5f.aspx</wfw:comment>
      <wfw:commentRss>http://blog.ploeh.dk/SyndicationService.asmx/GetEntryCommentsRss?guid=b0aa9448-ae3b-4b35-a897-54069e8a5c5f</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
For a while I’ve been wondering about the lifetime behavior of custom <a href="http://msdn.microsoft.com/en-us/library/system.servicemodel.activation.servicehostfactory.aspx">ServiceHostFactory</a> classes
hosted in IIS. Does IIS create an instance per request? Or a single instance to handle
all requests?
</p>
        <p>
I decided to find out, so I wrote a little test service. The conclusion seems to be
that there is only a single instance that servers as a factory for all requests. This
is very fortunate, since it gives us an excellent place to host a DI Container. The
container can then manage the lifetime of all components, including Singletons that
will live for the duration of the process.
</p>
        <p>
If you are curious how I arrived at this conclusion, here’s the code I wrote. I started
out with this custom ServiceHostFactory:
</p>
        <!--
{\rtf\ansi{\fonttbl{\f0 Consolas;}}{\colortbl;\red0\green0\blue255;\red43\green145\blue175;}\f0 \fs19 \cf1 public\cf0  \cf1 class\cf0  \cf2 PocServiceHostFactory\cf0  : \cf2 ServiceHostFactory\cf0 \par \{\par     \cf1 private\cf0  \cf1 static\cf0  \cf1 int\cf0  number = 1;\par \par     \cf1 public\cf0  PocServiceHostFactory()\par     \{\par         \cf2 Interlocked\cf0 .Increment(\par             \cf1 ref\cf0  \cf2 PocServiceHostFactory\cf0 .number);\par     \}\par \par     \cf1 protected\cf0  \cf1 override\cf0  \cf2 ServiceHost\cf0  CreateServiceHost(\par         \cf2 Type\cf0  serviceType, \cf2 Uri\cf0 [] baseAddresses)\par     \{\par         \cf1 return\cf0  \cf1 new\cf0  \cf2 PocServiceHost\cf0 (\par             \cf2 PocServiceHostFactory\cf0 .number, serviceType,\par             baseAddresses);\par     \}\par \}\par }
-->
        <div style="font-family: consolas; background: white; color: black; font-size: 10pt">
          <pre style="margin: 0px">
            <span style="color: blue">public</span>
            <span style="color: blue">class</span>
            <span style="color: #2b91af">PocServiceHostFactory</span> : <span style="color: #2b91af">ServiceHostFactory</span></pre>
          <pre style="margin: 0px">{</pre>
          <pre style="margin: 0px">    <span style="color: blue">private</span><span style="color: blue">static</span><span style="color: blue">int</span> number
= 1;</pre>
          <pre style="margin: 0px"> </pre>
          <pre style="margin: 0px">    <span style="color: blue">public</span> PocServiceHostFactory()</pre>
          <pre style="margin: 0px">    {</pre>
          <pre style="margin: 0px">        <span style="color: #2b91af">Interlocked</span>.Increment(</pre>
          <pre style="margin: 0px">            <span style="color: blue">ref</span><span style="color: #2b91af">PocServiceHostFactory</span>.number);</pre>
          <pre style="margin: 0px">    }</pre>
          <pre style="margin: 0px"> </pre>
          <pre style="margin: 0px">    <span style="color: blue">protected</span><span style="color: blue">override</span><span style="color: #2b91af">ServiceHost</span> CreateServiceHost(</pre>
          <pre style="margin: 0px">        <span style="color: #2b91af">Type</span> serviceType, <span style="color: #2b91af">Uri</span>[]
baseAddresses)</pre>
          <pre style="margin: 0px">    {</pre>
          <pre style="margin: 0px">        <span style="color: blue">return</span><span style="color: blue">new</span><span style="color: #2b91af">PocServiceHost</span>(</pre>
          <pre style="margin: 0px">            <span style="color: #2b91af">PocServiceHostFactory</span>.number,
serviceType,</pre>
          <pre style="margin: 0px">            baseAddresses);</pre>
          <pre style="margin: 0px">    }</pre>
          <pre style="margin: 0px">}</pre>
        </div>
        <p>
The idea is that every time a new instance of ServiceHostFactory is created, the static
number is incremented.
</p>
        <p>
The PocServiceHostFactory just forwards the number to the PocServiceHost:
</p>
        <!--
{\rtf\ansi{\fonttbl{\f0 Consolas;}}{\colortbl;\red0\green0\blue255;\red43\green145\blue175;}\f0 \fs19 \cf1 public\cf0  \cf1 class\cf0  \cf2 PocServiceHost\cf0  : \cf2 ServiceHost\cf0 \par \{\par     \cf1 public\cf0  PocServiceHost(\cf1 int\cf0  number, \cf2 Type\cf0  serviceType,\par         \cf2 Uri\cf0 [] baseAddresses)\par         : \cf1 base\cf0 (serviceType, baseAddresses)\par     \{\par         \cf1 foreach\cf0  (\cf1 var\cf0  cd \cf1 in\cf0  \par             \cf1 this\cf0 .ImplementedContracts.Values)\par         \{\par             cd.Behaviors.Add(\par                 \cf1 new\cf0  \cf2 NumberServiceInstanceProvider\cf0 (\par                     number));\par         \}\par     \}\par \}\par }
-->
        <div style="font-family: consolas; background: white; color: black; font-size: 10pt">
          <pre style="margin: 0px">
            <span style="color: blue">public</span>
            <span style="color: blue">class</span>
            <span style="color: #2b91af">PocServiceHost</span> : <span style="color: #2b91af">ServiceHost</span></pre>
          <pre style="margin: 0px">{</pre>
          <pre style="margin: 0px">    <span style="color: blue">public</span> PocServiceHost(<span style="color: blue">int</span> number, <span style="color: #2b91af">Type</span> serviceType,</pre>
          <pre style="margin: 0px">        <span style="color: #2b91af">Uri</span>[]
baseAddresses)</pre>
          <pre style="margin: 0px">        : <span style="color: blue">base</span>(serviceType,
baseAddresses)</pre>
          <pre style="margin: 0px">    {</pre>
          <pre style="margin: 0px">        <span style="color: blue">foreach</span> (<span style="color: blue">var</span> cd <span style="color: blue">in</span></pre>
          <pre style="margin: 0px">            <span style="color: blue">this</span>.ImplementedContracts.Values)</pre>
          <pre style="margin: 0px">        {</pre>
          <pre style="margin: 0px">            cd.Behaviors.Add(</pre>
          <pre style="margin: 0px">                <span style="color: blue">new</span><span style="color: #2b91af">NumberServiceInstanceProvider</span>(</pre>
          <pre style="margin: 0px">                    number));</pre>
          <pre style="margin: 0px">        }</pre>
          <pre style="margin: 0px">    }</pre>
          <pre style="margin: 0px">}</pre>
        </div>
        <p>
The PocServiceHost just forwards the number to the NumberServiceInstanceProvider:
</p>
        <!--
{\rtf\ansi{\fonttbl{\f0 Consolas;}}{\colortbl;\red0\green0\blue255;\red43\green145\blue175;}\f0 \fs19 \cf1 public\cf0  \cf1 class\cf0  \cf2 NumberServiceInstanceProvider\cf0  : \par     \cf2 IInstanceProvider\cf0 , \cf2 IContractBehavior\cf0 \par \{\par     \cf1 private\cf0  \cf1 readonly\cf0  \cf1 int\cf0  number;\par \par     \cf1 public\cf0  NumberServiceInstanceProvider(\cf1 int\cf0  number)\par     \{\par         \cf1 this\cf0 .number = number;\par     \}\par \par \cf1     #region\cf0  IInstanceProvider Members\par \par     \cf1 public\cf0  \cf1 object\cf0  GetInstance(\par         \cf2 InstanceContext\cf0  instanceContext,\par         \cf2 Message\cf0  message)\par     \{\par         \cf1 return\cf0  \cf1 this\cf0 .GetInstance(instanceContext);\par     \}\par \par     \cf1 public\cf0  \cf1 object\cf0  GetInstance(\par         \cf2 InstanceContext\cf0  instanceContext)\par     \{\par         \cf1 return\cf0  \cf1 new\cf0  \cf2 NumberService\cf0 (\cf1 this\cf0 .number);\par     \}\par \par     \cf1 public\cf0  \cf1 void\cf0  ReleaseInstance(\par         \cf2 InstanceContext\cf0  instanceContext,\par         \cf1 object\cf0  instance)\par     \{\par     \}\par \par \cf1     #endregion\cf0 \par \par \cf1     #region\cf0  IContractBehavior Members\par \par     \cf1 public\cf0  \cf1 void\cf0  AddBindingParameters(\par         \cf2 ContractDescription\cf0  contractDescription,\par         \cf2 ServiceEndpoint\cf0  endpoint,\par         \cf2 BindingParameterCollection\cf0  bindingParameters)\par     \{\par     \}\par \par     \cf1 public\cf0  \cf1 void\cf0  ApplyClientBehavior(\par         \cf2 ContractDescription\cf0  contractDescription,\par         \cf2 ServiceEndpoint\cf0  endpoint,\par         \cf2 ClientRuntime\cf0  clientRuntime)\par     \{\par     \}\par \par     \cf1 public\cf0  \cf1 void\cf0  ApplyDispatchBehavior(\par         \cf2 ContractDescription\cf0  contractDescription,\par         \cf2 ServiceEndpoint\cf0  endpoint,\par         \cf2 DispatchRuntime\cf0  dispatchRuntime)\par     \{\par         dispatchRuntime.InstanceProvider = \cf1 this\cf0 ;\par     \}\par \par     \cf1 public\cf0  \cf1 void\cf0  Validate(\par         \cf2 ContractDescription\cf0  contractDescription,\par         \cf2 ServiceEndpoint\cf0  endpoint)\par     \{\par     \}\par \par \cf1     #endregion\cf0 \par \}\par }
-->
        <div style="font-family: consolas; background: white; color: black; font-size: 10pt">
          <pre style="margin: 0px">
            <span style="color: blue">public</span>
            <span style="color: blue">class</span>
            <span style="color: #2b91af">NumberServiceInstanceProvider</span> : </pre>
          <pre style="margin: 0px">    <span style="color: #2b91af">IInstanceProvider</span>, <span style="color: #2b91af">IContractBehavior</span></pre>
          <pre style="margin: 0px">{</pre>
          <pre style="margin: 0px">    <span style="color: blue">private</span><span style="color: blue">readonly</span><span style="color: blue">int</span> number;</pre>
          <pre style="margin: 0px"> </pre>
          <pre style="margin: 0px">    <span style="color: blue">public</span> NumberServiceInstanceProvider(<span style="color: blue">int</span> number)</pre>
          <pre style="margin: 0px">    {</pre>
          <pre style="margin: 0px">        <span style="color: blue">this</span>.number
= number;</pre>
          <pre style="margin: 0px">    }</pre>
          <pre style="margin: 0px"> </pre>
          <pre style="margin: 0px">
            <span style="color: blue">   
#region</span> IInstanceProvider Members</pre>
          <pre style="margin: 0px"> </pre>
          <pre style="margin: 0px">    <span style="color: blue">public</span><span style="color: blue">object</span> GetInstance(</pre>
          <pre style="margin: 0px">        <span style="color: #2b91af">InstanceContext</span> instanceContext,</pre>
          <pre style="margin: 0px">        <span style="color: #2b91af">Message</span> message)</pre>
          <pre style="margin: 0px">    {</pre>
          <pre style="margin: 0px">        <span style="color: blue">return</span><span style="color: blue">this</span>.GetInstance(instanceContext);</pre>
          <pre style="margin: 0px">    }</pre>
          <pre style="margin: 0px"> </pre>
          <pre style="margin: 0px">    <span style="color: blue">public</span><span style="color: blue">object</span> GetInstance(</pre>
          <pre style="margin: 0px">        <span style="color: #2b91af">InstanceContext</span> instanceContext)</pre>
          <pre style="margin: 0px">    {</pre>
          <pre style="margin: 0px">        <span style="color: blue">return</span><span style="color: blue">new</span><span style="color: #2b91af">NumberService</span>(<span style="color: blue">this</span>.number);</pre>
          <pre style="margin: 0px">    }</pre>
          <pre style="margin: 0px"> </pre>
          <pre style="margin: 0px">    <span style="color: blue">public</span><span style="color: blue">void</span> ReleaseInstance(</pre>
          <pre style="margin: 0px">        <span style="color: #2b91af">InstanceContext</span> instanceContext,</pre>
          <pre style="margin: 0px">        <span style="color: blue">object</span> instance)</pre>
          <pre style="margin: 0px">    {</pre>
          <pre style="margin: 0px">    }</pre>
          <pre style="margin: 0px"> </pre>
          <pre style="margin: 0px">
            <span style="color: blue">   
#endregion</span>
          </pre>
          <pre style="margin: 0px"> </pre>
          <pre style="margin: 0px">
            <span style="color: blue">   
#region</span> IContractBehavior Members</pre>
          <pre style="margin: 0px"> </pre>
          <pre style="margin: 0px">    <span style="color: blue">public</span><span style="color: blue">void</span> AddBindingParameters(</pre>
          <pre style="margin: 0px">        <span style="color: #2b91af">ContractDescription</span> contractDescription,</pre>
          <pre style="margin: 0px">        <span style="color: #2b91af">ServiceEndpoint</span> endpoint,</pre>
          <pre style="margin: 0px">        <span style="color: #2b91af">BindingParameterCollection</span> bindingParameters)</pre>
          <pre style="margin: 0px">    {</pre>
          <pre style="margin: 0px">    }</pre>
          <pre style="margin: 0px"> </pre>
          <pre style="margin: 0px">    <span style="color: blue">public</span><span style="color: blue">void</span> ApplyClientBehavior(</pre>
          <pre style="margin: 0px">        <span style="color: #2b91af">ContractDescription</span> contractDescription,</pre>
          <pre style="margin: 0px">        <span style="color: #2b91af">ServiceEndpoint</span> endpoint,</pre>
          <pre style="margin: 0px">        <span style="color: #2b91af">ClientRuntime</span> clientRuntime)</pre>
          <pre style="margin: 0px">    {</pre>
          <pre style="margin: 0px">    }</pre>
          <pre style="margin: 0px"> </pre>
          <pre style="margin: 0px">    <span style="color: blue">public</span><span style="color: blue">void</span> ApplyDispatchBehavior(</pre>
          <pre style="margin: 0px">        <span style="color: #2b91af">ContractDescription</span> contractDescription,</pre>
          <pre style="margin: 0px">        <span style="color: #2b91af">ServiceEndpoint</span> endpoint,</pre>
          <pre style="margin: 0px">        <span style="color: #2b91af">DispatchRuntime</span> dispatchRuntime)</pre>
          <pre style="margin: 0px">    {</pre>
          <pre style="margin: 0px">        dispatchRuntime.InstanceProvider = <span style="color: blue">this</span>;</pre>
          <pre style="margin: 0px">    }</pre>
          <pre style="margin: 0px"> </pre>
          <pre style="margin: 0px">    <span style="color: blue">public</span><span style="color: blue">void</span> Validate(</pre>
          <pre style="margin: 0px">        <span style="color: #2b91af">ContractDescription</span> contractDescription,</pre>
          <pre style="margin: 0px">        <span style="color: #2b91af">ServiceEndpoint</span> endpoint)</pre>
          <pre style="margin: 0px">    {</pre>
          <pre style="margin: 0px">    }</pre>
          <pre style="margin: 0px"> </pre>
          <pre style="margin: 0px">
            <span style="color: blue">   
#endregion</span>
          </pre>
          <pre style="margin: 0px">}</pre>
        </div>
        <p>
The relevant part of NumberServiceInstanceProvider is the GetInstanceMethod that simply
forwards the number to the NumberService:
</p>
        <!--
{\rtf\ansi{\fonttbl{\f0 Consolas;}}{\colortbl;\red0\green0\blue255;\red43\green145\blue175;}\f0 \fs19 \cf1 public\cf0  \cf1 class\cf0  \cf2 NumberService\cf0  : \cf2 INumberService\cf0 \par \{\par     \cf1 private\cf0  \cf1 readonly\cf0  \cf1 int\cf0  number;\par \par     \cf1 public\cf0  NumberService(\cf1 int\cf0  number)\par     \{\par         \cf1 this\cf0 .number = number;\par     \}\par \par \cf1     #region\cf0  INumberService Members\par \par     \cf1 public\cf0  \cf1 int\cf0  GetNumber()\par     \{\par         \cf1 return\cf0  \cf1 this\cf0 .number;\par     \}\par \par \cf1     #endregion\cf0 \par \}\par }
-->
        <div style="font-family: consolas; background: white; color: black; font-size: 10pt">
          <pre style="margin: 0px">
            <span style="color: blue">public</span>
            <span style="color: blue">class</span>
            <span style="color: #2b91af">NumberService</span> : <span style="color: #2b91af">INumberService</span></pre>
          <pre style="margin: 0px">{</pre>
          <pre style="margin: 0px">    <span style="color: blue">private</span><span style="color: blue">readonly</span><span style="color: blue">int</span> number;</pre>
          <pre style="margin: 0px"> </pre>
          <pre style="margin: 0px">    <span style="color: blue">public</span> NumberService(<span style="color: blue">int</span> number)</pre>
          <pre style="margin: 0px">    {</pre>
          <pre style="margin: 0px">        <span style="color: blue">this</span>.number
= number;</pre>
          <pre style="margin: 0px">    }</pre>
          <pre style="margin: 0px"> </pre>
          <pre style="margin: 0px">
            <span style="color: blue">   
#region</span> INumberService Members</pre>
          <pre style="margin: 0px"> </pre>
          <pre style="margin: 0px">    <span style="color: blue">public</span><span style="color: blue">int</span> GetNumber()</pre>
          <pre style="margin: 0px">    {</pre>
          <pre style="margin: 0px">        <span style="color: blue">return</span><span style="color: blue">this</span>.number;</pre>
          <pre style="margin: 0px">    }</pre>
          <pre style="margin: 0px"> </pre>
          <pre style="margin: 0px">
            <span style="color: blue">   
#endregion</span>
          </pre>
          <pre style="margin: 0px">}</pre>
        </div>
        <p>
As you can see, NumberService simply returns the injected number.
</p>
        <p>
The experiment is now to host NumberService in IIS using PocServiceHostFactory. If
there is only one ServiceHostFactory per application process, we would expect that
the same number (2) is returned every time we invoke the GetNumber operation. If,
on the other hand, a new instance of ServiceHostFactory is created per request, we
would expect the number to increase for every request.
</p>
        <p>
To test this I spun up a few instances of WcfTestClient.exe and invoked the operation.
It consistently returns <em>2</em> across multiple clients and multiple requests.
This supports the hypothesis that there is only one ServiceHostFactory per service
process.
</p>
        <img width="0" height="0" src="http://blog.ploeh.dk/aggbug.ashx?id=b0aa9448-ae3b-4b35-a897-54069e8a5c5f" />
      </body>
      <title>ServiceHostFactory lifetime</title>
      <guid isPermaLink="false">http://blog.ploeh.dk/PermaLink,guid,b0aa9448-ae3b-4b35-a897-54069e8a5c5f.aspx</guid>
      <link>http://blog.ploeh.dk/2010/05/17/ServiceHostFactoryLifetime.aspx</link>
      <pubDate>Mon, 17 May 2010 05:42:33 GMT</pubDate>
      <description>&lt;p&gt;
For a while I’ve been wondering about the lifetime behavior of custom &lt;a href="http://msdn.microsoft.com/en-us/library/system.servicemodel.activation.servicehostfactory.aspx"&gt;ServiceHostFactory&lt;/a&gt; classes
hosted in IIS. Does IIS create an instance per request? Or a single instance to handle
all requests?
&lt;/p&gt;
&lt;p&gt;
I decided to find out, so I wrote a little test service. The conclusion seems to be
that there is only a single instance that servers as a factory for all requests. This
is very fortunate, since it gives us an excellent place to host a DI Container. The
container can then manage the lifetime of all components, including Singletons that
will live for the duration of the process.
&lt;/p&gt;
&lt;p&gt;
If you are curious how I arrived at this conclusion, here’s the code I wrote. I started
out with this custom ServiceHostFactory:
&lt;/p&gt;
&lt;!--
{\rtf\ansi{\fonttbl{\f0 Consolas;}}{\colortbl;\red0\green0\blue255;\red43\green145\blue175;}\f0 \fs19 \cf1 public\cf0  \cf1 class\cf0  \cf2 PocServiceHostFactory\cf0  : \cf2 ServiceHostFactory\cf0 \par \{\par     \cf1 private\cf0  \cf1 static\cf0  \cf1 int\cf0  number = 1;\par \par     \cf1 public\cf0  PocServiceHostFactory()\par     \{\par         \cf2 Interlocked\cf0 .Increment(\par             \cf1 ref\cf0  \cf2 PocServiceHostFactory\cf0 .number);\par     \}\par \par     \cf1 protected\cf0  \cf1 override\cf0  \cf2 ServiceHost\cf0  CreateServiceHost(\par         \cf2 Type\cf0  serviceType, \cf2 Uri\cf0 [] baseAddresses)\par     \{\par         \cf1 return\cf0  \cf1 new\cf0  \cf2 PocServiceHost\cf0 (\par             \cf2 PocServiceHostFactory\cf0 .number, serviceType,\par             baseAddresses);\par     \}\par \}\par }
--&gt;
&lt;div style="font-family: consolas; background: white; color: black; font-size: 10pt"&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;PocServiceHostFactory&lt;/span&gt; : &lt;span style="color: #2b91af"&gt;ServiceHostFactory&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;{&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;private&lt;/span&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;int&lt;/span&gt; number
= 1;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;public&lt;/span&gt; PocServiceHostFactory()&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af"&gt;Interlocked&lt;/span&gt;.Increment(&lt;/pre&gt;&lt;pre style="margin: 0px"&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;ref&lt;/span&gt; &lt;span style="color: #2b91af"&gt;PocServiceHostFactory&lt;/span&gt;.number);&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;protected&lt;/span&gt; &lt;span style="color: blue"&gt;override&lt;/span&gt; &lt;span style="color: #2b91af"&gt;ServiceHost&lt;/span&gt; CreateServiceHost(&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af"&gt;Type&lt;/span&gt; serviceType, &lt;span style="color: #2b91af"&gt;Uri&lt;/span&gt;[]
baseAddresses)&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;return&lt;/span&gt; &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;PocServiceHost&lt;/span&gt;(&lt;/pre&gt;&lt;pre style="margin: 0px"&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;PocServiceHostFactory&lt;/span&gt;.number,
serviceType,&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; baseAddresses);&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
The idea is that every time a new instance of ServiceHostFactory is created, the static
number is incremented.
&lt;/p&gt;
&lt;p&gt;
The PocServiceHostFactory just forwards the number to the PocServiceHost:
&lt;/p&gt;
&lt;!--
{\rtf\ansi{\fonttbl{\f0 Consolas;}}{\colortbl;\red0\green0\blue255;\red43\green145\blue175;}\f0 \fs19 \cf1 public\cf0  \cf1 class\cf0  \cf2 PocServiceHost\cf0  : \cf2 ServiceHost\cf0 \par \{\par     \cf1 public\cf0  PocServiceHost(\cf1 int\cf0  number, \cf2 Type\cf0  serviceType,\par         \cf2 Uri\cf0 [] baseAddresses)\par         : \cf1 base\cf0 (serviceType, baseAddresses)\par     \{\par         \cf1 foreach\cf0  (\cf1 var\cf0  cd \cf1 in\cf0  \par             \cf1 this\cf0 .ImplementedContracts.Values)\par         \{\par             cd.Behaviors.Add(\par                 \cf1 new\cf0  \cf2 NumberServiceInstanceProvider\cf0 (\par                     number));\par         \}\par     \}\par \}\par }
--&gt;
&lt;div style="font-family: consolas; background: white; color: black; font-size: 10pt"&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;PocServiceHost&lt;/span&gt; : &lt;span style="color: #2b91af"&gt;ServiceHost&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;{&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;public&lt;/span&gt; PocServiceHost(&lt;span style="color: blue"&gt;int&lt;/span&gt; number, &lt;span style="color: #2b91af"&gt;Type&lt;/span&gt; serviceType,&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af"&gt;Uri&lt;/span&gt;[]
baseAddresses)&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; : &lt;span style="color: blue"&gt;base&lt;/span&gt;(serviceType,
baseAddresses)&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&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: blue"&gt;var&lt;/span&gt; cd &lt;span style="color: blue"&gt;in&lt;/span&gt; &lt;/pre&gt;&lt;pre style="margin: 0px"&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;this&lt;/span&gt;.ImplementedContracts.Values)&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cd.Behaviors.Add(&lt;/pre&gt;&lt;pre style="margin: 0px"&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;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;NumberServiceInstanceProvider&lt;/span&gt;(&lt;/pre&gt;&lt;pre style="margin: 0px"&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; number));&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
The PocServiceHost just forwards the number to the NumberServiceInstanceProvider:
&lt;/p&gt;
&lt;!--
{\rtf\ansi{\fonttbl{\f0 Consolas;}}{\colortbl;\red0\green0\blue255;\red43\green145\blue175;}\f0 \fs19 \cf1 public\cf0  \cf1 class\cf0  \cf2 NumberServiceInstanceProvider\cf0  : \par     \cf2 IInstanceProvider\cf0 , \cf2 IContractBehavior\cf0 \par \{\par     \cf1 private\cf0  \cf1 readonly\cf0  \cf1 int\cf0  number;\par \par     \cf1 public\cf0  NumberServiceInstanceProvider(\cf1 int\cf0  number)\par     \{\par         \cf1 this\cf0 .number = number;\par     \}\par \par \cf1     #region\cf0  IInstanceProvider Members\par \par     \cf1 public\cf0  \cf1 object\cf0  GetInstance(\par         \cf2 InstanceContext\cf0  instanceContext,\par         \cf2 Message\cf0  message)\par     \{\par         \cf1 return\cf0  \cf1 this\cf0 .GetInstance(instanceContext);\par     \}\par \par     \cf1 public\cf0  \cf1 object\cf0  GetInstance(\par         \cf2 InstanceContext\cf0  instanceContext)\par     \{\par         \cf1 return\cf0  \cf1 new\cf0  \cf2 NumberService\cf0 (\cf1 this\cf0 .number);\par     \}\par \par     \cf1 public\cf0  \cf1 void\cf0  ReleaseInstance(\par         \cf2 InstanceContext\cf0  instanceContext,\par         \cf1 object\cf0  instance)\par     \{\par     \}\par \par \cf1     #endregion\cf0 \par \par \cf1     #region\cf0  IContractBehavior Members\par \par     \cf1 public\cf0  \cf1 void\cf0  AddBindingParameters(\par         \cf2 ContractDescription\cf0  contractDescription,\par         \cf2 ServiceEndpoint\cf0  endpoint,\par         \cf2 BindingParameterCollection\cf0  bindingParameters)\par     \{\par     \}\par \par     \cf1 public\cf0  \cf1 void\cf0  ApplyClientBehavior(\par         \cf2 ContractDescription\cf0  contractDescription,\par         \cf2 ServiceEndpoint\cf0  endpoint,\par         \cf2 ClientRuntime\cf0  clientRuntime)\par     \{\par     \}\par \par     \cf1 public\cf0  \cf1 void\cf0  ApplyDispatchBehavior(\par         \cf2 ContractDescription\cf0  contractDescription,\par         \cf2 ServiceEndpoint\cf0  endpoint,\par         \cf2 DispatchRuntime\cf0  dispatchRuntime)\par     \{\par         dispatchRuntime.InstanceProvider = \cf1 this\cf0 ;\par     \}\par \par     \cf1 public\cf0  \cf1 void\cf0  Validate(\par         \cf2 ContractDescription\cf0  contractDescription,\par         \cf2 ServiceEndpoint\cf0  endpoint)\par     \{\par     \}\par \par \cf1     #endregion\cf0 \par \}\par }
--&gt;
&lt;div style="font-family: consolas; background: white; color: black; font-size: 10pt"&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;NumberServiceInstanceProvider&lt;/span&gt; : &lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af"&gt;IInstanceProvider&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;IContractBehavior&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;{&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;private&lt;/span&gt; &lt;span style="color: blue"&gt;readonly&lt;/span&gt; &lt;span style="color: blue"&gt;int&lt;/span&gt; number;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;public&lt;/span&gt; NumberServiceInstanceProvider(&lt;span style="color: blue"&gt;int&lt;/span&gt; number)&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;this&lt;/span&gt;.number
= number;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;
#region&lt;/span&gt; IInstanceProvider Members&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;object&lt;/span&gt; GetInstance(&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af"&gt;InstanceContext&lt;/span&gt; instanceContext,&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af"&gt;Message&lt;/span&gt; message)&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;return&lt;/span&gt; &lt;span style="color: blue"&gt;this&lt;/span&gt;.GetInstance(instanceContext);&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;object&lt;/span&gt; GetInstance(&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af"&gt;InstanceContext&lt;/span&gt; instanceContext)&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;return&lt;/span&gt; &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;NumberService&lt;/span&gt;(&lt;span style="color: blue"&gt;this&lt;/span&gt;.number);&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; ReleaseInstance(&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af"&gt;InstanceContext&lt;/span&gt; instanceContext,&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;object&lt;/span&gt; instance)&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;
#endregion&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;
#region&lt;/span&gt; IContractBehavior Members&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; AddBindingParameters(&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af"&gt;ContractDescription&lt;/span&gt; contractDescription,&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af"&gt;ServiceEndpoint&lt;/span&gt; endpoint,&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af"&gt;BindingParameterCollection&lt;/span&gt; bindingParameters)&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; ApplyClientBehavior(&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af"&gt;ContractDescription&lt;/span&gt; contractDescription,&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af"&gt;ServiceEndpoint&lt;/span&gt; endpoint,&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af"&gt;ClientRuntime&lt;/span&gt; clientRuntime)&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; ApplyDispatchBehavior(&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af"&gt;ContractDescription&lt;/span&gt; contractDescription,&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af"&gt;ServiceEndpoint&lt;/span&gt; endpoint,&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af"&gt;DispatchRuntime&lt;/span&gt; dispatchRuntime)&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dispatchRuntime.InstanceProvider = &lt;span style="color: blue"&gt;this&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; Validate(&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af"&gt;ContractDescription&lt;/span&gt; contractDescription,&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af"&gt;ServiceEndpoint&lt;/span&gt; endpoint)&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;
#endregion&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
The relevant part of NumberServiceInstanceProvider is the GetInstanceMethod that simply
forwards the number to the NumberService:
&lt;/p&gt;
&lt;!--
{\rtf\ansi{\fonttbl{\f0 Consolas;}}{\colortbl;\red0\green0\blue255;\red43\green145\blue175;}\f0 \fs19 \cf1 public\cf0  \cf1 class\cf0  \cf2 NumberService\cf0  : \cf2 INumberService\cf0 \par \{\par     \cf1 private\cf0  \cf1 readonly\cf0  \cf1 int\cf0  number;\par \par     \cf1 public\cf0  NumberService(\cf1 int\cf0  number)\par     \{\par         \cf1 this\cf0 .number = number;\par     \}\par \par \cf1     #region\cf0  INumberService Members\par \par     \cf1 public\cf0  \cf1 int\cf0  GetNumber()\par     \{\par         \cf1 return\cf0  \cf1 this\cf0 .number;\par     \}\par \par \cf1     #endregion\cf0 \par \}\par }
--&gt;
&lt;div style="font-family: consolas; background: white; color: black; font-size: 10pt"&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;NumberService&lt;/span&gt; : &lt;span style="color: #2b91af"&gt;INumberService&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;{&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;private&lt;/span&gt; &lt;span style="color: blue"&gt;readonly&lt;/span&gt; &lt;span style="color: blue"&gt;int&lt;/span&gt; number;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;public&lt;/span&gt; NumberService(&lt;span style="color: blue"&gt;int&lt;/span&gt; number)&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;this&lt;/span&gt;.number
= number;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;
#region&lt;/span&gt; INumberService Members&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;int&lt;/span&gt; GetNumber()&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;return&lt;/span&gt; &lt;span style="color: blue"&gt;this&lt;/span&gt;.number;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;
#endregion&lt;/span&gt;&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
As you can see, NumberService simply returns the injected number.
&lt;/p&gt;
&lt;p&gt;
The experiment is now to host NumberService in IIS using PocServiceHostFactory. If
there is only one ServiceHostFactory per application process, we would expect that
the same number (2) is returned every time we invoke the GetNumber operation. If,
on the other hand, a new instance of ServiceHostFactory is created per request, we
would expect the number to increase for every request.
&lt;/p&gt;
&lt;p&gt;
To test this I spun up a few instances of WcfTestClient.exe and invoked the operation.
It consistently returns &lt;em&gt;2&lt;/em&gt; across multiple clients and multiple requests.
This supports the hypothesis that there is only one ServiceHostFactory per service
process.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.ploeh.dk/aggbug.ashx?id=b0aa9448-ae3b-4b35-a897-54069e8a5c5f" /&gt;</description>
      <comments>http://blog.ploeh.dk/CommentView,guid,b0aa9448-ae3b-4b35-a897-54069e8a5c5f.aspx</comments>
      <category>Dependency Injection</category>
      <category>Services</category>
    </item>
    <item>
      <trackback:ping>http://blog.ploeh.dk/Trackback.aspx?guid=5c389092-f834-4882-b27d-73f5e6846d52</trackback:ping>
      <pingback:server>http://blog.ploeh.dk/pingback.aspx</pingback:server>
      <pingback:target>http://blog.ploeh.dk/PermaLink,guid,5c389092-f834-4882-b27d-73f5e6846d52.aspx</pingback:target>
      <dc:creator>Mark Seemann</dc:creator>
      <wfw:comment>http://blog.ploeh.dk/CommentView,guid,5c389092-f834-4882-b27d-73f5e6846d52.aspx</wfw:comment>
      <wfw:commentRss>http://blog.ploeh.dk/SyndicationService.asmx/GetEntryCommentsRss?guid=5c389092-f834-4882-b27d-73f5e6846d52</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <a href="http://danielfrost.dk/">Daniel Frost</a> has published a podcast where he
discusses WCF with me. It's about half an hour and in Danish. <a href="http://danielfrost.dk/post/Frosts-Podcast-Show-4-e28093-Mark-Seemann-om-WCF.aspx">Hear
it here</a>.
</p>
        <img width="0" height="0" src="http://blog.ploeh.dk/aggbug.ashx?id=5c389092-f834-4882-b27d-73f5e6846d52" />
      </body>
      <title>WCF Podcast with me</title>
      <guid isPermaLink="false">http://blog.ploeh.dk/PermaLink,guid,5c389092-f834-4882-b27d-73f5e6846d52.aspx</guid>
      <link>http://blog.ploeh.dk/2009/10/24/WCFPodcastWithMe.aspx</link>
      <pubDate>Sat, 24 Oct 2009 01:52:18 GMT</pubDate>
      <description>&lt;p&gt;
&lt;a href="http://danielfrost.dk/"&gt;Daniel Frost&lt;/a&gt; has published a podcast where he
discusses WCF with me. It's about half an hour and in Danish. &lt;a href="http://danielfrost.dk/post/Frosts-Podcast-Show-4-e28093-Mark-Seemann-om-WCF.aspx"&gt;Hear
it here&lt;/a&gt;.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.ploeh.dk/aggbug.ashx?id=5c389092-f834-4882-b27d-73f5e6846d52" /&gt;</description>
      <comments>http://blog.ploeh.dk/CommentView,guid,5c389092-f834-4882-b27d-73f5e6846d52.aspx</comments>
      <category>Miscellaneous</category>
      <category>Services</category>
    </item>
    <item>
      <trackback:ping>http://blog.ploeh.dk/Trackback.aspx?guid=7f180a32-fc1d-4322-a295-64cfc6996e80</trackback:ping>
      <pingback:server>http://blog.ploeh.dk/pingback.aspx</pingback:server>
      <pingback:target>http://blog.ploeh.dk/PermaLink,guid,7f180a32-fc1d-4322-a295-64cfc6996e80.aspx</pingback:target>
      <dc:creator>Mark Seemann</dc:creator>
      <wfw:comment>http://blog.ploeh.dk/CommentView,guid,7f180a32-fc1d-4322-a295-64cfc6996e80.aspx</wfw:comment>
      <wfw:commentRss>http://blog.ploeh.dk/SyndicationService.asmx/GetEntryCommentsRss?guid=7f180a32-fc1d-4322-a295-64cfc6996e80</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
About a year ago, one of my readers <a href="http://blogs.msdn.com/ploeh/archive/2008/05/01/DeclarativeUseOfCustomSecurityTokenParameters.aspx#8575741">asked
me about how to make custom tokens work over TPC</a> in WCF. Here's the question again:
</p>
        <p>
"i'm trying to implement the CustomToken over tcp. The original used the SymmetricSecurityBindingElement
and the transport http, this works fine, but when i change URI's and and the transport,
it gives an error saying: 
</p>
        <p>
"Binding 'CustomBinding' doesn't support creating any channel types. This often indicates
that the BindingElements in a CustomBinding have been stacked incorrectly or in the
wrong order. A Transport is required at the bottom of the stack. The recommended order
for BindingElements is: TransactionFlow, ReliableSession, Security, CompositeDuplex,
OneWay, StreamSecurity, MessageEncoding, Transport." 
</p>
        <p>
As it turns out, this seems to be a general issue with more transports than just TCP
– at least, I've seen the exact same behavior for the Named Pipes transport. 
</p>
        <p>
When I originally received the question, it seemed that no-one knew the answer, and
neither did I. Now, about a year later, I've managed to find a solution, and it's
really simple. 
</p>
        <p>
If you build up your CustomBinding in code, all you need to do is set the <a href="http://msdn.microsoft.com/en-us/library/microsoft.servicebus.channels.connectionorientedtransportbindingelement.transfermode.aspx">TransferMode</a> property
to <a href="http://msdn.microsoft.com/en-us/library/system.servicemodel.transfermode.aspx">Streamed</a>: 
</p>
        <p>
          <!--
{\rtf1\ansi\ansicpg\lang1024\noproof1252\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Courier New;}}{\colortbl;??\red0\green0\blue255;\red255\green255\blue255;\red0\green0\blue0;\red43\green145\blue175;}??\fs20 \cf1 var\cf0  pipeTransport = \cf1 new\cf0  \cf4 NamedPipeTransportBindingElement\cf0 ();\par ??pipeTransport.TransferMode = \cf4 TransferMode\cf0 .Streamed;}
-->
        </p>
        <div style="font-family: courier new; background: white; color: black; font-size: 10pt">
          <pre style="margin: 0px">
            <span style="color: blue">var</span> pipeTransport
= <span style="color: blue">new</span><span style="color: #2b91af">NamedPipeTransportBindingElement</span>();</pre>
          <pre style="margin: 0px">pipeTransport.TransferMode = <span style="color: #2b91af">TransferMode</span>.Streamed;</pre>
        </div>
        <p>
In this example, I'm setting the property on a Named Pipe transport, but you can do
exactly the same with a TCP transport.
</p>
        <p>
Although I wasn't able to find any documentation to that effect, experimentation seems
to indicate that you can also set the property in a .config file (at least, it works
on my computer):
</p>
        <!--
{\rtf1\ansi\ansicpg\lang1024\noproof65001\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Courier New;}}{\colortbl;??\red0\green0\blue255;\red255\green255\blue255;\red163\green21\blue21;\red255\green0\blue0;\red0\green0\blue0;}??\fs20 \cf1 &lt;\cf3 namedPipeTransport\cf1  \cf4 transferMode\cf1 =\cf0 "\cf1 Streamed\cf0 "\cf1  /&gt;}
-->
        <div style="font-family: courier new; background: white; color: black; font-size: 10pt">
          <pre style="margin: 0px">
            <span style="color: blue">&lt;</span>
            <span style="color: #a31515">namedPipeTransport</span>
            <span style="color: blue">
            </span>
            <span style="color: red">transferMode</span>
            <span style="color: blue">=</span>"<span style="color: blue">Streamed</span>"<span style="color: blue"> /&gt;</span></pre>
        </div>
        <p>
I will not claim that I fully understand this fix/workaround, or that it applies in
every situation, but I hope that it might prove helpful to some of my readers some
day.
</p>
        <img width="0" height="0" src="http://blog.ploeh.dk/aggbug.ashx?id=7f180a32-fc1d-4322-a295-64cfc6996e80" />
      </body>
      <title>Custom Tokens Over Non-HTTP Transports</title>
      <guid isPermaLink="false">http://blog.ploeh.dk/PermaLink,guid,7f180a32-fc1d-4322-a295-64cfc6996e80.aspx</guid>
      <link>http://blog.ploeh.dk/2009/06/22/CustomTokensOverNonHTTPTransports.aspx</link>
      <pubDate>Mon, 22 Jun 2009 19:48:42 GMT</pubDate>
      <description>&lt;p&gt;
About a year ago, one of my readers &lt;a href="http://blogs.msdn.com/ploeh/archive/2008/05/01/DeclarativeUseOfCustomSecurityTokenParameters.aspx#8575741"&gt;asked
me about how to make custom tokens work over TPC&lt;/a&gt; in WCF. Here's the question again:
&lt;/p&gt;
&lt;p&gt;
"i'm trying to implement the CustomToken over tcp. The original used the SymmetricSecurityBindingElement
and the transport http, this works fine, but when i change URI's and and the transport,
it gives an error saying: 
&lt;p&gt;
"Binding 'CustomBinding' doesn't support creating any channel types. This often indicates
that the BindingElements in a CustomBinding have been stacked incorrectly or in the
wrong order. A Transport is required at the bottom of the stack. The recommended order
for BindingElements is: TransactionFlow, ReliableSession, Security, CompositeDuplex,
OneWay, StreamSecurity, MessageEncoding, Transport." 
&lt;p&gt;
As it turns out, this seems to be a general issue with more transports than just TCP
– at least, I've seen the exact same behavior for the Named Pipes transport. 
&lt;p&gt;
When I originally received the question, it seemed that no-one knew the answer, and
neither did I. Now, about a year later, I've managed to find a solution, and it's
really simple. 
&lt;p&gt;
If you build up your CustomBinding in code, all you need to do is set the &lt;a href="http://msdn.microsoft.com/en-us/library/microsoft.servicebus.channels.connectionorientedtransportbindingelement.transfermode.aspx"&gt;TransferMode&lt;/a&gt; property
to &lt;a href="http://msdn.microsoft.com/en-us/library/system.servicemodel.transfermode.aspx"&gt;Streamed&lt;/a&gt;: 
&lt;p&gt;
&lt;!--
{\rtf1\ansi\ansicpg\lang1024\noproof1252\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Courier New;}}{\colortbl;??\red0\green0\blue255;\red255\green255\blue255;\red0\green0\blue0;\red43\green145\blue175;}??\fs20 \cf1 var\cf0  pipeTransport = \cf1 new\cf0  \cf4 NamedPipeTransportBindingElement\cf0 ();\par ??pipeTransport.TransferMode = \cf4 TransferMode\cf0 .Streamed;}
--&gt;
&lt;div style="font-family: courier new; background: white; color: black; font-size: 10pt"&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;var&lt;/span&gt; pipeTransport
= &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;NamedPipeTransportBindingElement&lt;/span&gt;();&lt;/pre&gt;&lt;pre style="margin: 0px"&gt;pipeTransport.TransferMode = &lt;span style="color: #2b91af"&gt;TransferMode&lt;/span&gt;.Streamed;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
In this example, I'm setting the property on a Named Pipe transport, but you can do
exactly the same with a TCP transport.
&lt;/p&gt;
&lt;p&gt;
Although I wasn't able to find any documentation to that effect, experimentation seems
to indicate that you can also set the property in a .config file (at least, it works
on my computer):
&lt;/p&gt;
&lt;!--
{\rtf1\ansi\ansicpg\lang1024\noproof65001\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Courier New;}}{\colortbl;??\red0\green0\blue255;\red255\green255\blue255;\red163\green21\blue21;\red255\green0\blue0;\red0\green0\blue0;}??\fs20 \cf1 &amp;lt;\cf3 namedPipeTransport\cf1  \cf4 transferMode\cf1 =\cf0 "\cf1 Streamed\cf0 "\cf1  /&amp;gt;}
--&gt;
&lt;div style="font-family: courier new; background: white; color: black; font-size: 10pt"&gt;&lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;namedPipeTransport&lt;/span&gt;&lt;span style="color: blue"&gt; &lt;/span&gt;&lt;span style="color: red"&gt;transferMode&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;Streamed&lt;/span&gt;"&lt;span style="color: blue"&gt; /&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
I will not claim that I fully understand this fix/workaround, or that it applies in
every situation, but I hope that it might prove helpful to some of my readers some
day.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://blog.ploeh.dk/aggbug.ashx?id=7f180a32-fc1d-4322-a295-64cfc6996e80" /&gt;</description>
      <comments>http://blog.ploeh.dk/CommentView,guid,7f180a32-fc1d-4322-a295-64cfc6996e80.aspx</comments>
      <category>Services</category>
    </item>
  </channel>
</rss>