除了使用RegisterType方法注册,我们还可以在配置文件中注册,[Dependency]和RegisterType方式其实都会产生耦合度,我们要添加一个属性或是修改一中注册都会去修改代码,我们要做的就是代码不去修改,只要修改配置文件了,这个在下面有讲解,这边就不多说,我们先看下使用UnityConfigurationSection的Configure方法加载配置文件注册:
Program.cs
using Microsoft.Practices.Unity; using Microsoft.Practices.Unity.Configuration; using System.Configuration; namespace UnityDemo { class Program { static void Main(string[] args) { UnityContainer container = new UnityContainer(); // 创建容器 UnityConfigurationSection configuration = (UnityConfigurationSection)ConfigurationManager.GetSection(UnityConfigurationSection.SectionName); configuration.Configure(container, "defaultContainer"); IPeople people = container.Resolve<IPeople>(); // 返回调用者 people.DrinkWater(); // 喝水 } } }
app.config
<?xml version="1.0"?> <configuration> <configSections> <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration" /> </configSections> <unity> <containers> <container name="defaultContainer"> <register type="UnityContainerDemo.IPeople, UnityContainerDemo" mapTo="UnityContainerDemo.VillagePeople01, UnityContainerDemo"> <lifetime type="singleton" /> </register> <register type="UnityContainerDemo.IWaterTool, UnityContainerDemo" mapTo="UnityContainerDemo.PressWater, UnityContainerDemo"/> </container> </containers> </unity> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/> </startup> </configuration> InjectionMethod方法注入
方法注入(Method Injection):如果被依赖对象需要调用某个方法进行相应的初始化,在该对象创建之后,IoC容器会自动调用该方法。
方法注入和属性方式使用一样,方法注入只需要在方法前加[InjectionMethod]标记就行了,从方法注入的定义上看,只是模糊的说对某个方法注入,并没有说明这个方法所依赖的对象注入,所依赖的对象无非就三种:参数、返回值和方法内部对象引用,我们做一个示例试下:
VillagePeople03.cs
using Microsoft.Practices.Unity; namespace UnityDemo { class VillagePeople03 : IPeople { public IWaterTool tool; // 我是对象引用 public IWaterTool tool2; // 我是参数 public IWaterTool tool3; // 我是返回值 [InjectionMethod] public void DrinkWater() { if (tool == null) { } } [InjectionMethod] public void DrinkWater2(IWaterTool tool2) { this.tool2 = tool2; } public IWaterTool DrinkWater3() { return tool3; } } }
调用代码: