程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> Unity 1.2使用初探(1)

Unity 1.2使用初探(1)

編輯:關於.NET

最近賦閒在家,突然想看一點東西。

以前都有用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方法不會被獲取到。

本次先到這裡。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved