想象一下:
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”解决方案: - )
答案 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>