使用Unity 实现依赖注入(3)

public static void FuTest03() { UnityContainer container = new UnityContainer(); // 创建容器 UnityConfigurationSection configuration = (UnityConfigurationSection)ConfigurationManager.GetSection(UnityConfigurationSection.SectionName); configuration.Configure(container, "defaultContainer"); VillagePeople03 people = container.Resolve<IPeople>() as VillagePeople03;//返回调用者 Console.WriteLine("people.tool == null(引用) ? {0}", people.tool == null ? "Yes" : "No"); Console.WriteLine("people.tool2 == null(参数) ? {0}", people.tool2 == null ? "Yes" : "No"); Console.WriteLine("people.tool3 == null(返回值) ? {0}", people.tool3 == null ? "Yes" : "No"); } 

container.Resolve<IPeople>() as VillagePeople03;其实多此一举,因为已经在配置文件注册过了,不需要再进行转化,这边只是转化只是方便访问VillagePeople03对象的几个属性值,我们看下运行效果:

使用Unity 实现依赖注入

结果不言而喻,其实我们理解的方法注入就是对参数对象的注入,从typeConfig节点-method节点-param节点就可以看出来只有参数的配置,而并没有其他的配置,关于typeConfig下面会讲到。

非泛型注入

除了我们上面使用RegisterType和Resolve泛型方法,我们也可以使用非泛型注入,代码如下:

public static void FuTest04() { UnityContainer container = new UnityContainer();//创建容器 container.RegisterType(typeof(IWaterTool), typeof(PressWater));//注册依赖对象 IPeople people = (IPeople)container.Resolve(typeof(VillagePeople));//返回调用者 people.DrinkWater();//喝水

运行效果:

使用Unity 实现依赖注入

标识键

  我们知道,Unity提供了对象的容器,那么这个容器是如何进行索引的呢?也就是说,容器内的单元是如何标识的呢?在Unity中,标识主要有两种方式, 一种是直接使用接口(或者基类)作为标识键,另一种是使用接口(或者基类)与名称的组合作为标识键,键对应的值就是具体类。

第一种使用接口(或者基类)作为标识键:

container.RegisterType<IWaterTool, PressWater>();

代码中的IWaterTool就是作为标识键,你可以可以使用基类或是抽象类作为标示,获取注册对象:container.Resolve<IWaterTool>(),如果一个Ioc容器容器里面注册了多个接口或是基类标示,我们再这样获取就不知道注册的是哪一个?怎么解决,就是用接口或是基类与名称作为标识键,示例代码如下:

public static void FuTest05() { UnityContainer container = new UnityContainer();//创建容器 container.RegisterType<IWaterTool, PressWater>("WaterTool1");//注册依赖对象WaterTool1 container.RegisterType<IWaterTool, PressWater>("WaterTool2");//注册依赖对象WaterTool2 IWaterTool wt = container.Resolve<IWaterTool>("WaterTool1");//返回依赖对象WaterTool1 var list = container.ResolveAll<IWaterTool>();//返回所有注册类型为IWaterTool的对象 }

  我们只需要在泛型方法RegisterType传入一个名称就可以来区分了(和注册接口或基类),获取的话也只要传入注册时候的名称即可,我们看下list中的集合对象:

使用Unity 实现依赖注入

ContainerControlledLifetimeManager单例

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/72237947c0d18678115b7385d8d42331.html