Question

J'ai une API que les rendements XElement 's, et je veux le document derrière les XElement est d'être immuable (lecture seule). J'ai besoin pour:

  • Ne pas donner devs une capacité de changer accidentellement:)
  • Amélioration des performances -. La création d'une copie d'un XDocument pourrait être une opération « lourde » de la performance dans certains cas,

Il ne semble pas possible d'hériter et remplacer le comportement nécessaire XDocument / XElement / XContainer, parce que toutes les méthodes virtuelles là sont marquées comme internal:

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

Alors ma question est - est-il une marque de façon y arriver, ou il est préférable d'avoir une API différente qui soit quelque chose de retour comme celui XPathNavigator, ou il est préférable d'avoir des classes propres comme IReadOnlyXElement, etc.?

Était-ce utile?

La solution

Vous pouvez créer une enveloppe de XElement qui est similaire à 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);
        }
    }
}

Autres conseils

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

Vous pouvez faire de type de l'immuable XDocument en utilisant son événement Modification:

    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

Pas la solution plus belle, mais il fournit un mécanisme de base empêchant toute modification accidentelle.

à mon humble avis, il est probablement mieux de faire votre propre classe wrapper pour interagir avec XDocuments / XElements. Vous pouvez alors limite la capacité d'un dev d'écrire sur le fichier dans le code.

Je dis limite parce que suffisamment d'informations (emplacement, schéma (si nécessaire)) un développeur peut utiliser le stock XMLClasses pour faire ce qu'ils voulaient. La fin tout être tout serait de rendre le fichier en lecture seule sur le disque et assurez-vous qu'ils (devs, utilisateurs) ne sont pas autorisés à modifier l'accès en lecture seule sur le fichier.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top