代码之家  ›  专栏  ›  技术社区  ›  Andreas

原始类型和IOC容器

  •  6
  • Andreas  · 技术社区  · 16 年前

    使用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 回复  |  直到 16 年前
        1
  •  4
  •   Gerrie Schenck    16 年前

    为此创建另一个接口。

    然后你会得到如下信息:

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

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

        2
  •  3
  •   Julian Birch    16 年前

    我不确定您的困难是值类型还是具体类型。两者都不是问题。您不需要引入一个配置接口(如果您想将相同的参数传递给多个对象,这很有用,但在您给出的情况下不需要)。无论如何,这里是温莎流利的代码,我相信很快就会有人提交一个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")
                    )
                );
    
        3
  •  1
  •   flq    16 年前

    视情况而定。IOC容器结构映射允许您在执行开始配置实例时声明这些依赖项。

    例如在登记处

    ForRequestedType<Pinger>()
      .TheDefault.Is.OfConcreteType<Pinger>()
      .WithCtorArg("timeout").EqualTo(5000)
      .WithCtorArg("targetMachine").EqualToAppSetting("machine");
    
        4
  •  1
  •   Andy    16 年前

    在Spring中,可以使用$propertyname符号从属性文件中查找属性值。

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

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

    推荐文章