在Windsor中使用外部配置文件选择正确的构造函数?

时间:2010-01-11 07:16:34

标签: castle-windsor

我是温莎的新手,但我确信必须有办法做到这一点......

我有一个有三个不同构造函数的类:

public MyClass(string SomeParam)
{
...
}

public MyClass(string AnotherParam, string YetAnother)
{
...
}

public MyClass(string AnotherOne, string YeahIKnow, string AnnoyingExampleParam)
{
...
}

在我的外部配置文件中,我的服务定义为:

<component
  id="IMyClass"
  service="IMyInterface, MyAssembly"
  type="MyClass, MyOtherAssembly">

  <parameters>
    <AnotherOne>string value #1</AnotherOne>
    <YeahIKnow>string value #2</YeahIKnow>
    <AnnoyingExampleParam>string value #3</AnnoyingExampleParam>
  </parameters>

</component>

当Windsor初始化我的类的一个实例时,它只想使用我的类的第一个(单个字符串参数)构造函数初始化,当我真的希望Windsor使用第三个构造函数时。

我没有在文档中看到任何关于使用外部配置强制内核给我们一个特定构造函数的文档,即使我可以找到在代码中执行它的引用,但是那种方法违背了外部配置的目的!

任何建议都将受到赞赏。

最佳,

David Montgomery

2 个答案:

答案 0 :(得分:1)

什么版本的城堡?我记得,从早上4点钟记忆的深处,到了Castle 2.0的构造函数工作的解决方案。

嗯,哼哼,记忆稍微回来......有些东西告诉我,Castle会用第一个公共ctor构建对象。可能就像将你想要的城堡加载到顶部一样简单。

如果这对您不起作用,可能会稍微重构您的代码?

选项1)将前两个构造函数设为内部。

选项2)对复杂对象使用工厂模式,这将使用后端的城堡来创建更简单或复杂的版本。

选项3)从基础超类创建3个类,每个类都有一个更复杂的构造函数。这样,您可以在Castle配置文件中具体确定要加载哪些服务。例如:

public abstract class BaseClass
{
  public BaseClass(String requiredParam)
  {
    ...
  }
}

public class SimpleClass : BaseClass
{
  public SimpleClass(String requiredParam, String anotherParam)
    : base(requiredParam)
  {
    ...
  }
}


public class MoreComplexClass : SimpleClass 
{
  public MoreComplexClass (String requiredParam, String anotherParam, String yetAnother)
    : base(requiredParam, anotherParam)
  {
    ...
  }
}

但是,我自己还没有碰到这个。主要是因为我坚持只在我的课程上公开1 ctor,有一些私人/内部ctors用于Linq这样的事情,用空的ctor来修改我的对象(因为Linq不支持依赖注入,嘘)。

请注意,在最后一个语句中,内部ctors,我的SRP(单一责任模式)用于解析我的IoC组件是外部的,在一个单独的高组件(即应用程序或UI层)中。由于它不在我的域对象内部,因此Castle不会看到内部ctors。

答案 1 :(得分:0)

你一定做错了。

Windsor使用它可以满足的最贪婪的构造函数。如果它使用较小的一个,你可能有一些错字?

当您的类型是服务时,您不必同时指定

  service="MyClass, MyAssembly"
  type="MyClass">

删除type