.net Ioc 之 Unity 适合刚开始使用
介绍:
首先稍微介绍一下,Unity是微软patterns& practices组用C#实现的轻量级、可扩展的依赖注入容器,可通过代码或xml配置文件来配置对象之间的关系。那么通过一个简单的代码来实现。
测试项目详细
1、新建一个控制台项目叫UnityDemo
2、建立一个接口IProduct,包括一个属性(string ClassName{get;set;}),一个方法(void ShowInfo())
3、建立两个类Milk,Sugar,并且继承IProduct,两个类实现代码如下:
public class Milk : IProduct { public string ClassName { get; set; } public void ShowInfo() { Console.WriteLine("milk:{0}",ClassName); } }
public class Sugar : IProduct { public string ClassName { get; set; } public void ShowInfo() { Console.WriteLine("sugar:{0}", ClassName); } }
开始测试
1、使用Unity需要引用三个dll,也可以使用Nuget获取
2、前面有提到,使用Unity有两种方式,我们先使用代码来控制
a、新建一个静态方法ContaninerCode,需要引用Microsoft.Practices.Unity代码如下:
static void ContainerCode() { //创建Unity实例 IUnityContainer container = new UnityContainer(); //默认注册(无命名) container.RegisterType<IProduct, Milk>(); //命名注册 container.RegisterType<IProduct, Sugar>("Sugar"); //解析默认对象 IProduct _product = container.Resolve<IProduct>(); _product.ClassName = _product.GetType().ToString(); _product.ShowInfo(); //指定命名解析对象 IProduct _Sugar = container.Resolve<IProduct>("Sugar"); _Sugar.ClassName = _Sugar.GetType().ToString(); _Sugar.ShowInfo(); //获取容器中所有的IProduct注册的已命名对象(不包含默认注册) IEnumerable<IProduct> classList = container.ResolveAll<IProduct>(); foreach (var item in classList) { item.ClassName = item.GetType().ToString(); item.ShowInfo(); } }
运行结果如下:
3、使用配置文件实现
a、根目录新建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="Iproduct" type="UnityDemo.IProduct,UnityDemo"/> <add alias="Milk" type="UnityDemo.Milk,UnityDemo"/> <add alias="Sugar" type="UnityDemo.Sugar,UnityDemo"/> </aliases> <!--容器--> <container name="MyContainer"> <!--开始映射关系--> <register type="Iproduct" mapTo="Milk"></register> <register type="Iproduct" mapTo="Sugar" name="Sugar"></register> </container> </unity> </configuration>
b、创建静态方法ContainerCodeForConfig()加载配置文件,需要引用dll,Practices.Unity.Configuration、System.Configuration代码如下:
static void ContainerCodeForConfig() { //创建Unity实例 IUnityContainer container = new UnityContainer(); string configFile = "Unity.config"; var fileMap = new ExeConfigurationFileMap { ExeConfigFilename = configFile }; //读取指定config文件 Configuration configuration = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None); //获取指定名称的节点 UnityConfigurationSection section = (UnityConfigurationSection)configuration.GetSection("unity"); //获取容器节点 container.LoadConfiguration(section, "MyContainer"); IProduct p = container.Resolve<IProduct>("Sugar"); p.ClassName = p.GetType().ToString(); p.ShowInfo(); }
运行结果如下:
可以看到 我们并没有创建IProduct、Sugar类,但是能调用其方法,这是Ioc 帮我们做的
这是一个很简单的入门。