如何在castle-windsor的xml配置中配置泛型类型参数?

时间:2014-01-21 12:49:18

标签: c# castle-windsor xml-configuration

我已经关注了代码:

public class TestClass
{
    public string Foo { get; set; }
    public ITest<string> Test { get; set; }
}

[Convertible]
public interface ITest<T>
{
    T Param { get; set; }
}

[Convertible]
public class Test<T> : ITest<T>
{
    public T Param { get; set; }
    public string OtherParam { get; set; }
}

我想用它

WindsorContainer container = new WindsorContainer(new XmlInterpreter());
var t = container.Resolve<TestClass>();

我不想使用Fluent配置而是使用xml配置。另外,我想逃避ITest组件的显式注册。它是lloks,它可以只配置一个组件注册(TestClass),所有参数都可以在&lt; parameters&gt;中提供。节点。但是目前我无法创建工作配置,它创建 null TestClass对象或TestClass,并将Test属性设置为 null

我的配置:

  <component id="Service.Main"
         type="ConsoleApplication1.TestClass"
         lifestyle="transient">
    <parameters>
      <foo>foo string</foo>
      <Test>
        <Param>param string</Param>
        <OtherParam>sdgsdfgdf</OtherParam>
      </Test>
    </parameters>
  </component>

也许有人可以建议正确的配置?日Thnx

1 个答案:

答案 0 :(得分:2)

所以,我得到了3.2.0版本的来源。 添加简单的控制台应用程序,并通过调试检查不同的版本。

这是工作解决方案:

  <component id="Service.Main"
         type="ConsoleApplication1.TestClass"
         lifestyle="transient">
    <parameters>
      <foo>foo string</foo>
      <Test>
        <parameters type="ConsoleApplication1.Test`1[[System.String, mscorlib]], ConsoleApplication1">
          <Param>param string</Param>
          <OtherParam>sdgsdfgdf</OtherParam>
        </parameters>
      </Test>
    </parameters>
  </component>

重要说明:

  1. 我们应该用于后续的复杂属性,否则它不能“看到”所有参数列表。它只有第一个孩子:ConfigurationParametersInspector.cs, line 58
  2. 我们应该使用接口类型显式设置由属性表示的参数类型。我们可以预期 type 属性应该用于&amp; ltTest&gt;但实际上,只有子XML节点传递给选择属性类型的方法
  3. 无论如何使用3.2.0检查配置并且它可以工作。