2010-07-21 34 views
7

Có cách nào để tạo phần cấu hình cho phép một thân thể XML tự do? Làm thế nào tôi sẽ nhận được rằng cơ thể tự do trong mã?Cấu trúc phần cấu hình XML dạng tự do trong app.config

Ví dụ tôi muốn tạo một ModuleConfigurationSection như thế này:

<modules> 
    <module name="ModuleA" type="My.Namespace.ModuleA, My.Assembly"> 
     <moduleConfig> 
      <serviceAddress>http://myserver/myservice.svc</serviceAddress> 
     </moduleConfig> 
    </module> 
    <module name="ModuleB" type="My.Namespace.ModuleB, My.OtherAssembly"> 
     <moduleConfig> 
      <filePath>c:\directory</filePath> 
     </moduleConfig> 
    </module> 
</modules> 

Vì vậy, một số mã sẽ quay lên mỗi một trong các loại mô-đun từ phần cấu hình sử dụng ConfigurationManager.GetSection("modules") và tôi muốn vượt qua XML bên trong phần tử moduleConfig dưới dạng giá trị cấu hình mờ đối với hàm tạo của lớp mô-đun.

Bất kỳ đầu vào nào được đánh giá cao!

Trả lời

10

Đây là cách tôi đã kết thúc thực hiện điều này:

public class ModuleElement : ConfigurationElement 
{ 
    [ConfigurationProperty("name", IsRequired = true)] 
    public string Name 
    { 
     get { return (string)base["name"]; } 
     set { base["name"] = value; } 
    } 

    XElement _config; 
    public XElement Config 
    { 
     get { return _config; } 
    } 

    protected override bool OnDeserializeUnrecognizedElement(string elementName, System.Xml.XmlReader reader) 
    { 
     if (elementName == "config") 
     { 
      _config = (XElement)XElement.ReadFrom(reader); 
      return true; 
     } 
     else 
      return base.OnDeserializeUnrecognizedElement(elementName, reader); 
    } 
} 

Vì vậy, xml sẽ trông như thế:

<module name="ModuleA"> 
    <config> 
     <filePath>C:\files\file.foo</filePath> 
    </config> 
</module> 

Phần nội dung của các yếu tố cấu hình có thể là bất kỳ xml freeform mà bạn thích. Giả sử bạn thiết lập một bộ sưu tập, khi bạn thực hiện ConfigurationManager.GetSection("modules"), bạn có thể truy cập thuộc tính Config của mỗi đối tượng ModuleElement làm XElement đại diện cho XML của nút phần tử cấu hình.

1

Trong ứng dụng của tôi, tôi không thể sử dụng .NET 3.5 Framework. Tôi đã sử dụng cách tiếp cận hơi khác và đưa ra đoạn mã này:

public class ModuleSection : ConfigurationSection 
{ 
    private const string ELEMENT_NAME_CONFIG = "config"; 

    private XmlNode _configNode; 

    [ConfigurationProperty("name", IsRequired = true)] 
    public string Name 
    { 
     get { return (string)base["name"]; } 
     set { base["name"] = value; } 
    } 

    public XmlNode Config 
    { 
     get { return _configNode; } 
    } 

    protected override bool OnDeserializeUnrecognizedElement(string elementName, XmlReader reader) 
    { 
     if(elementName.Equals(ELEMENT_NAME_CONFIG, StringComparison.Ordinal)) { 
      // Add the unrecognized element. 
      _configNode = _xmlDocument.ReadNode(reader); 
      return true; 
     } else { 
      return base.OnDeserializeUnrecognizedElement(elementName, reader); 
     } 
    } 
} 
+0

Bạn có thể nghiền bỏ 'XmlNode' cho phần tử mà bạn muốn giống như trong câu trả lời của tôi, nơi tôi lưu' XElement' . Tôi đã cập nhật mã của bạn để hiển thị điều này. – joshperry

Các vấn đề liên quan