2010-08-27 17 views
9

Mam API, który zwraca XElement i chcę, aby dokument za tymi XElement jest niezmienny (tylko do odczytu). Muszę go:Czy istnieje sposób utworzenia niezmiennego (tylko do odczytu) dokumentu XD?

  • nie dać DEVS zdolność do zmiany przypadkowo :)
  • Zwiększanie wydajności - tworząc kopię XDocument może być wydajność „ciężkich” operacja w niektórych przypadkach.

To nie wydaje się możliwe, aby odziedziczyć & nadpisanie niezbędne zachowanie w XDocument/XElement/XContainer, ponieważ wszystkie metody wirtualne nie są oznaczone jako internal:

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

Więc moje pytanie jest - jest istnieje sposób, aby to się stało, lub lepiej jest mieć inny interfejs API, który albo zwróci coś w rodzaju XPathNavigator, albo lepiej mieć własne klasy, takie jak IReadOnlyXElement itd.?

Odpowiedz

4

Można utworzyć opakowanie typu XElement podobne do 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, to chyba lepiej zrobić własne klasy otoki do interakcji z XDocuments/XElements. Możesz wtedy limit zdolność programisty do zapisu pliku w kodzie.

Mówię, że limit ponieważ z wystarczającą ilością informacji (lokalizacja, schemat (w razie potrzeby)) deweloper może korzystać z XMLClasses akcji, aby zrobić, co chcieli. Koniec końców wszystko byłoby zrobić plik tylko do odczytu na dysku i upewnij się, że (deweloperzy, użytkownicy) nie mają uprawnień do zmiany dostępu tylko do odczytu w pliku.

12

Wątpię, czy autor wciąż czeka na odpowiedzi, ale może ktoś inny uzna to za przydatne.

Można na rodzaj uczynić XDocument niezmienna przy użyciu jego Zmiana wydarzenie:

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 

Nie najpiękniejszy rozwiązanie, ale ma stanowić podstawowy mechanizm zapobiegający przypadkowemu zmiany.

Powiązane problemy