天天看點

Unity TIP2: Configuration之構造器注入、屬性注入、方法注入

1:本篇基于如下的場景

a:主項目隻和接口項目相關,如下:

<a href="http://images.cnblogs.com/cnblogs_com/luminji/201108/201108081523439716.png"></a>

也即,ConsoleApplication1隻和IBiz和IDal相關。順便說一下,為了示範注入,IDal要用到IBiz項目。

b:類結構如下:

SampleClass1,SampleClass2,SampleClass3,都繼承自IClass

其中SampleClass1構造器依賴注入ISomeBiz的一個執行個體,

其中SampleClass2屬性依賴注入ISomeBiz的一個執行個體,

其中SampleClass3方法依賴注入ISomeBiz的一個執行個體。

c:用配置檔案實作

2:主要的類

兩個接口,一個是在IDal項目下的IClass:

<code>public</code> <code>interface</code> <code>IClass</code>

<code>{</code>

<code>    </code><code>void</code> <code>ShowInfo();</code>

<code>}</code>

一個是在IBiz項目下的ISomeBiz:

<code>public</code> <code>interface</code> <code>ISomeBiz</code>

<code>    </code><code>string</code> <code>GetSomething(</code><code>int</code> <code>a);</code>

ISomeBiz的實作SomeBiz為:

<code>public</code> <code>class</code> <code>SomeBiz : ISomeBiz</code>

<code>    </code><code>public</code> <code>string</code> <code>GetSomething(</code><code>int</code> <code>a)</code>

<code>    </code><code>{</code>

<code>        </code><code>return</code> <code>(a + a).ToString();</code>

<code>    </code><code>}</code>

SampleClass1的實作:

<code>//構造器注入</code>

<code>public</code> <code>class</code> <code>SampleClass1 : IClass</code>

<code>    </code><code>private</code> <code>ISomeBiz _someBiz;</code>

<code>    </code><code>public</code> <code>SampleClass1(</code><code>int</code> <code>a, ISomeBiz someBiz)</code>

<code>        </code><code>_someBiz = someBiz;</code>

<code>    </code><code>public</code> <code>void</code> <code>ShowInfo()</code>

<code>        </code><code>Console.WriteLine(</code><code>"SampleClass1:"</code> <code>+ _someBiz.GetSomething(1));</code>

SampleClass2的實作:

<code>//屬性注入</code>

<code>public</code> <code>class</code> <code>SampleClass2: IClass</code>

<code>    </code><code>public</code> <code>ISomeBiz SomeBiz {</code><code>get</code><code>;</code><code>set</code><code>; }</code>

<code>        </code><code>if</code> <code>(SomeBiz !=</code><code>null</code><code>)</code>

<code>        </code><code>{</code>

<code>            </code><code>Console.WriteLine(</code><code>"SampleClass2:"</code> <code>+ SomeBiz.GetSomething(2));</code>

<code>        </code><code>}</code>

SampleClass3的實作:

<code>//方法注入</code>

<code>public</code> <code>class</code> <code>SampleClass3 : IClass</code>

<code>    </code><code>public</code> <code>void</code> <code>SetBiz(ISomeBiz someBiz)</code>

<code>        </code><code>Console.WriteLine(</code><code>"SampleClass3:"</code> <code>+ _someBiz.GetSomething(3));</code>

3:配置檔案

根據注釋,配置檔案應該是很容易看明白的。

<a href="http://images.cnblogs.com/cnblogs_com/luminji/201108/2011080815234474.png"></a>

4:主調用程式

<code>using</code> <code>(IUnityContainer container =</code><code>new</code> <code>UnityContainer())</code>

<code>    </code><code>UnityConfigurationSection section = (UnityConfigurationSection)ConfigurationManager.GetSection(</code><code>"unity"</code><code>);</code>

<code>    </code><code>section.Configure(container,</code><code>"containerOne"</code><code>);</code>

<code>    </code><code>//無注入</code>

<code>    </code><code>IClass class0 = container.Resolve&lt;IClass&gt;(</code><code>"ConfigClass"</code><code>);</code>

<code>    </code><code>class0.ShowInfo();</code>

<code>    </code><code>//構造器注入</code>

<code>    </code><code>IClass class1 = container.Resolve&lt;IClass&gt;(</code><code>"ConfigClass1"</code><code>);</code>

<code>    </code><code>class1.ShowInfo();</code>

<code>    </code><code>//屬性注入</code>

<code>    </code><code>IClass class2 = container.Resolve&lt;IClass&gt;(</code><code>"ConfigClass2"</code><code>);</code>

<code>    </code><code>class2.ShowInfo();</code>

<code>    </code><code>//方法注入</code>

<code>    </code><code>IClass class3 = container.Resolve&lt;IClass&gt;(</code><code>"ConfigClass3"</code><code>);</code>

<code>    </code><code>class3.ShowInfo();</code>

5:特别說明

a:由于完全依賴注入,是以主項目對于兩個接口項目的實作項目是不直接引用的,主應用程式運作所依賴的兩個DLL:Dal.dll和Biz.dll必須在同一目錄下,我們可以手動拷貝這兩個DLL到輸出目錄下。或者你也可以設定兩個項目的輸出目錄和主目錄在一個目錄下。

b:在實際使用過程中,可以輕松的配置檔案,來替換我們的項目和注入類型;

6:輸出

<a href="http://images.cnblogs.com/cnblogs_com/luminji/201108/201108081523471239.png"></a>

本文轉自最課程陸敏技部落格園部落格,原文連結:http://www.cnblogs.com/luminji/archive/2011/08/08/2131004.html,如需轉載請自行聯系原作者

繼續閱讀