Ich muss ein Importskript (in C #) entwerfen und erstellen, das Folgendes verarbeiten kann:
- Daten aus verschiedenen Quellen lesen (XML, XSLX, CSV)
- Daten verifizieren
- Schreiben Sie die Daten in verschiedene Objekttypen (Kunde, Adresse)
Die Daten stammen aus einer Reihe von Quellen, aber eine Quelle hat immer ein Importformat (entweder csv, xml, xslx). Importformate können von Quelle zu Quelle variieren. Neue Importformate können in Zukunft hinzugefügt werden. Die Zielobjekttypen sind immer gleich (Kunde, Adresse usw.).
Ich habe über die Verwendung von Generika nachgedacht und etwas über das Fabrikmuster gelesen, aber ich bin ein ziemlich großer Neuling in diesem Bereich, daher ist jeder Rat mehr als willkommen.
Was ist ein geeignetes Entwurfsmuster, um dieses Problem zu lösen?
c#
design-patterns
jao
quelle
quelle
Antworten:
Sie gehen mit ausgefallenen Konzepten zu früh über Bord. Generika - wenn Sie einen Fall sehen, verwenden Sie sie, aber machen Sie sich sonst keine Sorgen. Fabrikmuster - noch viel zu viel Flexibilität (und zusätzliche Verwirrung).
Halte es einfach. Verwenden Sie grundlegende Praktiken.
Versuchen Sie sich die Gemeinsamkeiten zwischen einem Lesevorgang für XML und einem Lesevorgang für CSV vorzustellen. Dinge wie, nächste Aufnahme, nächste Zeile. Da neue Formate hinzugefügt werden können, versuchen Sie, sich Gemeinsamkeiten vorzustellen, die das zu bestimmende Format mit den bekannten haben würde. Verwenden Sie diese Gemeinsamkeit und definieren Sie eine Schnittstelle oder einen Vertrag, an den sich alle Formate halten müssen. Obwohl sie sich an die Gemeinsamkeiten halten, können sie alle ihre spezifischen internen Regeln haben.
Versuchen Sie, zum Validieren der Daten eine Möglichkeit bereitzustellen, neue oder andere Validator-Codeblöcke einfach einzufügen. Versuchen Sie also erneut, eine Schnittstelle zu definieren, in der jeder Prüfer, der für eine bestimmte Art der Datenerstellung verantwortlich ist, einem Vertrag entspricht.
Bei der Erstellung der Datenkonstruktionen werden Sie wahrscheinlich mehr von dem abhängig sein, der die vorgeschlagenen Ausgabeobjekte entwirft. Versuchen Sie herauszufinden, was der nächste Schritt für die Datenobjekte ist, und gibt es Optimierungen, die Sie vornehmen können, wenn Sie die endgültige Verwendung kennen. Wenn Sie beispielsweise wissen, dass die Objekte in einer interaktiven Anwendung verwendet werden, können Sie dem Entwickler dieser App helfen, indem Sie 'Summierungen' oder Zählungen der Objekte oder andere Arten von abgeleiteten Informationen bereitstellen.
Ich würde sagen, die meisten davon sind Vorlagenmuster oder Strategiemuster. Das ganze Projekt wäre ein Adaptermuster.
quelle
Die offensichtliche Sache ist, Strategiemuster anzuwenden . Haben Sie eine generische Basisklasse
ReadStrategy
und für jedes Eingabeformat einer Unterklasse wieXmlReadStrategy
,CSVReadStrategy
etc. Dies ermöglicht es Ihnen , die Importverarbeitung von der Verifizierung der Verarbeitung und der Ausgabeverarbeitung unabhängig zu ändern.Abhängig von den Details kann es auch möglich sein, die meisten Teile des generischen Imports beizubehalten und nur Teile der Eingabeverarbeitung auszutauschen (zum Beispiel das Lesen eines Datensatzes). Dies kann dazu führen, dass Sie das Muster der Vorlagenmethode erhalten .
quelle
Ein geeignetes Muster für ein Importdienstprogramm, das Sie möglicherweise in Zukunft erweitern müssen, wäre die Verwendung von MEF - Sie können den Speicherverbrauch niedrig halten, indem Sie den Konverter, den Sie im Handumdrehen benötigen, aus einer Lazy List laden und MEF-Importe erstellen, die mit Attributen dekoriert sind Dies hilft bei der Auswahl des richtigen Konverters für den Import, den Sie ausführen möchten, und bietet eine einfache Möglichkeit, die verschiedenen importierenden Klassen voneinander zu trennen.
Jeder MEF-Teil kann so erstellt werden, dass er eine Importschnittstelle mit einigen Standardmethoden erfüllt, die eine Zeile der Importdatei in Ihre Ausgabedaten konvertieren oder eine Basisklasse mit der Basisfunktionalität überschreiben.
MEF ist ein Framework für die Erstellung einer Plug-In-Architektur. So werden Outlook und Visual Studio erstellt. Alle diese reizvollen Erweiterungen in VS sind MEF-Teile.
Um eine MEF-App (Managed Extensability Framework) zu erstellen, müssen Sie zunächst einen Verweis auf einfügen
System.ComponentModel.Composition
Definieren Sie Schnittstellen, um festzulegen, was der Konverter tun soll
Dies kann für alle zu importierenden Dateitypen verwendet werden.
Hinzufügen von Attributen zu einer neuen Klasse, die definieren, was die Klasse "exportieren" soll
Dies würde eine Klasse definieren, die CSV-Dateien (eines bestimmten Formats: Format1) importiert und über benutzerdefinierte Attribute verfügt, mit denen die Metadaten der MEF-Exportattribute festgelegt werden. Sie wiederholen dies für jedes Format oder jeden Dateityp, den Sie importieren möchten. Sie können benutzerdefinierte Attribute mit einer Klasse wie der folgenden festlegen:
Um die MEF-Konverter tatsächlich zu verwenden, müssen Sie die MEF-Teile importieren, die Sie beim Ausführen Ihres Konvertierungscodes erstellen:
catalog
sammelt die Teile aus einem Ordner, Standard ist der App-Speicherort.converters
ist eine Lazy-Liste der importierten MEF-TeileWenn Sie dann wissen, welche Art von Datei Sie konvertieren möchten (
importFileType
undimportType
), erhalten Sie einen Konverter aus der Liste der importierten Teile inconverters
Der Aufruf von
converter.ImportData
verwendet den Code in der importierten Klasse.Es mag wie eine Menge Code erscheinen und es kann eine Weile dauern, bis Sie wissen, was los ist, aber es ist äußerst flexibel, wenn Sie neue Konvertertypen hinzufügen, und Sie können sogar zur Laufzeit neue hinzufügen.
quelle
-1
von mir, da die zugrunde liegende Idee immer noch Sinn macht und sich auf ein von derIImportConverter
Schnittstelle vorgegebenes Strategiemuster stützt .Bei C # -Idiomen wird dazu das integrierte Serialisierungsframework verwendet. Sie beschriften die Objekte mit Metadaten und instanziieren dann verschiedene Serializer, die diese Beschriftungen verwenden, um Daten herauszureißen und in die richtige Form zu bringen, oder umgekehrt.
XML-, JSON- und Binärformulare sind am gebräuchlichsten, aber ich wäre nicht überrascht, wenn andere bereits in einer netten, verpackten Form existieren, die Sie verwenden können.
quelle