2010-06-08 58 views
3

最近我一直在研究依賴注入和控制反轉實踐,以努力改進我們的應用程序框架的體系結構,我似乎無法找到一個好的答案題。這很可能是我的術語混淆,混淆,或者我現在對這個概念只是天真的,所以任何鏈接或澄清,將不勝感激。序列化依賴注入配置/控制反轉

許多DI和IoC容器的例子並沒有說明當你有一個可能的「插件」「庫」,或者如何「序列化」一個給定的配置時,容器將如何連接在一起。 (從我讀過的關於MEF的文章可以看出,如果你的對象只需要1 [Import],那麼對於同一類型的[Export]多個聲明將不起作用)。也許這是一種不同的模式,或者我被我目前的思維方式蒙上了一層陰影。

下面是一個例子參考一些代碼:IoC.Resolve vs Constructor Injection

關於「細粒度背景」,其中同一對象的兩個實例所需要的「引擎」類的不同實現
public abstract class Engine { 
} 

public class FastEngine : Engine { 
} 

public class MediumEngine : Engine { 
} 

public class SlowEngine : Engine { 
} 

public class Car 
{ 
    public Car(Engine e) 
    { 
     engine = e; 
    } 

    private Engine engine; 
} 

這篇文章會談

有沒有一個好的框架可以幫助你配置或序列化一個配置來實現類似這樣的事情,而不需要對它進行硬編碼或手動滾動代碼來做到這一點?

public class Application 
{ 
    public void Go() 
    { 
     Car c1 = new Car(new FastEngine()); 
     Car c2 = new Car(new SlowEngine()); 
    } 
} 

示例XML:

<XML> 
    <Cars> 
     <Car name="c1" engine="FastEngine" /> 
     <Car name="c2" engine="SlowEngine" /> 
    </Cars> 
</XML> 
+0

謝謝那些提供答案的人。 雖然其他答案給出了具體框架的例子,但可以接受的答案指出,許多DI框架可以通過XML配置(Unity,Spring等)完成此功能。您可以根據平臺和偏好確定使用哪一個。 – 2010-06-09 14:37:11

回答

0

大多數DI容器支持XML配置 - 事實上,他們大多數是以這種方式開始的,XML配置是只有選項。時下,XML configuration is one option among several

但是,在它當前的版本中,MEF不使用XML配置。它也不是一個DI容器。

+0

感謝您的鏈接。現在我已經閱讀了關於MEF的更多內容,但我不認爲未知的運行時發現是我正在尋找的。 它看起來像XML配置和代碼配置之間的公開辯論。最終,我想建立一個工具包,可供非程序員使用,以便在給定豐富的程序員構建庫的情況下「將所有東西連接在一起」。這聽起來像XML配置在這裏更合適。 – 2010-06-09 12:19:55

0

使用MEF(你提到的),你可以使用[ImportMany]導入引擎實例的集合。然後,您可以爲每個引擎創建一個汽車,並返回該汽車,而不需要XML。

public class Application 
{ 
    [ImportMany] 
    public IEnumerable<Engine> Engines { get; set; } 

    public void Go() 
    { 
     // I'm assuming this object was composed already... 

     var cars = this.Engines.Select(e => new Car(e)); 

     foreach(var car in cars) 
     { 
      // Do something with each car 
     } 
    } 
} 

這樣做的好處是可以隨時添加新的「引擎」,而無需更改代碼。所有接線均在運行時動態處理,無需配置。

+0

謝謝里德。我確實在MEF中找到了[ImportMany]屬性,這對於動態加載事物集合似乎很好。我認爲我試圖解決的問題是允許某人明確哪些對象被用於每輛車。我可以看到使用這種方法在運行時如何將新的Engine對象添加到列表中,但我需要一些序列化「Car 1使用快速引擎」這一事實的方法,因此,當我創建Car 1時,請給它一個快速引擎。 – 2010-06-09 00:52:52

1

我不知道MEF,但春天確實你描述使用幾乎一模一樣的方法你描述(注射用XML文件或配置部分配置)正是:

<objects> 
    <object name="FastCar" type="MyApp.Car"> 
    <constructor-arg> 
     <ref object="FastEngine"> 
    </constructor-arg> 
    </object> 
    <object name="SlowCar" type="MyApp.Car"> 
    <constructor-arg> 
     <ref object="SlowEngine"> 
    </constructor-arg>  
    </object> 
    <object name="FastEngine" type="MyApp.FastEngine"/> 
    <object name="SlowEngine" type="MyApp.SlowEngine"/> 
</objects> 
+0

很酷,我見過春天提到過,但我沒有追求任何進一步的閱讀。我會檢查出來的。謝謝! – 2010-06-09 00:55:20