0

MyFuncを受け取る関数 がありIDoerます。さまざまな実装とさまざまな初期化を渡したい:

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 コンテナーを使用する最初のステップにすぎません。一般的に、それがどのように行われているかを知りたいと思っています。

4

1 に答える 1

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" は、コンストラクターのプロパティ名です。

コンストラクターが

public TestClass1(string str, int num)

この例では魔法の文字列を使用しており、それを使用するのは悪いことですが、あなたの例に近いです。注: testclass3 の例では、常に同じインスタンスが返されます。

于 2013-07-23T10:51:05.000 に答える