[英]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.