【Unity簡介】在.NET中是一種非常 流行的IoC框架,最新版本為Unity v3。
【環境】VS2012、.NET Framework 4.5、Unity v3。
【安裝Unity v3】在你的項目中(無則新建Demo),如下圖所示,
在彈出的窗口搜索“Unity”,
安裝完之後可以管理解決方案中的項目是否使用Unity,如下圖勾選或取消勾選即可。
當然也可以直接在官網下載然後引用,這也是之前常用的方式。
【Coding】我的代碼包含一個接 口(IRegionFormat)三個類(DefaultRegionFormat、
DayMonthYearRegionFormat、 MonthDayYearRegionFormat),還有一個包含Main方法的類Program。
public interface IRegionFormat { string FormatName { get; } string GetShortTimeString(DateTime time); } public class DefaultRegionFormat : IRegionFormat { public string FormatName { get { return "默認時間格式"; } } public string GetShortTimeString(DateTime time) { return time.ToString("yyyy-MM-dd"); } } public class DayMonthYearRegionFormat : IRegionFormat { public string FormatName { get { return "日月年格式"; } } public string GetShortTimeString(DateTime time) { return time.ToString("dd/MM/yyyy"); } } public class MonthDayYearRegionFormat : IRegionFormat { public MonthDayYearRegionFormat(string s) { Console.WriteLine("構造函數的參數:{0}", s); } public string FormatName { get { return "月日年格式"; } } public string GetShortTimeString(DateTime time) { return time.ToString("MM/dd/yyyy"); } } 一個接口三個類
static void Main(string[] args) { //NoConfigUnity(); //ConfigUnity(); ParameterUnity(); Console.Read(); } /// <summary> /// 全編碼方式注入 /// </summary> static void NoConfigUnity() { IUnityContainer container = GetRegisterContainer(); IRegionFormat format1 = container.Resolve<IRegionFormat>(); WriteFormat(format1); } /// <summary> /// 編碼方式進行注入,此種方式無需在配置文件進行配置 /// </summary> static IUnityContainer GetRegisterContainer() { IUnityContainer container = new UnityContainer(); container.RegisterType<IRegionFormat, DefaultRegionFormat>(); //container.RegisterType<IRegionFormat, DayMonthYearRegionFormat>(); //同一個接口注冊兩次,將以最後一次注冊為准 return container; } /// <summary> /// 通過配置文件進行注入 /// </summary> static void ConfigUnity() { IUnityContainer container = new UnityContainer(); UnityConfigurationSection section = ConfigurationManager.GetSection(UnityConfigurationSection.SectionName) as UnityConfigurationSection; //section.Configure(container, "defaultContainer"); section.Configure(container, "DayMonthYearContainer"); WriteFormat(container.Resolve<IRegionFormat>()); } /// <summary> /// 構造方法含參數的注入 /// </summary> static void ParameterUnity() { IUnityContainer container = new UnityContainer(); UnityConfigurationSection section = ConfigurationManager.GetSection(UnityConfigurationSection.SectionName) as UnityConfigurationSection; section.Configure(container, "MonthDayYearContainer"); //構造函數包含非注入類型參數 container.RegisterInstance(typeof(string), "string類型注入"); //注冊對象,以便於對構造函數調用的參數初始化指定值 WriteFormat(container.Resolve<IRegionFormat>()); } static void WriteFormat(IRegionFormat format) { if (format != null) { Console.WriteLine("格式名稱:{0};當前時間:{1}" , format.FormatName, format.GetShortTimeString(DateTime.Now)); } } 包含Main方法的類Program
<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,Microsoft.Practices.Unity.Configuration" /> </configSections> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" /> </startup> <unity> <containers> <container name="defaultContainer"> <register type="UnityDemo.IRegionFormat,UnityDemo" mapTo="UnityDemo.DefaultRegionFormat,UnityDemo"></register> </container> <container name="DayMonthYearContainer"> <register type="UnityDemo.IRegionFormat,UnityDemo" mapTo="UnityDemo.DayMonthYearRegionFormat,UnityDemo"></register> </container> <container name="MonthDayYearContainer"> <register type="UnityDemo.IRegionFormat,UnityDemo" mapTo="UnityDemo.MonthDayYearRegionFormat,UnityDemo"></register> </container> </containers> </unity> </configuration> 配置文件app.config
代碼有注釋,就不羅嗦拉。
【值得注意的是】 1. 注入的接口對象所屬 的類中包含構造函數,且構造函數包含未進行注入的參數類型(如string,如果非要問還有哪些屬於,我的回 答是我也不知道,但是只有object類型作為構造函數參數運行時是不報錯的),則要進行“RegisterInstance ”,如Program類中的ParameterUnity方法所示。
2. 配置文件是XML格式,切記區分大小寫。
3.Unity 3 幫助文檔:http://msdn.microsoft.com/en-us/library/dn170416.aspx
complex 地址: http://unity.codeplex.com/