Unity 應用程式區塊支援從 XML 配置檔讀取設定,適用於 App.config (Windows Forms) 或 Web.config (ASP.NET)。標準配置結構如下:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration" />
</configSections>
<unity>
<containers>
<container name="containerOne">
<types>
<type type="System.Data.IDbConnection,System.Data" mapTo="MyDefaultConnection,MyAssembly" />
<type name="baseMap" type="System.Data.Common.DbConnection,System.Data" mapTo="MyDbConnection,MyAssembly" lifetime="Transient" />
<type name="interfaceSingleton" type="System.Data.IDbConnection,System.Data" mapTo="MyDbConnection,MyAssembly" lifetime="Singleton"/>
</types>
<instances>
<add name="MyInstance1" type="System.String" value="Some value" />
<add name="MyInstance2" type="System.DateTime" value="2008-02-05T17:50:00" />
</instances>
<extensions>
<!-- <add type="MyApp.MyExtensions.SpecialOne" /> -->
</extensions>
</container>
</containers>
</unity>
</configuration>
區段名稱為 unity,處理器型別為 Microsoft.Practices.Unity.Configuration.UnityConfigurationSection。
containers 包含多個 container,每個可選擇性命名。容器不可巢狀定義。
types 元素包含多個 type 註冊:
Transient (預設,每次新建) 或 Singleton (共享實例)instances 區段對應 RegisterInstance,支援基本型別(字串、日期等),屬性包含 name、type、value、typeConverter。
extensions 允許加入自訂容器擴充。
private static IUnityContainer CreateContainer() {
IUnityContainer container = new UnityContainer();
UnityConfigurationSection section = (UnityConfigurationSection)ConfigurationManager.GetSection("unity");
section.Containers["containerOne"].GetConfigCommand().Configure(container);
return container;
}
若使用預設容器(無名稱):
section.Containers.Default.GetConfigCommand().Configure(container);
雖配置檔不支援巢狀定義,但程式碼可建立父子容器:
IUnityContainer parentContainer = new UnityContainer();
IUnityContainer childContainer = parentContainer.CreateChildContainer();
section.Containers["containerOne"].GetConfigCommand().Configure(parentContainer);
section.Containers["nestedChildContainer"].GetConfigCommand().Configure(childContainer);
IDbConnection connection = container.Get<IDbConnection>();
connection.Open(); connection.Close();
DbConnection connection = container.Get<DbConnection>("baseMap");
IDbConnection conn1 = container.Get<IDbConnection>("interfaceSingleton");
conn1.ConnectionString = "server=10.99.123.22,...";
IDbConnection conn2 = container.Get<IDbConnection>("interfaceSingleton");
conn2.ConnectionString = "server=192.168.0.2...";
Console.WriteLine(conn1.ConnectionString); // 輸出第二個設定值,證明為同一實例
string val1 = container.Get<string>("MyInstance1");
DateTime val2 = container.Get<DateTime>("MyInstance2");
Unity 的配置系統提供強大的聲明式依賴管理,結合程式碼初始化與巢狀容器,能滿足從簡單到複雜企業級應用的各種場景需求。