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><PRE </code><code>class</code><code>=brush:csharp><PRE </code><code>class</code><code>=brush:csharp></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></PRE> </code>
<code>10</code>
<code>11</code>
<code><P><SPAN style=</code><code>"FONT-FAMILY: verdana, 'courier new'; WHITE-SPACE: normal; FONT-SIZE: 14px"</code><code>><STRONG>通過代碼方式注冊對象到容器: </STRONG></SPAN></P></code>

代碼
//建立容器
//向容器中注冊對象
container.RegisterType<ILogger, TextFileLogger>(); //預設對象
container.RegisterType<ILogger, DatabaseLogger>("DatabaseLogger");
ILogger logger = container.Resolve<ILogger>();
logger.Write(" hello Unity");
ILogger textlogger = container.Resolve<ILogger>("DatabaseLogger");
textlogger.Write(" hello Unity");
//周遊輸出已注冊的ILogger接口對象
foreach (object mapping in container.ResolveAll<ILogger>())
Console.WriteLine(mapping.GetType());
輸出:
上面是通過代碼方式注冊對象和取對象,大多時候我們肯定是通過配置方式來注冊和取對象,不然就沒有意義使用Unity了。
使用配置方式注冊對象和取對象:
通過配置方式關鍵要了解Unity的配置檔案的結構和使用
看起來很複雜,實際使用過程中我們一般不會用全。
完整的配置檔案:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,Microsoft.Practices.Unity.Configuration"/>
</configSections>
<unity>
<typeAliases>
<typeAlias alias="singleton"
type="Microsoft.Practices.Unity.ContainerControlledLifetimeManager, Microsoft.Practices.Unity" />
<typeAlias alias="external"
type="Microsoft.Practices.Unity.ExternallyControlledLifetimeManager, Microsoft.Practices.Unity" />
<typeAlias alias="perThread"
type="Microsoft.Practices.Unity.PerThreadLifetimeManager, Microsoft.Practices.Unity" />
<!--<typeAlias alias="DatabaseLogger" type="UnityDemo.DatabaseLogger, UnityDemo" />-->
<typeAlias alias="TextFileLogger" type="UnityDemo.TextFileLogger, UnityDemo" />
<typeAlias alias="IFileLogger" type="UnityDemo.ILogger, UnityDemo" />
</typeAliases>
<containers>
<container>
<types>
<type type="IFileLogger" mapTo="TextFileLogger" />
<type type="UnityDemo.ILogger, UnityDemo" mapTo="UnityDemo.DatabaseLogger, UnityDemo" name="databaseLogger">
<lifetime type="singleton" />
</type>
</types>
</container>
</containers>
</unity>
</configuration>
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);
擷取配置檔案注冊的對象映射:

ILogger defaultLogger = container.Resolve<ILogger>();
defaultLogger.Write(" hello Unity!");
通過可以通過配置檔案配置注冊對象的生命期:此配置在lifetime節點中
完整代碼:

ILogger databaseLogger = container.Resolve<ILogger>("databaseLogger");
databaseLogger.Write(" hello Unity!");
Console.WriteLine(databaseLogger.GetHashCode());
//第二次擷取注冊的執行個體,比較兩次的擷取的對象是否相同
ILogger databaseLogger2 = container.Resolve<ILogger>("databaseLogger");
Console.WriteLine(databaseLogger2.GetHashCode());
運作結果: