【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/