最近賦閒在家,突然想看一點東西。
以前都有用Enterprise Library,對於PolicyInject可使項目輔助功Log,Auth 等以更優雅的方式,歎其巧妙。現在微軟出了Unity1.2注入容器,但是我在使用 這個框架上還是個新手,所以在此學習如何應用。(下載地址: http://www.codeplex.com/unity )
下面是我的一些初步使用,主要參照在 UnityDocs,路過的各位高手哪位有比 較完好的中午資料,請是否可共享一下~~;
1,第一個Demo;
以下是一個Demo:首先定義1個接口,1個實現:
public interface ILogService
{
void Write(string message);
}
public class CnsLogService: ILogService
{
#region ILogService 成員
public void Write(string message) {
Console.WriteLine(String.Format("Cns-exception msg:{0}", message));
}
#endregion
}
然後我們可以這樣應用Unity:
public static void Main(string[] args) {
IUnityContainer myContainer = new UnityContainer();
myContainer.RegisterType<ILogService, CnsLogService>();
ILogService myServiceInstance = myContainer.Resolve<ILogService>
();
myServiceInstance.Write("oh,exception occured!");
}
運行結果如下圖:

2, 注入鏈
發現文檔有這樣一段內容

大體意思就是你可以注冊一連串的類型。代碼如上所示:
那麼來實現一下:
先再實現一次ILogService
public class DataLogService:ILogService
{
#region ILogService 成員
public void Write(string message) {
DailyPractice.Utility.Log.AddLog(message);
}
#endregion
}
namespace DailyPractice.Utility
{
public class Log
{
public static void AddLog(string message) {
//insert into Log(message) values(@message)
Console.WriteLine(String.Format("Data-exception msg:{0}", message));
}
}
}
然後實現一下注冊:
public static void Main(string[] args) {
IUnityContainer myContainer = new UnityContainer();
myContainer.RegisterType<ILogService, CnsLogService>()
.RegisterType<ILogService, DataLogService>();
ILogService myServiceInstance = myContainer.Resolve<ILogService>
();
myServiceInstance.Write("oh,exception occured!");
}
結果執行為:

非常意外: CnsLogService並沒有執行
然後把代碼改成
public static void Main(string[] args) {
IUnityContainer myContainer = new UnityContainer();
myContainer.RegisterType<ILogService, CnsLogService>()
.RegisterType<ILogService, DataLogService>();
IEnumerable<ILogService> myServiceInstances =
myContainer.ResolveAll<ILogService>();
foreach (ILogService myServiceInstance in myServiceInstances) {
myServiceInstance.Write("haha, you have an exception 了吧!"); }
}
執行結果是:

什麼都沒有執行???
看過terrylee的blog: http://www.cnblogs.com/terrylee/archive/2008/02/21/unity-application- block-part1.html
發現還有一種實現方式,先看代碼:
public static void Main(string[] args) {
IUnityContainer myContainer = new UnityContainer();
myContainer.RegisterType<ILogService, CnsLogService>
("CnsLogService")
.RegisterType<ILogService, DataLogService>("DataLogService");
IEnumerable<ILogService> myServiceInstances =
myContainer.ResolveAll<ILogService>();
foreach (ILogService myServiceInstance in myServiceInstances) {
myServiceInstance.Write("haha, you have an exception 了吧!"); }
}
執行結果是:

執行結果正常,
所以現在就來找原因:terrylee's blog有這麼一段
除了可以獲取單個對象實例之外,我們還可以一次獲取容器中所有與某一接口 映射的所有對象實例,但是需要依賴於在注冊映射時提供的名稱,如果沒有指定 名稱,通過GetAll方法不會被獲取到。
本次先到這裡。