最近賦閒在家,突然想看一點東西。
以前都有用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方法不會被獲取到。
本次先到這裡。