2

A.簡單的問題。統一:默認和條件解析

我有3個「存儲庫」實例取決於「配置」。

class Manager{ 
    public Manager(Configuration conf){ 
... 

3個實例解決策略:

container.RegisterType<Repository>("ForService1"); 
container.RegisterType<Repository>("ForService2"); 
container.RegisterType<Repository>("ForService3"); 

(3,因爲它們具有不包含到樣品的附加參數,即總是不同的參數)

和「默認」的配置

container.RegisterType<Configuration>(new InjectionConstructor(new object[] { false, true })); 

我想提供重新定義t他在配置文件中配置一個且只有一個實例。

<register type="Configuration" 
       name="**ForService2**"> 
     <constructor> 
     <param name = "useOptimization1" value="True"/> 
     <param name = "useOptimization2" value="True"/> 
     </constructor> 
    </register> 

,並希望避免有在擴展類似三重配置:

container.RegisterType<Configuration>("ForService1", new InjectionConstructor(new object[] { false, true })); 
container.RegisterType<Configuration>("ForService1", new InjectionConstructor(new object[] { false, true })); 
container.RegisterType<Configuration>("ForService2", new InjectionConstructor(new object[] { false, true })); 

這可能嗎?怎麼樣?

B.複雜的問題。

我感覺IoC工具不是關於配置。嘗試配置基礎設施丟棄IoC配置文件 - 又是一個反模式。或更短:「配置信息數據不是依賴性」。我對嗎?

讓我們觀察EntLib的列表器配置。 真的,EntLib的日誌監聽器配置是「後期綁定」還是「配置方式」?首先,這是「後期綁定」(因爲我們指出了類型名稱 - 要創建哪個程序集和Loa以及對象),這也是「配置」(我們有自定義配置部分)。我覺得大多數IoC追隨者會選擇容器的啓用「配置」,對嗎? 但EntLib人選擇配置部分。 可能是這個自定義配置部分日誌監聽器的配置將改變容器的配置,並且「監聽器配置」應該如何與容器配置相關?

回答

1

我想確認最好的方法是從代碼配置容器,甚至不僅僅是從代碼配置容器,而是從明智的覆蓋代碼。 終極樣本是從「構造lambda表達式庫」的EntLib的配置:

http://msdn.microsoft.com/en-us/magazine/ee335709.aspx

yield return new TypeRegistration<Database>(
     () => new SqlDatabase(
      ConnectionString, 
      Container.Resolved<IDataInstrumentationProvider>(Name))) 
     { 
      Name = Name, 
      Lifetime = TypeRegistrationLifetime.Transient 
     }; 

這樣的結構將在後面解釋建集裝箱配置!

1

回答

使用的容器與約定優於配置的支持。你可以看到一個比較圖表here

應答b

正確的,國際奧委會不應該是配置。相反,prefer code as configuration,優選地以編碼慣例的形式。

+0

謝謝你的回答,馬克。但是我需要補充一點,在閱讀「首選代碼作爲配置」鏈接後,我仍然不同意你的配置和「後期綁定」之間有明確的粗線。我已經向該問題添加了示例。 –