原始类型和IoC容器

时间:2009-01-29 09:56:19

标签: dependency-injection inversion-of-control

使用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和字符串构造函数参数?

4 个答案:

答案 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提供了相同的功能,它具有相同的语法,并在配置文件中使用名称值部分。