Frage

Im Anschluss an meine letzte Frage Große, komplexe Objekte als Web-Service-Ergebnis.Ich habe darüber nachgedacht, wie ich sicherstellen kann, dass alle zukünftigen untergeordneten Klassen in XML serialisierbar sind.

Nun, offensichtlich konnte ich das umsetzen IXmlSerialisierbar Schnittstelle erstellen und dann ein Lese-/Schreibgerät daran anschließen, aber das möchte ich vermeiden, da es dann bedeutet, dass ich ein Lese-/Schreibgerät instanziieren muss, wann immer ich es tun möchte, und in 99,99 % der Fälle werde ich mit einem arbeiten Zeichenfolge also schreibe ich vielleicht einfach mein eigenes.

Um jedoch in XML zu serialisieren, dekoriere ich einfach die Klasse und ihre Mitglieder mit dem XML??? Attribute ( XmlRoot , XmlElement usw.) und dann an die übergeben XmlSerializer und ein StringWriter um die Zeichenfolge zu erhalten.Was alles gut ist.Ich beabsichtige, die Methode zum Zurückgeben der Zeichenfolge in eine generische Dienstprogrammmethode zu integrieren, sodass ich mir keine Gedanken über Typ usw. machen muss.

Das, was mich beschäftigt, ist Folgendes:Wenn ich die Klasse(n) nicht mit den erforderlichen Attributen verziere, wird erst zur Laufzeit ein Fehler ausgegeben.

Gibt es eine Möglichkeit, die Attributdekoration durchzusetzen?Ist das mit FxCop möglich? (Ich habe FxCop noch nicht verwendet)

AKTUALISIEREN:

Entschuldigung für die Verzögerung, Leute, es gibt viel zu tun!

Mir gefällt auf jeden Fall die Idee, Reflektion zu verwenden, um dies in einem Testfall zu tun, anstatt auf FxCop zurückzugreifen (um alles zusammenzuhalten). Fredrik Kalseths Antwort war fantastisch, vielen Dank für die Einbindung des Codes, da ich wahrscheinlich ein wenig recherchiert hätte, um selbst herauszufinden, wie man das macht!

+1 an die anderen Jungs für ähnliche Vorschläge :)

War es hilfreich?

Lösung

Ich würde einen Unit-/Integrationstest schreiben, der überprüft, ob jede Klasse, die bestimmte Kriterien erfüllt (z. B. Unterklasse X), entsprechend dekoriert ist.Wenn Sie Ihren Build für die Ausführung mit Tests einrichten, kann es passieren, dass der Build fehlschlägt, wenn dieser Test fehlschlägt.

AKTUALISIEREN:Sie sagten: „Sieht so aus, als müsste ich einfach die Ärmel hochkrempeln und sicherstellen, dass die Unit-Tests kollektiv aufrechterhalten werden“ – das müssen Sie nicht.Schreiben Sie einfach eine allgemeine Testklasse, die mithilfe von Reflektion alle Klassen findet, die bestätigt werden müssen.Etwas wie das:

[TestClass]
public class When_type_inherits_MyObject
{
    private readonly List<Type> _types = new List<Type>();

    public When_type_inherits_MyObject()
    {
        // lets find all types that inherit from MyObject, directly or indirectly
        foreach(Type type in typeof(MyObject).Assembly.GetTypes())
        {
            if(type.IsClass && typeof(MyObject).IsAssignableFrom(type))
            {
                _types.Add(type);
            }
        }
    }

    [TestMethod]
    public void Properties_have_XmlElement_attribute
    {
        foreach(Type type in _types)
        {
            foreach(PropertyInfo property in type.GetProperties())
            {
                object[] attribs = property.GetCustomAttributes(typeof(XmlElementAttribute), false);
                Assert.IsTrue(attribs.Count > 0, "Missing XmlElementAttribute on property " + property.Name + " in type " + type.FullName);
            }
        }
    }
}

Andere Tipps

Sie können Unit-Tests schreiben, um solche Dinge zu überprüfen – dabei wird grundsätzlich Reflexion verwendet.

Angesichts der Tatsache, dass dies möglich ist, denke ich, dass es auch möglich wäre, eine FxCop-Regel zu schreiben, aber ich habe so etwas noch nie gemacht.

Sie können eine FxCop-Regel schreiben oder sogar nach Attributen suchen, indem Sie GetType() im Konstruktor der Basisklasse aufrufen und den zurückgegebenen Typ reflektieren.

Eine gute FXCop-Regel (und eine, die ich gerade brauche) wäre, zu überprüfen, ob alle Objekte, die der ASP.NET-Sitzung hinzugefügt werden, das Serializable-Attribut haben.Ich versuche, vom InProc-Sitzungsstatus zu SQL Server zu wechseln.Als ich zum ersten Mal eine Seite anforderte, explodierte meine Website, weil in Session nicht serialisierbare Objekte gespeichert wurden.Dann kam die Aufgabe, den gesamten Quellcode zu durchsuchen und nach jeder Instanz zu suchen, in der ein Objekt in der Sitzung festgelegt ist ...FXCop wäre eine schöne Lösung.Etwas, woran man arbeiten kann...

Sie können dieses Konzept/Postprozessor auch verwenden, um Beziehungen zwischen Attributen zu erzwingen, und eine ähnliche Anmeldung verwenden, um Beziehungen zwischen Klassen und Attributen zur Kompilierungszeit zu erzwingen:

http://www.st.informatik.tu-darmstadt.de/database/publications/data/cepa-mezini-gpce04.pdf?id=92

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top