10
votes

Existe-t-il un moyen de créer un xdocument immuable (en lecture seule)?

J'ai une API qui renvoie Xelement 's, et je veux que le document derrière ces xelement soit immuable (lecture seule). J'en ai besoin pour:

  • ne pas donner à DevS une capacité à changer accidentellement :)
  • Amélioration des performances - Création d'une copie d'un xdocument peut être une opération "Heavy" performance dans certains cas.

    Il ne semble pas hériter et remplacer le comportement nécessaire dans xdocument / xelement / xcontainer , car toutes les méthodes virtuelles là-bas sont marquées comme interne : xxx

    donc ma question est - y a-t-il un moyen de le faire arriver, ou il vaut mieux avoir une API différente qui retournera quelque chose comme xpathnavigator 's, ou il est préférable d'avoir de propres classes comme iReadonlyXElement , etc.


0 commentaires

3 Réponses :


5
votes

Vous pouvez créer un xelement wrapper similaire à lisonlycollection . xxx


0 commentaires

3
votes

IMHO, il est probablement préférable de faire votre propre classe d'emballage pour interagir avec des xdocuments / xelements. Vous pouvez ensuite limite la capacité d'un dev d'écrire sur le fichier dans le code.

Je dis limite car avec suffisamment d'informations (emplacement, schéma (si nécessaire), un développeur pourrait utiliser le stock xmlclasses pour faire ce qu'ils voulaient. La fin soit tout aurait tout aurait de faire le fichier sur disque sur disque et de vous assurer qu'ils (Devs, utilisateurs) n'ont pas la permission de modifier l'accès en lecture seule sur le fichier.


0 commentaires

12
votes

Je doute que l'AUTOR attend toujours des réponses, mais peut-être que quelqu'un d'autre le trouvera utile.

Vous pouvez également rendre le xdocument immuable à l'aide de son événement changeant: P>

    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


0 commentaires