天天看點

Microsoft.Practices.Unity依賴注入使用執行個體

Unity是微軟模式與實踐團隊開發的一個輕量級、可擴充的依賴注入容器。  最新版本是1.2,包括在Microsoft Enterprise Library中。

使用執行個體:

   為了接下來的使用,準備接口和類:  

 public interface ILogger

  {

    void Write(string message);

  }

  public class TextFileLogger:ILogger

    public void Write(string message)

    {

      Console.WriteLine("Writed Log To File:\t" +message);

    }

  public class DatabaseLogger:ILogger

      Console.WriteLine("Writed Log To Database:\t" + message);

 建立容器:

class Program

{

static void Main(string[] args)

IUnityContainer container = new UnityContainer();

}

一個容器中也可包括多個子容器

​​view source​​

​​print​​​​?​​

<col>

​<code>​01​</code>​

​<code>​&lt;PRE ​</code>​​<code>​class​</code>​​<code>​=brush:csharp&gt;&lt;PRE ​</code>​​<code>​class​</code>​​<code>​=brush:csharp&gt;​</code>​​<code>​class​</code>​ ​<code>​Program ​</code>​

​<code>​02​</code>​

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

​<code>​03​</code>​

​<code>​static​</code>​ ​<code>​void​</code>​ ​<code>​Main(​</code>​​<code>​string​</code>​​<code>​[] args)     ​</code>​

​<code>​04​</code>​

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

​<code>​05​</code>​

​<code>​IUnityContainer parentContainer = ​</code>​​<code>​new​</code>​ ​<code>​UnityContainer();   ​</code>​

​<code>​06​</code>​

​<code>​UnityContainer childContainer =parentContainer.CreateChildContainer();     ​</code>​

​<code>​07​</code>​

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

​<code>​08​</code>​

​<code>​09​</code>​

​<code>​&lt;/PRE&gt; ​</code>​

​<code>​10​</code>​

​<code>​11​</code>​

​<code>​&lt;P&gt;&lt;SPAN style=​</code>​​<code>​"FONT-FAMILY: verdana, 'courier new'; WHITE-SPACE: normal; FONT-SIZE: 14px"​</code>​​<code>​&gt;&lt;STRONG&gt;通過代碼方式注冊對象到容器: &lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/P&gt;​</code>​

Microsoft.Practices.Unity依賴注入使用執行個體
Microsoft.Practices.Unity依賴注入使用執行個體

代碼

//建立容器

//向容器中注冊對象

container.RegisterType&lt;ILogger, TextFileLogger&gt;(); //預設對象

container.RegisterType&lt;ILogger, DatabaseLogger&gt;("DatabaseLogger");

ILogger logger = container.Resolve&lt;ILogger&gt;();

logger.Write(" hello Unity");

ILogger textlogger = container.Resolve&lt;ILogger&gt;("DatabaseLogger");

textlogger.Write(" hello Unity");

//周遊輸出已注冊的ILogger接口對象

foreach (object mapping in container.ResolveAll&lt;ILogger&gt;())

Console.WriteLine(mapping.GetType());

輸出:

Microsoft.Practices.Unity依賴注入使用執行個體

上面是通過代碼方式注冊對象和取對象,大多時候我們肯定是通過配置方式來注冊和取對象,不然就沒有意義使用Unity了。

使用配置方式注冊對象和取對象:

通過配置方式關鍵要了解Unity的配置檔案的結構和使用

Microsoft.Practices.Unity依賴注入使用執行個體

看起來很複雜,實際使用過程中我們一般不會用全。

完整的配置檔案:

Microsoft.Practices.Unity依賴注入使用執行個體
Microsoft.Practices.Unity依賴注入使用執行個體

&lt;?xml version="1.0" encoding="utf-8" ?&gt;

&lt;configuration&gt;

&lt;configSections&gt;

&lt;section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,Microsoft.Practices.Unity.Configuration"/&gt;

&lt;/configSections&gt;

&lt;unity&gt;

&lt;typeAliases&gt;

&lt;typeAlias alias="singleton"

type="Microsoft.Practices.Unity.ContainerControlledLifetimeManager, Microsoft.Practices.Unity" /&gt;

