摘要: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>
<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 來完成上述 的功能
var typeName = ConfigurationManager.AppSettings["SmsTypeName"];
Type t = Type.GetType(typeName);
ISms sms = (ISms) Activator.CreateInstance( t );
參考資料 :