6

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

4

4 回答 4

4

为此制作另一个界面。

然后你会得到类似的东西:

public Pinger(IExtraConfiguration extraConfig)
{
   timeout = extraconfig.TimeOut;
   targetmachine = extraconfig.TargetMachine;
}

我不知道其他 IOC 容器,但 Castle Windsor 会自动解析这些额外的构造函数参数。

于 2009-01-29T10:01:17.670 回答
3

我不确定您的困难是值类型还是具体类型。两者都不是问题。您不需要引入配置接口(如果您想将相同的参数传递给多个对象,这很有用,但在您给出的情况下则不然)。无论如何,这是Windsor fluent 代码,我相信很快就会有人提交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")
                )
            );
于 2009-01-29T18:33:41.643 回答
1

这取决于。当您在执行开始时配置实例时,IoC-Container StructureMap 将允许您声明这些依赖项。

例如在注册表中

ForRequestedType<Pinger>()
  .TheDefault.Is.OfConcreteType<Pinger>()
  .WithCtorArg("timeout").EqualTo(5000)
  .WithCtorArg("targetMachine").EqualToAppSetting("machine");
于 2009-01-29T10:06:13.243 回答
1

在 Spring 中,可以使用 ${propertyName} 表示法从属性文件中查找属性值

<bean class="blah.Pinger">
    <constructor-arg value="${blah.timeout}"/>
    <constructor-arg value="${blah.targetMachine}"/>
</bean>

在 Spring.net 中,PropertyPlaceholderConfigurer 提供了相同的功能,它具有相同的语法,并在配置文件中使用名称值部分。

于 2009-01-29T10:26:18.320 回答