首页 > 代码库 > C#设计模式之控制反转即依赖注入-微软提供的Unity

C#设计模式之控制反转即依赖注入-微软提供的Unity

 

使用VS2015的Nuget管理器下载Unity。

技术分享

 

程序员接口类:

1 namespace UnityDemo2 {3     public interface IProgrammer4     {5         void Working();6     }7 }


程序员类:

 1 using System; 2  3 namespace UnityDemo 4 { 5     public class CSharp : IProgrammer 6     { 7         public void Working() 8         { 9             Console.WriteLine("programming C# ...");10         }11     }12 13     public class VB : IProgrammer14     {15         public void Working()16         {17             Console.WriteLine("programming VB ...");18         }19     }20 21     public class Java : IProgrammer22     {23         public void Working()24         {25             Console.WriteLine("programming Java ...");26         }27     }28 }

 

App.config配置文件:

<?xml version="1.0" encoding="utf-8"?><configuration>  <!--<startup>    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2"/>  </startup>-->  <configSections>    <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,Microsoft.Practices.Unity.Configuration"/>  </configSections>  <unity>    <containers>      <container name="Programmer">        <register type="UnityDemo.IProgrammer,UnityDemo"  mapTo="UnityDemo.CSharp,UnityDemo" name="CSharp"></register>        <register type="UnityDemo.IProgrammer,UnityDemo"  mapTo="UnityDemo.VB,UnityDemo" name="VB"></register>        <register type="UnityDemo.IProgrammer,UnityDemo"  mapTo="UnityDemo.Java,UnityDemo" name="Java"></register>      </container>    </containers>  </unity></configuration>


主程序代码:

 1 using Microsoft.Practices.Unity; 2 using Microsoft.Practices.Unity.Configuration; 3 using System; 4 using System.Configuration; 5  6 namespace UnityDemo 7 { 8     class Program 9     {10         private static IUnityContainer container = null;11 12         static void Main(string[] args)13         {14             RegisterContainer();15 16             var programmer = container.Resolve<IProgrammer>("CSharp");17             //var programmer = container.Resolve<IProgrammer>("VB");18             programmer.Working();            19 20             Console.ReadKey();21         }22 23         private static void RegisterContainer()24         {25             container = new UnityContainer();26             UnityConfigurationSection config =(UnityConfigurationSection) ConfigurationManager.GetSection(UnityConfigurationSection.SectionName);27             config.Configure(container, "Programmer");28         }29     }30 }

 

运行结果:

      programming C# ...

注:使用 Unity方式实现和工场模式差不多,是工场模式的升华,还是需要动后台的代码,使用Spring.NET方式实现一点后台代码都不需要动,只需要关心配置文件即可

三种方式本质都离不开 反射机制


这个Demo的思想:

定义一个程序员接口IProgrammer,有3个实现这个接口的程序员类,分别是CSharp、VB、Java,

 

然后配置App.config文件,里面首先定义一个配置节点(configSection),名称为Unity,引用的命名空间是微软的Unity,

接着下面定义一个unity节点,里面的容器集合(containers),集合里面可以有多个容器,这个Demo里的只有一个容器,里面包含了3个注册节点(register),分别是CSharp,VB、Java,注意,里节点中的name属性用于在程序调用时选择类的。

 

在主程序的代码中,

1、有一个Unity的容器container;

2、注册容器的方法RegisterContainer,作用是到App.config中读取容器的信息,把接口和3个类的映射关系注册到容器中;

3、主程序运行前,先注册容器,然后通过容器的Resolve方法,实例化一个programmer类,原理大概是,我们把类名传入到容器中,容器会根据类名,找到App.config中对应的register映射关系,容器就会通过反射得到相应的程序员类,返回这个类。

4、此时programmer类就实例化完成,可以使用了。

 

使用了Unity,以后如果需要追加新的类,只需要实现IProgrammer接口,在配置文件追加映射关系,执行代码中修改name的值就能使用新的类了。

这样,我们不需要删除旧的代码,就能追加新的功能,便于维护代码。

C#设计模式之控制反转即依赖注入-微软提供的Unity