Unity 入門 (1)

先前寫了六篇 dependency injection 筆記,之後因為工作上的變動而暫停。最近又有機會把注意力稍微拉回來,所以便有了這篇筆記。稱不上續集,因為先前的討論都還屬於 dependency injection(以下簡稱 DI)基礎觀念的範疇,而這篇筆記是直接跳到 Unity 實作的部分了....嗯,其實還蠻跳 tone 的,因為中間還有許多議題沒有談到。不過,對於已經具備 DI 基礎觀念、想盡快了解如何使用 Unity 的人來說,或許會有點幫助吧。

DI 容器

Unity 是一種 DI 容器。如果還不是很清楚 DI 容器與 DI 之間的關係,不妨參考 Dependency Injection 筆記的第一篇。這裡僅重點複習一下。

重點 1:DI 是一組設計模式和原則,DI 容器則是輔助的工具。

重點 2:所謂的 DI 容器,就是一個用來註冊和保存型別的地方,同時還負責建立適當型別的物件實體。當用戶端應用程式對 DI 容器提出要求,說它需要某個介面、基礎類別、或特定具象類別的時候,容器就要去尋找符合其需求的型別,然後建立該型別的物件實體,並回傳給用戶端。

目前的 DI 容器有多種口味可以選擇,比較知名的有 Castle WindsorStructureMapSpring.NETNinjectAutofacUnity 等等。這裡不會討論各 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

沒有留言:

技術提供:Blogger.
回頂端⬆️