3

我在兩個當前正在進行的項目中使用依賴注入技術。如何在運行時注入對象(初始化後)?

我使用Unity作爲我的IoC框架。

我正在使用一個名爲ComponentBuilder的類來負責創建應用程序對象及其事件訂閱,作爲應用程序初始化的一部分。

應用程序運行後,所有對象都準備就緒,數據從一個對象傳遞到另一個對象。

我的問題是:

某些對象的初始化之後動態創建的,這些對象需要一個已經存在的其他對象。

由於ComponentBuilder已經完成了它的部分,我需要找到一種將所需對象傳遞給這些「動態」對象的方法。這些動態對象實際上是運行時創建的對象的層次結構,層次結構中最深的對象需要層次結構頂部的組件(對象)。

我想到了兩個可能的解決方案(我不喜歡他們兩個):

  1. 從ComponentBuilder通過所有對象的容器的動態對象,使他們可以使用並訂閱所需對象。這個選項的主要目的是揭露可以隱藏對象間依賴關係的所有對象。我看到一些人將對象容器傳遞給所有對象,就好像它是一個記錄器或顯示器,我認爲這是錯誤的,並隱藏了我們想要暴露給其他對象的依賴關係。

  2. 將所需的對象傳遞給在init時間創建的第一個對象,以便稍後它將對象傳遞給對象層次結構到動態對象。這個選項的主要目標是層次結構中的一些對象不需要這些對象。

你能想出更好的解決方案嗎?

+1

相關:http://stackoverflow.com/questions/1943576/is-there-a-pattern-for-initializing-objects-created-via-a-di-container/1945023#1945023 – 2011-04-05 18:39:34

+0

感謝馬克,相關的真正幫助,並指示我通向其他相關問題的途徑。有時你只需要知道你在尋找什麼...... – 2011-04-06 11:09:33

回答

2

似乎您需要一個標準的工廠/抽象工廠模式,其中您在構造函數和運行時依賴項中傳遞編譯時依賴關係的創建方法。

class Factory 
{ 
    ISomeService service; 

    public Factory(ISomeService service) 
    { 
    this.service = service; 
    } 


    public SomeObject CreateItem(object runtimeDependency) 
    { 
    return new SomeObject(service, runtimeDependency); 
    } 
} 
0

我真的不明白你的問題。但似乎你正在尋找Service Locator模式。大多數IoC框架都有某種靜態對象,它允許您即時創建相關性,而不是將它們注入到構造函數或屬性中。

但是這有要求,你的代碼知道你的IoC。我討厭這個要求,所以它不是可能的解決方案。在這種情況下,創建Factory,它允許你爲你創建你的依賴關係是更好的解決方案。在這種情況下,解決這些依賴關係的具體方式可以由具體的工廠隱藏,這是內部使用您的特定IoC。