使用IoC容器时如何处理原始类型?
即。鉴于你有:
class Pinger {
private int timeout;
private string targetMachine;
public Pinger(int timeout, string targetMachine) {
this.timeout = timeout;
this.targetMachine = targetMachine;
}
public void CheckPing() {
...
}
}
如何获取int和字符串构造函数参数?
答案 0 :(得分:4)
为此创建另一个界面。
然后你会得到类似的东西:
public Pinger(IExtraConfiguration extraConfig)
{
timeout = extraconfig.TimeOut;
targetmachine = extraconfig.TargetMachine;
}
我不知道其他IOC容器,但Castle Windsor会自动解析这些额外的构造函数参数。
答案 1 :(得分:3)
我不确定你的难度是值类型还是具体类型。两者都不是问题。您不需要引入配置界面(如果您想将相同的参数传递给多个对象,则它很有用,但在您给出的情况下则不然)。无论如何,这是Windsor流利的代码,我相信很快就会有人提交XML版本。
container.Register(
Component.For(typeof(Pinger))
.ImplementedBy(typeof(Pinger)) // This might not be necessary
.Parameters(Parameter.ForKey("timeout").Eq("5000"),
Parameter.ForKey("targetMachine").Eq("machine")
)
);
答案 2 :(得分:1)
这取决于。 IoC-Container StructureMap允许您在执行开始时配置实例时声明这些依赖项。
e.g。在注册表中
ForRequestedType<Pinger>()
.TheDefault.Is.OfConcreteType<Pinger>()
.WithCtorArg("timeout").EqualTo(5000)
.WithCtorArg("targetMachine").EqualToAppSetting("machine");
答案 3 :(得分:1)
在Spring中,可以使用$ {propertyName}表示法
从属性文件中查找属性值<bean class="blah.Pinger">
<constructor-arg value="${blah.timeout}"/>
<constructor-arg value="${blah.targetMachine}"/>
</bean>
在Spring.net中,PropertyPlaceholderConfigurer提供了相同的功能,它具有相同的语法,并在配置文件中使用名称值部分。