2014-02-18 133 views
0

有什麼辦法從依賴注入器獲取類的實例嗎?實例化依賴注入類

例如,註冊我的類型,然後有一個這樣的類:

public class A { 
    private readonly Iinterface _object; 

    public A (Iinterface object) { 
     _object = object; 
    } 

    //do stuff using _object 
} 

public class B { 
    public void DoSomething() { 
     var instanceOfA = DIContainer.GetInstance(typeof(A)); 
     //do stuff with instanceOfA which has been constructed using DI 
    } 
} 

目前,我會註冊類A將被注入,然後有注入到等級B的構造函數。我只是很好奇,如果有一種方法可以讓我從Unity爲我創建的A實例自動注入dependencies,所以我不必註冊它或通過對象。

請記住,這不是我正在考慮的實際使用案例,但我想了解更多關於使用依賴注入和Unity的選項。

+1

'A'和'B'之間的關係是什麼? 'A'可以將依賴注入到'B'中嗎? –

+0

是的,這是我現在要做的,但我想知道是否有辦法讓'A'沒有注入太多。 – tau

回答

4

在Unity中,有幾種獲取依賴關係的方法。

  1. 構造器注入
  2. 物業注射
  3. 手動解決

我相信你要求的是#3。

在你的榜樣,你可以得到一類被實例(授予您已經註冊Iinterface):

unityContainer.Resolve<A>(); 

一種簡化的方式去思考統一是這是一個非常聰明的工廠,可以給你構造函數中的一個對象,屬性或通過調用Method。詢問任何對象類型或接口類型,它會給你一個。需要注意的是,你需要提供有關如何處理歧義的線索。這基本上就是註冊起作用的地方。

在上例中,唯一的不明確之處是Iinterface,因此這是您需要註冊的唯一類。解決類AB不需要任何註冊,因爲它已經是一個具體的類型。

+0

感謝您的解釋。我與DI的經歷讓我相信大部分是你寫的,但我很欣賞你簡明扼要地解釋了它,並確認了我相信的大部分內容。 – tau

1

這取決於AB之間的關係:

如果B取決於A,那麼它將使意義A注入的依賴到B(或者注入A本身)。

我不會建議允許B通過查看A來「查找」依賴項。充其量,您最好在BA之間擁有強大的依賴關係,最糟糕的情況是最終會出現「服務定位器」反模式。

除非你有一個關鍵需要保持AB之間的依賴關係,否則我不會將它們連接在一起。

+0

我同意你的看法,但我想知道是否有可能'B'以某種方式創建'A'的注入依賴項的實例,而不是將'A'注入到它的構造函數中。 – tau

+0

這可能是可能的(我對Unity知之甚少),但它仍然創建了對A的依賴關係。如果_應該是對A的依賴關係,那麼注入A或依賴關係是有效的。 –