先前寫了六篇 dependency injection 筆記,之後因為工作上的變動而暫停。最近又有機會把注意力稍微拉回來,所以便有了這篇筆記。稱不上續集,因為先前的討論都還屬於 dependency injection(以下簡稱 DI)基礎觀念的範疇,而這篇筆記是直接跳到 Unity 實作的部分了....嗯,其實還蠻跳 tone 的,因為中間還有許多議題沒有談到。不過,對於已經具備 DI 基礎觀念、想盡快了解如何使用 Unity 的人來說,或許會有點幫助吧。
DI 容器
Unity 是一種 DI 容器。如果還不是很清楚 DI 容器與 DI 之間的關係,不妨參考 Dependency Injection 筆記的第一篇。這裡僅重點複習一下。
重點 1:DI 是一組設計模式和原則,DI 容器則是輔助的工具。
重點 2:所謂的 DI 容器,就是一個用來註冊和保存型別的地方,同時還負責建立適當型別的物件實體。當用戶端應用程式對 DI 容器提出要求,說它需要某個介面、基礎類別、或特定具象類別的時候,容器就要去尋找符合其需求的型別,然後建立該型別的物件實體,並回傳給用戶端。
目前的 DI 容器有多種口味可以選擇,比較知名的有 Castle Windsor、StructureMap、Spring.NET、Ninject、Autofac、Unity 等等。這裡不會討論各 DI 容器的優缺點,僅針對 Unity 的基本用法做個介紹。
Unity 簡介
無論哪一種 DI 容器,其主要功能都是在解析元件。解析(resolve),就是去找到應用程式所需要的型別。
Unity 是由微軟的 patterns & practices(p&p)小組所開發之眾多 application blocks 的其中一塊。所謂的 application block,其實就是一個可重複使用的類別庫,加上一些說明文件和範例,如此而已,不用把它想得太複雜。
Unity 和 Enterprise Library 雖系出同門(皆為 p&p 出品),而且 Enterprise Library 整包套件裡面有包含 Unity,但 Unity 其實是個獨立類別庫,並不須要跟 Enterprise Library 一起使用。Unity 在 Enterprise Library 裡面的角色就只是單純的預設容器,如果不喜歡 Unity,是可以把它換掉的。
簡介到此草草結束,接著就來實際寫程式,快速體驗一下吧!
Hello, Unity!
參考底下的練習步驟 ,我用的開發工具是 Visual Studio 2010。
步驟 1. New 一個 Console 應用程式專案,將專案名稱命名為 UnityDemo01。
步驟 2. 用 NuGet 幫我們取得 Unity 套件,並加入必要組件參考。
參考下圖,點 Manage NuGet Packages...
接著在右上角搜尋文字方塊中輸入 unity,找到 Unity 套件,點 Install 進行安裝。
步驟 3. 檢查一下專案的組件參考清單:
步驟 4. New 一個介面:ISayHello。
步驟 5. New 一個實作該介面的類別:SayHelloInEnglish。
步驟6. 編輯 program.cs,引用必要的命名空間,並撰寫 Main 函式如下。
執行結果:
請注意我們並不是直接以 new 運算子來建立 SayHelloInEnglish 的物件實體,而是透過 UnityContainer 來間接幫我們完成這件工作。
嗯,看來好像是把一個很簡單的事情(在螢幕上顯示 “Hello, Unity!”)弄複雜了。這裡只是想讓你先了解如何引用 Unity 類別庫,以及它最基本的用法。
下一回,我會沿用並修改這個範例程式,並且進一步說明程式所用到的 API,以及 Unity 在解析物件型別時的一些規則。
參考資料:Dependency Injection in .NET by Mark Seemann
DI 容器
Unity 是一種 DI 容器。如果還不是很清楚 DI 容器與 DI 之間的關係,不妨參考 Dependency Injection 筆記的第一篇。這裡僅重點複習一下。
重點 1:DI 是一組設計模式和原則,DI 容器則是輔助的工具。
重點 2:所謂的 DI 容器,就是一個用來註冊和保存型別的地方,同時還負責建立適當型別的物件實體。當用戶端應用程式對 DI 容器提出要求,說它需要某個介面、基礎類別、或特定具象類別的時候,容器就要去尋找符合其需求的型別,然後建立該型別的物件實體,並回傳給用戶端。
目前的 DI 容器有多種口味可以選擇,比較知名的有 Castle Windsor、StructureMap、Spring.NET、Ninject、Autofac、Unity 等等。這裡不會討論各 DI 容器的優缺點,僅針對 Unity 的基本用法做個介紹。
Unity 簡介
無論哪一種 DI 容器,其主要功能都是在解析元件。解析(resolve),就是去找到應用程式所需要的型別。
Unity 是由微軟的 patterns & practices(p&p)小組所開發之眾多 application blocks 的其中一塊。所謂的 application block,其實就是一個可重複使用的類別庫,加上一些說明文件和範例,如此而已,不用把它想得太複雜。
Unity 和 Enterprise Library 雖系出同門(皆為 p&p 出品),而且 Enterprise Library 整包套件裡面有包含 Unity,但 Unity 其實是個獨立類別庫,並不須要跟 Enterprise Library 一起使用。Unity 在 Enterprise Library 裡面的角色就只是單純的預設容器,如果不喜歡 Unity,是可以把它換掉的。
簡介到此
Hello, Unity!
參考底下的練習步驟 ,我用的開發工具是 Visual Studio 2010。
步驟 1. New 一個 Console 應用程式專案,將專案名稱命名為 UnityDemo01。
步驟 2. 用 NuGet 幫我們取得 Unity 套件,並加入必要組件參考。
參考下圖,點 Manage NuGet Packages...
接著在右上角搜尋文字方塊中輸入 unity,找到 Unity 套件,點 Install 進行安裝。
步驟 3. 檢查一下專案的組件參考清單:
步驟 4. New 一個介面:ISayHello。
interface ISayHello { void Run(); }
步驟 5. New 一個實作該介面的類別:SayHelloInEnglish。
class SayHelloInEnglish : ISayHello { public void Run() { Console.WriteLine("Hello, Unity!"); } }
步驟6. 編輯 program.cs,引用必要的命名空間,並撰寫 Main 函式如下。
.... using Microsoft.Practices.Unity; .... static void Main(string[] args) { var container = new UnityContainer(); ISayHello hello = container.Resolve<SayHelloInEnglish>(); hello.Run(); }
執行結果:
請注意我們並不是直接以 new 運算子來建立 SayHelloInEnglish 的物件實體,而是透過 UnityContainer 來間接幫我們完成這件工作。
嗯,看來好像是把一個很簡單的事情(在螢幕上顯示 “Hello, Unity!”)弄複雜了。這裡只是想讓你先了解如何引用 Unity 類別庫,以及它最基本的用法。
下一回,我會沿用並修改這個範例程式,並且進一步說明程式所用到的 API,以及 Unity 在解析物件型別時的一些規則。
參考資料:Dependency Injection in .NET by Mark Seemann
沒有留言: