Unity 學習筆記(1) — Unity簡介及簡單使用

 

Unity 學習筆記(1) — Unity簡介及簡單使用

151 views 四月 23, 09 by Timothy

Unity是微軟Patterns & Practices團隊所開發的一個輕量級的,並且可擴展的依賴注入(Dependency Injection)容器,它支持常用的三種依賴注入方式:構造器注入(Constructor Injection)、屬性注入(Property Injection),以及方法調用注入(Method Call Injection).現在Unity最新的版本的1.2版,可以在微軟的開源站點http://unity.codeplex.com下載最新的發佈版本和文檔。通過使用Unity,我們能輕鬆構建鬆耦合結構的程序,從而讓整個程序框架變得清晰和易於維護。

在平常的軟件編碼過程中,程序的邏輯往往很複雜,尤其是大型項目的開發中,一個模塊常常會去引用其他的模塊,假設我們有一個監控器類,用來監控CPU的溫度,當溫度達到預警的範圍時,監控器有一個報警的方法,方法裏面通過短信提醒器,以發送短信的方式通知維護人員。於是就出現了下面這樣一段最爲常見的代碼:

在Monitor類中,直接引用到了一個短信提醒器的類,這是最爲不靈活和最不易於擴展的一種方式。或許我們想到了面向接口編程,利用多態的好處,可以提供靈活的不同子類的實現,增加代碼擴展性等等。但是說到底,接口一定是需要實現的,也就是如下語句遲早要執行:

 

這樣看來,在實現INotify這個接口的時候,仍然需要具體的類來實現,而這樣的代碼在程序編譯的時候就已經固定下來,如果以後需要使用新的提醒器,仍舊需要修改源代碼並重新編譯。並且在我們的Monitor類中,明顯依賴SMSNotify類,二者之間的耦合度非常緊密。因此Ioc(控制反轉)模式被提出用來解決這種問題,也即把接口的具體實現延緩到運行時,接口的實現類是在運行時被裝載的。這樣,就算有了新的實現類,也不需要更改調用者的代碼(可以在Unity中使用配置文件的方式實現)。這種Ioc模式可以被形象的比喻爲:接口就像一個空殼,而在具體實現時,向這個空殼注入內容,而讓它成爲一個真正的實體。這種模式也被形象的稱爲:依賴注入。通過使用Unity,我們能構建鬆耦合的軟件,並且對象之間相互關聯的細節,我們也不必關心,可以交由依賴注入容器全權負責。

前面也提到了依賴注入常用的三種形式:構造器注入、屬性注入和方法調用注入,我們可以通過例子來實現這三種形式的注入。還是以上面的場景爲例,我們的幾個類和接口如下圖:

1

1.Constructor Injection

IMonitor接口定義:

Monitor類:

 

 

INotify接口定義:

 

 

EmailNotify類:

 

SMSNotify類:

 

可以看到,在Monitor類的構造函數裏面,傳入的參數是一個INotify接口類型,Alarm方法,調用了實現類的Send方法,但具體調用哪一個實現類的Send方法,只有在注入實體後才知道。Unity容器中,通常使用RegisterType和Resolve方法來分別註冊和獲取實例,並且這兩個方法有很多泛型和非泛型的重載,具體的類型和參數,可以參考Unity的官方幫助文檔。

現在我們向Monitor的構造函數注入實現INotify接口的實例:

 

代碼中我們注入的INotify實例是SMSNotify類的實例,然後調用monitor.Alrarm(),裏面會調用notify.Send().
運行查看結果:
2
上面是針對單個構造函數的情況,如果有多個構造函數,需要指明哪個構造函數是需要被注入的,也即需要在指定被注入的構造函數加上attribute:InjectionConstructor

 

運行後可得到一樣的結果.

2.Property Injection

通過屬性注入,我們需要加上attribute: Dependency,使得Unity容器在獲取類對象實例時,自動實例化該屬性所依賴的對象,並注入到屬性中。

修改Monitor類,實現下面的代碼:

 

再在Main函數裏面,修改原有的代碼,這次我們讓容器注入EmailNotify實例:

     container.RegisterType<INotify, EmailNotify>();

 

運行查看結果:
3還有一個比較方便的地方,可以爲Dependency特性指定名稱,這樣,在注入時,會將RegisterType所指定的對應名稱的實體進行注入,例如:

 

修改Main函數,在RegisterType函數中指定注入名稱:

運行查看結果:
2

3.Method Call Injection

Method Call Injection注入的時機和Constructor Injection有一定的區別,構造函數注入,是在容器創建實例的時候,而方法調用注入,是在方法被調用的時候。實現方法調用注入,需要在指定注入的方法前加上attribute: InjectionMethod

修改Monitor類的代碼如下:

 

在程序運行時,容器會自動實例化GetNotify方法所依賴的對象,並自動調用該方法,將其注入到方法中。

Main函數如下:

 

運行查看結果:

3

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章