Unity 是 .NET 生態系中廣泛使用的 IoC 容器,最新版 Unity 3(NuGet 套件)提供程式碼與設定檔雙重註冊模式。本文以日期格式化介面為例,示範三種註冊解析方式與建構函式參數注入技巧。
Unity 安裝 Unity v3

public interface IRegionFormat {
string FormatName { get; }
string GetShortTimeString(DateTime time);
}
public class DefaultRegionFormat : IRegionFormat {
public string FormatName => "預設時間格式";
public string GetShortTimeString(DateTime time) => time.ToString("yyyy-MM-dd");
}
public class DayMonthYearRegionFormat : IRegionFormat {
public string FormatName => "日月年格式";
public string GetShortTimeString(DateTime time) => time.ToString("dd/MM/yyyy");
}
public class MonthDayYearRegionFormat : IRegionFormat {
public MonthDayYearRegionFormat(string s) { Console.WriteLine($"建構函式參數:{s}"); }
public string FormatName => "月日年格式";
public string GetShortTimeString(DateTime time) => time.ToString("MM/dd/yyyy");
}
static IUnityContainer GetRegisterContainer() {
var container = new UnityContainer();
container.RegisterType<IRegionFormat, DefaultRegionFormat>();
// 同介面重複註冊,後者生效
return container;
}
static void NoConfigUnity() {
var container = GetRegisterContainer();
WriteFormat(container.Resolve<IRegionFormat>());
}
App.config
<configuration>
<configSections>
<section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration" />
</configSections>
<unity>
<containers>
<container name="defaultContainer">
<register type="UnityDemo.IRegionFormat,UnityDemo" mapTo="UnityDemo.DefaultRegionFormat,UnityDemo" />
</container>
<container name="DayMonthYearContainer">
<register type="UnityDemo.IRegionFormat,UnityDemo" mapTo="UnityDemo.DayMonthYearRegionFormat,UnityDemo" />
</container>
<container name="MonthDayYearContainer">
<register type="UnityDemo.IRegionFormat,UnityDemo" mapTo="UnityDemo.MonthDayYearRegionFormat,UnityDemo" />
</container>
</containers>
</unity>
</configuration>
static void ConfigUnity() {
var container = new UnityContainer();
var section = ConfigurationManager.GetSection("unity") as UnityConfigurationSection;
section.Configure(container, "DayMonthYearContainer");
WriteFormat(container.Resolve<IRegionFormat>());
}
static void ParameterUnity() {
var container = new UnityContainer();
var section = ConfigurationManager.GetSection("unity") as UnityConfigurationSection;
section.Configure(container, "MonthDayYearContainer");
// 關鍵:為非註冊型別(string)註冊具體實例,供建構函式解析
container.RegisterInstance(typeof(string), "string型別注入");
WriteFormat(container.Resolve<IRegionFormat>());
}
三種模式分別輸出對應格式名稱與當前時間,ParameterUnity 會顯示建構函式接收到的字串參數。
string, int),必須呼叫 RegisterInstance 提供具體值,否則解析拋異常。(object 型別參數例外,運行時不報錯但不建議)Unity 3 靈活支援「純碼」、「設定檔」、「混合」三種模式,配合 RegisterInstance 解決基本型別注入難題,是從傳統三層架構引入 IOC 的平滑切入點。