C#設計模式之控制反轉即依賴注入-微軟提供的Unity

 

使用VS2015的Nuget管理器下載Unity。程序員

 

程序員接口類:spa

複製代碼
1 namespace UnityDemo
2 {
3     public interface IProgrammer
4     {
5         void Working();
6     }
7 }
複製代碼


程序員類:code

複製代碼
 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 : IProgrammer
14     {
15         public void Working()
16         {
17             Console.WriteLine("programming VB ...");
18         }
19     }
20 
21     public class Java : IProgrammer
22     {
23         public void Working()
24         {
25             Console.WriteLine("programming Java ...");
26         }
27     }
28 }
複製代碼

 

App.config配置文件:xml

複製代碼
<?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>
複製代碼


主程序代碼:blog

複製代碼
 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# ...utf-8

注:使用 Unity方式實現和工場模式差很少,是工場模式的昇華,仍是須要動後臺的代碼,使用Spring.NET方式實現一點後臺代碼都不須要動,只須要關心配置文件便可get

三種方式本質都離不開 反射機制string


這個Demo的思想:it

定義一個程序員接口IProgrammer,有3個實現這個接口的程序員類,分別是CSharp、VB、Java,

 

而後配置App.config文件,裏面首先定義一個配置節點(configSection),名稱爲Unity,引用的命名空間是微軟的Unity,

接着下面定義一個unity節點,裏面的容器集合(containers),集合裏面能夠有多個容器,這個Demo裏的只有一個容器,裏面包含了3個註冊節點(register),分別是CSharp,VB、Java,注意,裏節點中的name屬性用於在程序調用時選擇類的。

 

在主程序的代碼中,

一、有一個Unity的容器container;

二、註冊容器的方法RegisterContainer,做用是到App.config中讀取容器的信息,把接口和3個類的映射關係註冊到容器中;

三、主程序運行前,先註冊容器,而後經過容器的Resolve方法,實例化一個programmer類,原理大概是,咱們把類名傳入到容器中,容器會根據類名,找到App.config中對應的register映射關係,容器就會經過反射獲得相應的程序員類,返回這個類。

四、此時programmer類就實例化完成,能夠使用了。

 

使用了Unity,之後若是須要追加新的類,只須要實現IProgrammer接口,在配置文件追加映射關係,執行代碼中修改name的值就能使用新的類了。

這樣,咱們不須要刪除舊的代碼,就能追加新的功能,便於維護代碼。

相關文章
相關標籤/搜索