<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>xlab &#187; Dependency Injection</title>
	<atom:link href="http://xlab.pl/tag/dependency-injection/feed/" rel="self" type="application/rss+xml" />
	<link>http://xlab.pl</link>
	<description>XSolve laboratory - dzielimy się tym co wiemy...</description>
	<lastBuildDate>Mon, 30 Aug 2010 07:34:03 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>pl</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>StructureMap: Wybieranie, który konstruktor ma zostać użyty</title>
		<link>http://xlab.pl/2009/09/structuremap-wybieranie-ktory-konstruktor-ma-zostac-uzyty/</link>
		<comments>http://xlab.pl/2009/09/structuremap-wybieranie-ktory-konstruktor-ma-zostac-uzyty/#comments</comments>
		<pubDate>Wed, 16 Sep 2009 15:45:24 +0000</pubDate>
		<dc:creator>Mateusz Kubiczek</dc:creator>
				<category><![CDATA[Programowanie .NET]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[Dependency Injection]]></category>
		<category><![CDATA[StructureMap]]></category>
		<category><![CDATA[wstrzykiwanie zależności]]></category>

		<guid isPermaLink="false">http://www.xlab.pl/?p=411</guid>
		<description><![CDATA[StructureMap to najstarszy framework dependency injection dla .NET. Jak łatwo się domyślić, używamy go w celu implementowania wstrzykiwania zależności (artykuł Martina Fowlera ).
Pewien czas temu chciałem użyć go wraz z WCF. Dla webserwisu ServerService WCF wygenerował interfejs IServerServicePortType oraz klienta ServerServicePortTypeClient. Konfiguracja tego webserwisu znajdowała się w pliku Web.config.
Zdefiniowałem regułę dla StructureMap:
ObjectFactory.Configure( x =&#62;
{
  [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://structuremap.sourceforge.net/Default.htm">StructureMap</a> to najstarszy framework dependency injection dla .NET. Jak łatwo się domyślić, używamy go w celu implementowania <a href="http://pl.wikipedia.org/wiki/Wstrzykiwanie_zale%C5%BCno%C5%9Bci">wstrzykiwania zależności</a> (<a href="http://martinfowler.com/articles/injection.html">artykuł Martina Fowlera </a>).</p>
<p>Pewien czas temu chciałem użyć go wraz z WCF. Dla webserwisu ServerService WCF wygenerował interfejs <strong>IServerServicePortType</strong> oraz klienta <strong>ServerServicePortTypeClient</strong>. Konfiguracja tego webserwisu znajdowała się w pliku Web.config.</p>
<p>Zdefiniowałem regułę dla StructureMap:</p>
<pre class="c-sharp">ObjectFactory.Configure( x =&gt;
{
   x.ForRequestedType&lt;<em>IServerServicePortType</em>&gt;().TheDefault
     .Is.OfConcreteType&lt;ServerServicePortTypeClient&gt;();
});</pre>
<p>która powinna spowodować, że pobranie za pomocą <strong>ObjectFactory.GetInstance&lt;IServerServicePortType&gt;()</strong> zwróci nam obiekt klienta.</p>
<p>Wszystko fajnie, tylko że StructureMap wybierał zły konstruktor tej klasy. Jako że konfiguracja znajdowała się w pliku Web.config, chciałem, żeby StructureMap tworzył klasę za pomocą konstruktora bezparametrowego &#8211; niestety próbował użyć innego, co powodowało błąd (brak argumentów dla tego konstruktora). Spójrzmy na wygenerowane konstruktory klasy <strong>ServerServicePortTypeClient</strong>:</p>
<pre class="c-sharp">public ServerServicePortTypeClient();
public ServerServicePortTypeClient(string endpointConfigurationName);
public ServerServicePortTypeClient(string endpointConfigurationName, string remoteAddress);
public ServerServicePortTypeClient(string endpointConfigurationName,
                             System.ServiceModel.EndpointAddress remoteAddress);
public ServerServicePortTypeClient(System.ServiceModel.Channels.Binding binding);</pre>
<p>Wykorzystywany był drugi z argumentem <strong>endpointConfigurationName</strong>.</p>
<p>Nie tego oczekiwałem. Logiczne było, że zostanie wybrany konstruktor najlepiej pasujący do podanych argumentów &#8211; czyli brak argumentów spowoduje wybranie bezargumentowego. :-) Po pewnym czasie znalazłem rozwiązanie na <a href="http://codebetter.com/blogs/jeremy.miller/archive/2009/01/07/choosing-the-constructor-function-in-structuremap-without-attributes.aspx">blogu autora StructureMap.</a></p>
<pre class="c-sharp">ObjectFactory.Configure( x =&gt;
{
   x.SelectConstructor( () =&gt; new SoapPortTypeClient());
   x.ForRequestedType().TheDefault.Is.OfConcreteType();
});</pre>
<p>Pierwsze wyrażenie jest co najmniej ciekawe &#8211; nie tworzymy tutaj obiektu, tylko definiujemy lambdę, z której następne StructureMap odczyta, jakiego konstruktora powinien uzyć. Sprytne!</p>
]]></content:encoded>
			<wfw:commentRss>http://xlab.pl/2009/09/structuremap-wybieranie-ktory-konstruktor-ma-zostac-uzyty/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
