2010-08-27 5 views
9

Tôi có một API trả về XElement và tôi muốn tài liệu đằng sau những số XElement không thể thay đổi được (chỉ đọc). Tôi cần nó cho:Có cách nào để tạo một XDocument không thay đổi (chỉ đọc) không?

  • Không để cung cấp cho các nhà phát triển một khả năng để thay đổi nó vô tình :)
  • Cải thiện hiệu suất - tạo ra một bản sao của một XDocument có thể là một buổi biểu diễn "nặng" hoạt động trong một số trường hợp.

Nó không có vẻ để có thể kế thừa & ghi đè các hành vi cần thiết trong XDocument/XElement/XContainer, bởi vì tất cả các phương pháp ảo có được đánh dấu là internal:

internal virtual void XContainer.AddAttribute(XAttribute a) 
{ 
} 

Vì vậy, câu hỏi của tôi là - là có một cách làm cho nó xảy ra, hoặc nó là tốt hơn để có một API khác nhau mà sẽ hoặc trả lại một cái gì đó như XPathNavigator 's, hoặc nó là tốt hơn để có các lớp học riêng như IReadOnlyXElement, vv?

Trả lời

4

Bạn có thể tạo một wrapper XElement tương tự như ReadOnlyCollection<T>.

public sealed class ReadOnlyXElement 
{ 
    private readonly XElement _element; 


    public string Value 
    { 
     get { return _element.Value; } 
    } 


    public ReadOnlyXElement(XElement element) 
    { 
     _element = element; 
    } 


    public IEnumerable<ReadOnlyXElement> Elements() 
    { 
     foreach (var child in _element.Elements()) 
     { 
      yield return new ReadOnlyXElement(child); 
     } 
    } 

    public IEnumerable<ReadOnlyXElement> Elements(XName xname) 
    { 
     foreach (var child in _element.Elements(xname)) 
     { 
      yield return new ReadOnlyXElement(child); 
     } 
    } 
} 
3

IMHO, tốt hơn hết là bạn nên tạo lớp trình bao bọc của riêng bạn để tương tác với XDocuments/XElements. Sau đó, bạn có thể giới hạn khả năng của một nhà phát triển viết lên tệp trong mã.

Tôi nói giới hạn vì có đủ thông tin (vị trí, lược đồ (nếu cần)) nhà phát triển có thể sử dụng XMLClasses để thực hiện bất kỳ thứ gì họ muốn. Cuối cùng tất cả sẽ là để làm cho các tập tin chỉ đọc trên đĩa và chắc chắn rằng họ (devs, người dùng) không có quyền thay đổi quyền truy cập chỉ đọc trên tập tin.

12

Tôi nghi ngờ rằng autor vẫn đang chờ câu trả lời, nhưng có lẽ ai đó sẽ thấy nó hữu ích.

Bạn có thể loại của làm cho XDocument bất biến bằng cách sử dụng sự kiện thay đổi của nó:

class Program 
    { 
     static void Main(string[] args) 
     { 
      var xdoc = XDocument.Parse("<foo id=\"bar\"></foo>"); 
      xdoc.Changing += (s, ev) => 
      { 
       throw new NotSupportedException("This XDocument is read-only"); 
      }; 

      try 
      { 
       xdoc.Root.Attribute("id").Value = "boo"; 
      } 
      catch (Exception e) 
      { 
       Console.WriteLine("EXCEPTION: " + e.Message); 
      } 

      Console.WriteLine("ID on exit: " + xdoc.Root.Attribute("id").Value); 

      Console.ReadKey(); 
     } 
    } 

// Console output: 
// EXCEPTION: This XDocument is read-only 
// ID on exit: bar 

Không phải là giải pháp đẹp nhất, nhưng nó cung cấp một cơ chế cơ bản ngăn chặn những thay đổi ngẫu nhiên.