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 回答