从XML Spring.NET IoC配置中设置一个XmlElement类型的构造函数arg

时间:2011-05-20 09:01:42

标签: c# xml spring.net

想象一下:

class Foo {
  public Foo(XmlElement xml) { ... }
}

我想使用Spring.NET和XmlApplicationContext来实例化这个类。 生成XmlElement的XML应该包含在XmlApplicationContext配置文件中,以便可以轻松编辑。

所以看起来应该是这样的:

<objects>
  <object id="foo" type="Foo, Foo">
    <constructor-arg name="xml" ???>
      <???>
        <element1 attr="bla" />
        <element2 xyz="abc>
          <... />
        </element2>
      </???>
    </constructor-arg>
  </object>
</objects>

元素&lt; ???&gt;应该是注入的XmlElement。

有没有办法实现这个目标?

我知道我可以传递文件名并手动加载内部XML。如果没有别的办法,这将是解决方案。但为了方便用户,我最喜欢“嵌入式XML”解决方案: - )

1 个答案:

答案 0 :(得分:1)

您可以使用static factory<![CDATA[ ... ]]>

public static class XmlElementFactory
{
    public static XmlElement Create(string value)
    {
        var doc = new XmlDocument();
        doc.LoadXml(value);
        return doc.DocumentElement;
    }
}

public class Foo
{
    private readonly XmlElement _xml;
    public Foo(XmlElement xml)
    {
        _xml = xml;
    }

    public override string ToString()
    {
        return _xml.OuterXml;
    }
}

class Program
{
    static void Main()
    {
        var foo = (Foo)ContextRegistry.GetContext().GetObject("foo");
        Console.WriteLine(foo);
    }
}

并在配置文件中:

<configuration>
  <configSections>
    <sectionGroup name="spring">
      <section name="context" type="Spring.Context.Support.ContextHandler, Spring.Core"/>
      <section name="objects" type="Spring.Context.Support.DefaultSectionHandler, Spring.Core" />
    </sectionGroup>
  </configSections>

  <spring>
    <context>
      <resource uri="config://spring/objects"/>
    </context>

    <objects xmlns="http://www.springframework.net">
      <object id="foo" type="MyNs.Foo">
        <constructor-arg name="xml">
          <object type="MyNs.XmlElementFactory" factory-method="Create">
            <constructor-arg name="value">
              <value>
                <![CDATA[
                <root>
                  <element1 attr="bla" />
                  <element2 xyz="abc">
                  </element2>
                </root>
                ]]>
              </value>
            </constructor-arg>
          </object>
        </constructor-arg>
      </object>
    </objects>
  </spring>  
</configuration>