Unity Container是一個(gè)微軟出的IoC(控制反轉(zhuǎn)框架)强衡。能夠更好地解耦各種對(duì)象员萍,提高軟件的可維護(hù)性绪商。使用的Unity一般會(huì)有兩種方式:
-
代碼注入:
public interface IPerson { string Name {get; set; }; string ShowName(); } public class Mike: IPerson { public string Name {get; set; }; public string ShowName() { return string.Format("My name is: {0}", ClassName); } } public string Demo() { // 注冊(cè)container IUnityContainer container = new UnityContainer(); container.RegisterType<IPerson, Mike>(); // 獲取實(shí)例 IPerson person = container.Resolve<IPerson>(); // 使用實(shí)例 person.Name = "Mike"; Console.WriteLine(person.ShowName()); }
?
配置文件注入:
如果使用配置文件的話路鹰,需要在<configSections>
中配置對(duì)應(yīng)的配置信息
<configSections>
<!--聲明容器-->
<section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,Microsoft.Practices.Unity.Configuration"/>
</configSections>
<unity>
<!--定義類型別名-->
<aliases>
<add alias="IProduct" type="UnityTest.IProduct,UnityTest" />
<add alias="Milk" type="UnityTest.Milk,UnityTest" />
</aliases>
<!--容器-->
<container name="MyContainer">
<!--映射關(guān)系-->
<register type="IProduct" mapTo="Milk"></register>
</container>
</unity>
public string ContainerConfiguation()
{
IUnityContainer container = new UnityContainer();
// 加載配置信息
container.LoadConfiguration("Config");
UnityConfigurationSection section = (UnityConfigurationSection)ConfigurationManager.GetSection("unity");
section.Configure(container, "Config");
// 獲得實(shí)例
IPerson person = container.Resolve<IPerson>("Mike");
//使用person實(shí)例
...
}
生命周期管理
-
TransientLifetimeManager
默認(rèn)情況下使用的就是這種生命周期管理器炊邦,每次獲取實(shí)例的時(shí)候都會(huì)重新創(chuàng)建一個(gè)新的對(duì)象。
container.RegisterType<IPerson, Mike>(); //等同于 container.RegisterType<IPerson, Mike>(new TransientLifetimeManager);
使用配置文件則是:
<register type="IPerson" mapTo="Mike" name="Mike"> <lifetime type="transient" /> </register>
?
-
ContainerControlledLifetimeManager
使用單例模式創(chuàng)建實(shí)例。
container.RegisterType<IPerson, Mike>(new ContainerControlledLifetimeManager());
配置文件則是:
<register type="IPerson" mapTo="Mike" name="Mike"> <lifetime type="singleton" /> </register>
- HierarchicalLifetimeManager
分層生命周期管理器,Unity這種分級(jí)容器的好處就在于我們可以對(duì)于有不同生命周期的對(duì)象放在不同的容器中,如果一個(gè)子容器被釋放,不會(huì)影響到其它子容器中的對(duì)象硼瓣,但是如果根節(jié)點(diǎn)處父容器釋放后,所有的子容器都將被釋放置谦。
- PerResolveLifetimeManager
處理循環(huán)引用的問題巨双。
- PerThreadLifetimeManager
每個(gè)線程返回同一實(shí)例
6.ExternallyControlledLifetimeManager
外部控制生命周期管理器,這個(gè)生命周期管理允許你使用RegisterType和RegisterInstance來注冊(cè)對(duì)象之間的關(guān)系霉祸,但是其只會(huì)對(duì)對(duì)象保留一個(gè)弱引用筑累,其生命周期交由外部控制,也就是意味著你可以將這個(gè)對(duì)象緩存或者銷毀而不用在意UnityContainer丝蹭,而當(dāng)其他地方?jīng)]有強(qiáng)引用這個(gè)對(duì)象時(shí)慢宗,其會(huì)被GC給銷毀 掉。
依賴注入方式
Unity中提供了三種依賴注入的方式:構(gòu)造函數(shù)注入奔穿、屬性注入镜沽、方法注入。
- 構(gòu)造函數(shù)注入
container.RegisterType<IPerson, Mike>(new InjectionConstructor(type,參數(shù)))
- 屬性注入
-
方法注入
?