p&p Unity 幫我的兩三事

  • 1115
  • 0
  • C#
  • 2014-01-04

摘要:p&p Unity 幫我的兩三事

Enviroment : 
Unity 2.1
.Net FrameWork 3.5
VS 2008
 
 
目前在 .Net 上有許多 DI 的 FrameWork , 例如 Spring.Net , 微軟Enterprise Library 裡的 Unity
 
 
這裡不會說明 DI 是啥意思了 ... 主要會說明它會幫我們解決甚麼問題
 
 
這裡我舉一個簡訊的例子 , 例如我們在某環境內會使用到多個廠商的簡訊 Api ,
 
 
這裡我們用 KotSms , Mitake 代表兩個廠商名稱 , 
 
 
為了便利切換所使用的廠商 , 可能都會使用如下的結構
 
 
宣告一個介面 來定義簡訊的各種行為 , 例如發送簡訊 , 取得簡訊訊息等 , 這裡我們先宣告一個 send 的行為
 

public Interface ISms{

    void Send();

}

 

接下來宣告兩個實作 ISms 介面的廠商
 

public class KotSms:ISms{

     public KotSms(){}

     public void Send(){
          
     }

} 


public class Mitake:ISms{

     public Mitake(){}

     public void Send(){
          
     }

}

 

 
 
最後在 Client 端執行時如下 :
 

ISms sms = new KotSms();
sms.Send();

 

 
這時候我們使用的會是 KotSms 的 send  行為
 
若要使用 Mitake 的 send 行為呢 ?
 

ISms sms = new Mitake();
sms.Send();

 

 
其實 Unity 就是想要做這些事情 , 下面的程式碼會代替在 Client 端執行的程式碼 :
 
var container = new UnityContainer();
ISms sms = container.Resolve<KotSms>();
 
 
但是它可以更可以幫我們處理得更方便 , 
 
若我們要更改成某家廠商的 send 行為 , 
 
照我們上面來講 , 我們還是必須在程式裡面去做更改型別的動作
 
而 Unity 可以讓我們將設定的行為搬到 設定檔來做設定 
 
設定檔如下 :  若我們要切換成 KotSms 的 send 行為只需要把紅字部分更改成 KotSms 即可 
 
 <unity>
        <typeAliases>
            <!-- Custom object types -->
            <typeAlias alias="ISms"
                 type="TestUnity.ISms, TestUnity" />
            <typeAlias alias="KotSms"
                 type="TestUnity.KotSms, TestUnity"/>
            <typeAlias alias="Mitake"
                 type="TestUnity.Mitake, TestUnity" />
        </typeAliases>

        <containers>
            <container name="web">
                <types>
                    <type type="ISms" mapTo="Mitake" />
                </types>

            </container>

        </containers>

    </unity>
 
 
網頁程式碼如下 : 
       
        UnityContainer myContainer = new UnityContainer();
        UnityConfigurationSection section = (UnityConfigurationSection)ConfigurationManager.GetSection("unity");
        section.Containers["containerOne"].Configure(myContainer);
        ISms temp = myContainer.Resolve<ISms>();
        Response.Write(temp.Send());
 
雖說如此 , 不過你還是可以透過 reflector 來完成上述 的功能  cheeky 
 

 var typeName = ConfigurationManager.AppSettings["SmsTypeName"];
Type t = Type.GetType(typeName);
 ISms sms = (ISms) Activator.CreateInstance( t );

 

 
參考資料 :