Unity 是Microsoft的开源项目Enterprise Library的一个Ioc组件,与Mvc也有很好的集成,既可以通过代码来进行运行时依赖注入,也可以通过配置文件来进行设计时依赖注入,下面是一个使用配置文件的小例子。
配置文件App.config
<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration"/> </configSections> <unity configSource="unity.config" /> </configuration>
外置的配置文件unity.config
<?xml version="1.0" encoding="utf-8" ?> <unity xmlns="http://schemas.microsoft.com/practices/2010/unity"> <container> <register type="HelloInterface.ISayHello,HelloInterface" mapTo="HelloWorld.MotherSayHello,HelloWorld"/> <register type="HelloInterface.ISayHello,HelloInterface" mapTo="HelloWorld.ChildSayHello,HelloWorld" name="child"> <constructor> <param name="count" type="string" value="10" ></param> </constructor> </register> </container> </unity>
unity结点中的xmlns 可以使用tellisense。
register结点中的type属性HelloInterface.ISayHello,HelloInterface前半部分是类全名(带名空间的类名),后半部分是程序集名称。
与
<register type="HelloInterface.ISayHello,HelloInterface" mapTo="HelloWorld.MotherSayHello,HelloWorld"/>
对应的是
ISayHello say = container.Resolve<ISayHello>();
得到是say是MotherHello的实例。
项目架构
ISayHello.cs
public interface ISayHello { void SayHello(string to); }
MotherSayHello.cs
public class MotherSayHello : ISayHello { public void SayHello(string to) { Console.WriteLine("Mother say hello to " + to); } }
ChildSayHello.cs
public class ChildSayHello : ISayHello { string count = "0"; public ChildSayHello(string count) { this.count = count; } public void SayHello(string to) { Console.WriteLine("Child say " + count + " hello to " + to); } }
Program.cs
public class Program { public static void Main(string[] args) { /// 读取配置信息。 var section = (UnityConfigurationSection)ConfigurationManager.GetSection("unity"); IUnityContainer container = new UnityContainer(); section.Configure(container); // Unnamed <container> element //container.RegisterType<ISayHello, MotherSayHello>(); /// 获取实例 ISayHello say = container.Resolve<ISayHello>(); ISayHello child = container.Resolve<ISayHello>("child"); say.SayHello("you"); child.SayHello("him"); } }
输出结果
这样就能将MotherSayHello,ChildSayHello与客户程序解耦,客户程序只关心接口而不关心具体实现,而需要改变具体实现类时,不需要动客户代码,只需要修改配置文件,并开发相应的实现类即可。