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

Unity(六):使用場景Ⅲ:用於依賴注入(上)

編輯:關於.NET

有關依賴注入

什麼是依賴注入,我想這個問題我在這裡說就不大合適了,所以還是推薦一下大師的文章。之前的文章也提到過,“Martin Fowler的Inversion of Control Containers and the Dependency Injection pattern 是不得不推薦的,當然,如果讀起來比較費勁的話,呂震宇的你真的了解Ioc與AOP嗎?系列也是不錯的參考”。

這裡要多說一句的是,依賴注入(Dependency Injection)和控制反轉(Inversion of Control)並不是同一個概念,有的人經常混在一起。有關這一點,看看前面說的Martin的文章就明白了。

准備工作

為了接下來的說明,我們先編寫幾個後面需要的接口和類。

注:本文涉及到的IOrder接口、CommonOrder類、VipOrder類和ILogger接口、ConsoleLogger類、NullLogger類等代碼請參見Unity(三):快速入門和Unity(五):使用場景Ⅱ:用於單例模式中的准備代碼,這裡不再重復。

IOrderWithLogging接口:

Unity支持的依賴注入方式有三種:構造器注入、設值注入、方法調用注入。

構造器注入

對於構造器注入,Unity支持兩種方式的依賴注入:自動依賴注入和通過打標簽標識。具體來說,對於只有單一構造函數的目標類,可以使用自動依賴注入的方式,而對於有多個構造函數的目標類,則應該使用在構造函數上打標簽的方式來進行注入。

單構造器自動注入

下面是我們的目標類SingleConstructor,可以看到,SingleConstructor類只有一個構造函數,構造函數中有兩個參數:IOrder和ILogger。

下面是我們的測試代碼。首先,我們建立容器,然後在容器中注冊了IOrder和ILogger的具體類,同時將SingleConstructor注冊為IOrderWithLogging的具體類。

在這裡,我們將CommonOrder注冊為單例,並為它的單實例的Discount賦值為0.8,這樣做的目的是為了檢驗取出的IOrder的具體類為我們先前的注入到容器的CommonOrder類。

下面是輸出結果。

多構造器打標簽注入

下面是我們的目標類MultipleConstructor,可以看到,MultipleConstructor類有兩個構造函數,一個不帶參數,一個有兩個參數:IOrder和ILogger,後者打了InjectionConstructor標簽。

下面是我們的測試代碼。思路與上面的例子類似,在這裡我們把IOrder和ILogger對應的具體類換成了VipOrder和NullLogger,IOrderWithLogging對應的具體類換成了MultipleConstructor。

下面是輸出結果。

這裡需要注意的是,如果在上面的 MultipleConstructor類中,我們不打InjectionConstructor標簽,運行結果是一樣的,大家可以自己試驗一下。

這是因為對於具有多個構造器的目標類,如果沒有發現標有InjectionConstructor標簽的構造器,Unity會自動使用參數最多的構造器。如果發現參數最多的構造器同時有多個,那麼就會在運行時拋出一個異常。比如說,如果我們的MultipleConstructor類中構造函數不打InjectionConstructor標簽,同時還有一個構造函數也有兩個參數,結果就是這樣。

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