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对象的几个属性值,我们看下运行效果:
结果不言而喻,其实我们理解的方法注入就是对参数对象的注入,从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中,标识主要有两种方式, 一种是直接使用接口(或者基类)作为标识键,另一种是使用接口(或者基类)与名称的组合作为标识键,键对应的值就是具体类。
第一种使用接口(或者基类)作为标识键:
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中的集合对象:
ContainerControlledLifetimeManager单例