0

我有一個函數,MyFunc,接收的IDoer配置IoC容器。我想通過不同的實現和不同的初始化:如何通過代碼特定任務

var types = new IDoer[]{typeof(Walker),typeof(Runner),typeof(Sweamer)}; 
var strings = new[]{"abc","xyz","zoo","cat","dog"}; 

foreach(var type in types) { 
    foreach(var str in strings) { 
     IDoer doer = container.ResolveWithParams(type, str, RandomizeInteger());    
     MyFunc(doer, str); 
    } 
} 

甚至更​​好:

var strings = new[]{"abc","xyz","zoo","cat","dog"}; 

foreach(var type in types) { 
    foreach(var str in strings) { 
     IDoer doer = container.ResolveWithParams<Walker>(type, str, RandomizeInteger()); 
     MyFunc(doer, str); 
     doer = container.ResolveWithParams<Runner>(type, str, RandomizeInteger()); 
     MyFunc(doer, str); 
     doer = container.ResolveWithParams<Sweamer>(type, str, RandomizeInteger()); 
     MyFunc(doer, str); 
    } 
} 

例如,Walker的構造是:

public Walker(/*lots of params...*/, 
       string importantString, /*other params...*/, 
       int importantInteger,/*even more params...*/) {/*...*/} 

Runner的是:

public Runner(string importantString, /*some params...*/, 
       int importantInteger,/*additional different set of data...*/) {/*...*/} 

Sweamer的:

public Sweamer(string importantString, int importantInteger) {/*...*/} 

我的問題是如何配置此container使用代碼(沒有XML)?

我不介意這一種容器 - 這只是我使用IoC容器的第一步,我想一般的學習它是如何正在做。

+1

此URL有幫助嗎? http://msdn.microsoft.com/en-us/library/ff648211.aspx – Egor4eg

+0

詳細的,請看點「5」 Egor4eg的鏈接:'如果你想創建一個以上的註冊或映射爲同一類型,可以通過指定一個名稱作爲參數來創建一個命名(非默認)映射。給每個人一個獨特的名字,然後用這個名字叫出來。 –

+0

@ Egor4eg:我最初以爲 - 是的,但參數是類型。我不想那樣。我希望參數是輸入參數。我寧願將問題轉移到編譯階段... – Tar

回答

1

與企業庫統一的容器,你可以做到這一點

container.RegisterType<ITestClass, TestClass1>("TestClass1"); 
    container.RegisterType<ITestClass, TestClass2>("TestClass2"); 

    var class0 = new TestClass3(); 
    container.RegisterInstance<ITestClass>(class0); 

    var class1 = container.Resolve<TestClass1>(); 
    var class2 = container.Resolve<TestClass2>(); 
    var class3 = container.Resolve<ITestClass>("TestClass1"); 
    var class4 = container.Resolve<ITestClass>("TestClass3"); 

錯過參數構造函數如果元素注入價值沒有做別的用ParameterOverride

的集合
...Resolve<TestClass1>(new []{ 
      new ParameterOverride("str", str), 
      new ParameterOverride("num", RandomizeInteger())}); 

其中「str」和「num」是構造函數的屬性名稱。

assumming構造是

public TestClass1(string str, int num) 

這個例子使用魔法字符串,它不好用,但它是最貼近的例子。 注意:示例testclass3總是返回相同的實例。

+0

我不明白從這個例子中,我如何將'str'和'RandomizeInteger()'參數從容器傳遞給具體類型的構造函數......? – Tar

+0

我不明白你希望容器使用這些值生成一個新的實例,還是獲得已經生成的實例具有所需的值? –

+0

我想要的容器,產生一個新的實例,但通過這個新的實例'str'和'RandomizeInteger()'(例如)參數 – Tar