2011-05-20 82 views
1

構造帶參數的想象以下:集類型的XmlElement從XML Spring.NET的IoC配置

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

我想要實例使用Spring.NET和XmlApplicationContext這個類。 從均應包含在XmlApplicationContext配置文件中,因此可以容易地編輯所產生的的XmlElement的XML。

因此,它應該是這個樣子:

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

< ???>應在注射的XmlElement元素。

有什麼辦法可以達到這個目的嗎?

我知道我可以通過一個文件名,並用手裝入內XML。如果沒有辦法做到這一點,這將是解決方案。但是爲了方便用戶我最喜歡:-)

回答

1

的「嵌入XML」的解決方案,您可以使用一個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>