2011-01-05 3 views
2

Ich schreibe eine Wrapping-Bibliothek um eine SCADA Datenbank und ich habe eine kleine 'Hippie-Code-Design' Frage. Es geht darum, wie ich die gelieferten DB-Objekte in POCOs umwandle.Erstellen von verschiedenen POCOs von einem einzigen Typ

Ich rufe die DB mit den Anbietern .NET-Bibliotheken.

Wenn ich die DB aufruft, gibt es ein Objekt vom Typ DBObject zurück. Dies kann alles in der Datenbank darstellen und ist daher ziemlich allgemein in den Informationen, die es enthält. Mit einem Methodenaufruf DBObject.GetProperty() wird aus dem DB auf jede benutzerdefinierte Information zugegriffen, für die die Verbindung zur DB aktiv sein muss.

Ich bin auf der Suche, um diese grundlegende DBObject in eine Vielzahl von verschiedenen POCO's zu konvertieren, so dass ich sie über WCF und andere Technologie weitergeben kann.

Zur Zeit habe ich eine abstrakte Basisklasse ScadaObject genannt, die eine Anzahl von Basiseigenschaften haben, dass ich all das die POCO enthalten soll und eine geschützte virtuelle Methode namens InternalFromDBObject(DBObject obj), die aus den DBObject in die POCO dieses Schaffen führt.

In meinen abgeleiteten Typen überschreibe ich diese Methode, rufe base.InternalFromDBObject(obj) als ersten Aufruf auf, fahre dann mit dem Laden von benutzerdefinierten/spezifischen Informationen fort. Ich habe dann eine statische Methode auf dem POCO namens FromDBObject(), die eine neue Instanz dieses POCO zurückgibt.

Ist das ein guter Weg, Dinge zu tun? Ich bin nicht sehr erfahren in der Verwendung von Fabriken, so dass ich nicht sicher bin, ob sie passen würden. Gibt es noch andere Entwurfsmuster, die ich verwenden könnte?

+0

als die meisten Ansätze genauso schmerzhaft scheint, ich habe gesehen :( – leppie

Antwort

0

Sie können Ihre POKO-Klassen erstellen, ohne von nichts abzuleiten, fügen Sie einfach Ihren öffentlichen POKO-Eigenschaften den passenden Namen und Typ des zurückgegebenen DBObject hinzu. Dann können Sie eine externe statische Klasse erstellen, indem Sie ein DBobject (und eine Sammlung von DBObject) nehmen und eines (oder eine Sammlung von) POO zurückgeben.

static class ScadaTOPoco 
{ 
    public static TPoco Create<TPoco>(DbObject sb){...} 
    public static IEnumerable<TPoco> Create<TPoco>(IEnumerable<DbObject> sb){...} 
} 

Jede Methode kann intern:

  • Poco
  • Verwenden Reflexion Instantiate eine Liste der öffentlichen Eigenschaften auf der

  • Schleife POCO auf jede Eigenschaft zu erhalten, und durch die Verwendung DBObject .GetProperty weist den Wert im Ziel-Poco-Objekt zu. Stellen Sie sicher, dass Sie den Wert konvertieren, indem Sie Convert.ChangeType aufrufen, um im Ziel-Eigenschaftstyp in den richtigen Wert zu konvertieren.

Wenn die Eigenschaftsnamen in der scada nicht die .NET Namensgebung Konvektion passt, Sie einige Konvention von scada zur Karte einbetten können auf .NET ...

Verwandte Themen