&lt;typeAlias alias="external"

type="Microsoft.Practices.Unity.ExternallyControlledLifetimeManager, Microsoft.Practices.Unity" /&gt;

&lt;typeAlias alias="perThread"

type="Microsoft.Practices.Unity.PerThreadLifetimeManager, Microsoft.Practices.Unity" /&gt;

&lt;!--&lt;typeAlias alias="DatabaseLogger" type="UnityDemo.DatabaseLogger, UnityDemo" /&gt;--&gt;

&lt;typeAlias alias="TextFileLogger" type="UnityDemo.TextFileLogger, UnityDemo" /&gt;

&lt;typeAlias alias="IFileLogger" type="UnityDemo.ILogger, UnityDemo" /&gt;

&lt;/typeAliases&gt;

&lt;containers&gt;

&lt;container&gt;

&lt;types&gt;

&lt;type type="IFileLogger" mapTo="TextFileLogger" /&gt;

&lt;type type="UnityDemo.ILogger, UnityDemo" mapTo="UnityDemo.DatabaseLogger, UnityDemo" name="databaseLogger"&gt;

&lt;lifetime type="singleton" /&gt;

&lt;/type&gt;

&lt;/types&gt;

&lt;/container&gt;

&lt;/containers&gt;

&lt;/unity&gt;

&lt;/configuration&gt;

Unity的配置都在Unity節點下

typeAliases是配置類型别名的,在typeAliases中配置的類型可以直接在contaniners使用,當在containers中使用時

就不需要填寫完整的類型了,隻需填在typeAliases注冊的别名就可以了。當然也可以直接在container中注冊完整的類型。

typeAlias 中alias是别名稱,type 是類型。

containners節點中可以包含多個container,同時一個container中可以嵌套多個container了。

name:在注冊此類型時使用的名稱。此屬性是可選的,如果不指定此屬性,所在的 add 元素即為預設的類型映射。

type:容器中配置的源類型。如果這是映射注冊,這就是映射的起始對象的類型;如果這是單件注冊,這就是對象的類型。此屬性是必須的。

mapTo:類型映射的目标類型。如果這是映射注冊,這就是映射的目标對象的類型。此屬性是可選的。

lifetime:設定用于給定的類型和名稱的生命周期。是一個來自 LifetimeStyle 枚舉的值。有效的值是 Transient(預設),它導緻了容器每次都建立一個新的執行個體;以及 Singleton,它使容器為每個請求傳回同一執行個體。如果在配置一個單件時同時指定了 type 和 mapto 屬性,SetSingleton 方法将傳回指定在 mapTo 屬性中的類型。如果 mapTo 屬性沒有指定值,SetSingleton 方法将傳回指定在 type 屬性中的類型。

加載配置資訊到容器中:

UnityConfigurationSection config = ConfigurationManager.GetSection("unity") as UnityConfigurationSection;

config.Containers.Default.Configure(container);

這樣就會根據配置檔案的配置,向容器中注冊類型的映射;

如果配置中有多個容器,如果隻是想加載某個的話,可以指定加載:

section.Containers["ctrOne"].Configure(container);

擷取配置檔案注冊的對象映射:

Microsoft.Practices.Unity依賴注入使用執行個體
Microsoft.Practices.Unity依賴注入使用執行個體

ILogger defaultLogger = container.Resolve&lt;ILogger&gt;();

defaultLogger.Write(" hello Unity!");

通過可以通過配置檔案配置注冊對象的生命期:此配置在lifetime節點中

完整代碼:

Microsoft.Practices.Unity依賴注入使用執行個體
Microsoft.Practices.Unity依賴注入使用執行個體

ILogger databaseLogger = container.Resolve&lt;ILogger&gt;("databaseLogger");

databaseLogger.Write(" hello Unity!");

Console.WriteLine(databaseLogger.GetHashCode());

//第二次擷取注冊的執行個體,比較兩次的擷取的對象是否相同

ILogger databaseLogger2 = container.Resolve&lt;ILogger&gt;("databaseLogger");

Console.WriteLine(databaseLogger2.GetHashCode());

運作結果:

Microsoft.Practices.Unity依賴注入使用執行個體

繼續閱讀