Castle Windsor - 作为xml中组件的参数的复杂类型列表

时间:2013-10-24 14:21:54

标签: c# castle-windsor

我的xml配置文件中有一个组件,它包含一系列菜单项。这很好用,每个菜单项都适当填充其值。

其中一个值chart是一个复杂类型,它本身包含两个字符串和一个复杂类型列表。图表中的列表未正确填充,并且始终包含一个元素,其属性都设置为其默认值。

这是我的xml文件的参数部分:

<menuItems>
      <array>
          <item>
            <id>1</id>
            <chart>
              <title>Chart Title</title>
              <series>
                  <list>
                     <item>
                      <id>1</id>
                      <name>Series Title</name>
                     </item>
                  </list>
              </series>
            </chart>
          </item>
     </array>
</menuItems>

我的相关课程:

[Convertible]
public class QueryMenuItem
{
    public int Id { get; set; }
    public Chart Chart { get; set; }
}

[Convertible]
public class Chart
{
    public string Title{ get; set; }
    public IList<ChartSeries> Series { get; set; }
}

[Convertible]
public class ChartSeries
{
    public int Id { get; set; }
    public string Name { get; set; }
}

如何让Castle Windsor正确填充系列列表?

1 个答案:

答案 0 :(得分:0)

对于那些仍在寻找解决方案的人......我已经删除了Series的节点并且它正常工作(检查3.2.0.0):

<menuItems>
  <array>
    <item>
      <id>1</id>
      <chart>
        <title>Chart Title</title>
        <Series>
          <item>
            <id>1</id>
            <name>Series Title</name>
          </item>
          <item>
            <id>2</id>
            <name>Series Title2</name>
          </item>
        </Series>
      </chart>
    </item>
  </array>
</menuItems>

技术说明:在解析&lt; Series&gt;时似乎它已经知道它是通用列表,所谓的 GenericListConverter.PerformConversion 与&lt; Series&gt;作为配置节点。并且 PerformConversion 正在调用 ListHelper&lt; T&gt; .ConvertConfigurationToCollection 并传递树中子节点的列表。

因此,如果我们将项目包装在&lt; list&gt;中它被处理为具有单个项目“list”的集合(并且没有具有id和name值的直接子节点,因此使用默认值。)

如果我们省略&lt; list&gt;节点,而不是 ListHelper&lt; T&gt; .ConvertConfigurationToCollection 接收2个子节点 - 正确解析的“项目”。

Sources of castle

并链接到GenericListConverter.cs