近来在面试中被问到了IOC的设计模式,以前在帮忙做java项目时接触过spring,但在.NET的项目中几乎没有用过ioc框架。所以趁着周末学习一下微软的ioc框架Unity。
先从最简单的用法开始吧。
先建一个控制台工程,实用NuGet添加Unity组件。我这里选择的版本是Unity v4.0.1,高版本的Unity我试过在使用是会出些异常,比如Microsoft.Practices.Unity.Configuration程序集无法加载,也不知道原因是什么。
然后在新建一个类库项目,编写接口和类。
接口在ioc的设计模式中经常被用到,用接口引用类对象能更好实现松耦合,发挥ioc设计模式的优势。
接口和类:
public interface IProgrammer { void Introduce(); } public class CSharpProgrammer : IProgrammer { public void Introduce() { Console.WriteLine("我是一个C#程序员"); } } public class JavaProgrammer : IProgrammer { public void Introduce() { Console.WriteLine("我是一个Java程序员"); } }
接下来就是创建ioc容器和注册组件了,Unity一般有两种方式。
一种是硬编码的方式写在程序里:
//创建容器
IUnityContainer container = new UnityContainer();
//将CSharpProgrammer类注册到IProgrammer上,并将类对象命名为DoNet
container.RegisterType<IProgrammer, CSharpProgrammer>("DoNet");
container.RegisterType<IProgrammer, JavaProgrammer>("java");
//获取DoNet对象
IProgrammer programmer = container.Resolve<IProgrammer>("DoNet");
programmer.Introduce();
还有一种是使用配置文件:
在控制台下新建一个Unity.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> <aliases> <add alias="CSharpProgrammer" type="Model.CSharpProgrammer,Model"/> <add alias="JavaProgrammer" type="Model.JavaProgrammer,Model"/> <add alias="IProgrammer" type="Model.IProgrammer,Model"/> </aliases> <container name="MyContainer"> <register type="IProgrammer" mapTo="CSharpProgrammer" name="net"></register> <register type="IProgrammer" mapTo="JavaProgrammer" name="java"></register> </container> </unity> </configuration>
configSection用于新建一个自定义的节点unity,在unity节点中完成注册,
然后在程序中读取配置文件:
IUnityContainer container = new UnityContainer(); ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap(); fileMap.ExeConfigFilename = "Unity.config"; Configuration configuration = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None); UnityConfigurationSection section = (UnityConfigurationSection)configuration.GetSection("unity"); container.LoadConfiguration(section, "MyContainer"); IProgrammer programmer = container.Resolve<IProgrammer>("java"); programmer.Introduce(); Console.ReadKey();