Unity Container是一个微软出的IoC(控制反转框架)。能够更好地解耦各种对象,提高软件的可维护性。使用的Unity一般会有两种方式:
-
代码注入:
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() { // 注册container IUnityContainer container = new UnityContainer(); container.RegisterType<IPerson, Mike>(); // 获取实例 IPerson person = container.Resolve<IPerson>(); // 使用实例 person.Name = "Mike"; Console.WriteLine(person.ShowName()); }
配置文件注入:
如果使用配置文件的话,需要在<configSections>
中配置对应的配置信息
<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">
<!--映射关系-->
<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");
// 获得实例
IPerson person = container.Resolve<IPerson>("Mike");
//使用person实例
...
}
生命周期管理
-
TransientLifetimeManager
默认情况下使用的就是这种生命周期管理器,每次获取实例的时候都会重新创建一个新的对象。
container.RegisterType<IPerson, Mike>(); //等同于 container.RegisterType<IPerson, Mike>(new TransientLifetimeManager);
使用配置文件则是:
<register type="IPerson" mapTo="Mike" name="Mike"> <lifetime type="transient" /> </register>
-
ContainerControlledLifetimeManager
使用单例模式创建实例。
container.RegisterType<IPerson, Mike>(new ContainerControlledLifetimeManager());
配置文件则是:
<register type="IPerson" mapTo="Mike" name="Mike"> <lifetime type="singleton" /> </register>
- HierarchicalLifetimeManager
分层生命周期管理器,Unity这种分级容器的好处就在于我们可以对于有不同生命周期的对象放在不同的容器中,如果一个子容器被释放,不会影响到其它子容器中的对象,但是如果根节点处父容器释放后,所有的子容器都将被释放。
- PerResolveLifetimeManager
处理循环引用的问题。
- PerThreadLifetimeManager
每个线程返回同一实例
6.ExternallyControlledLifetimeManager
外部控制生命周期管理器,这个生命周期管理允许你使用RegisterType和RegisterInstance来注册对象之间的关系,但是其只会对对象保留一个弱引用,其生命周期交由外部控制,也就是意味着你可以将这个对象缓存或者销毁而不用在意UnityContainer,而当其他地方没有强引用这个对象时,其会被GC给销毁 掉。
依赖注入方式
Unity中提供了三种依赖注入的方式:构造函数注入、属性注入、方法注入。
- 构造函数注入
container.RegisterType<IPerson, Mike>(new InjectionConstructor(type,参数))
- 属性注入
-
方法注入