繁体   English   中英

如何通过代码为特定任务配置IoC容器

[英]How to configure IoC container by code for certain task

我有一个函数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) {/*...*/}

我的问题是如何使用代码(无XML)配置此container

我不介意使用哪种容器-这只是我使用IoC容器的第一步,我想大致了解它是如何完成的。

使用企业库统一容器,您可以执行此操作

    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始终返回相同的实例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM