Ich möchte einige Fragen zu bewährten Methoden in Bezug auf Zuordnungstypen und die Verwendung von Erweiterungsmethoden in C # stellen. Ich weiß, dass dieses Thema in den letzten Jahren mehrmals diskutiert wurde, aber ich habe viele Beiträge gelesen und habe immer noch Zweifel.
Das Problem, auf das ich gestoßen bin, war die Erweiterung der Klasse, die ich besitze, um die Konvertierungsfunktionalität. Angenommen, ich habe die Klasse "Person", die ein Objekt darstellt, das von einer Logik verwendet wird. Ich habe auch eine Klasse "Kunde", die eine Antwort von einer externen API darstellt (tatsächlich wird es mehr als eine API geben, daher muss ich die Antwort jeder API einem allgemeinen Typ zuordnen: Person). Ich habe Zugriff auf den Quellcode beider Klassen und kann dort theoretisch meine eigenen Methoden implementieren. Ich muss Customer in Person konvertieren, damit ich es in der Datenbank speichern kann. Das Projekt verwendet keine automatischen Mapper.
Ich habe 4 mögliche Lösungen im Auge:
.ToPerson () -Methode in der Consumer-Klasse. Es ist einfach, aber es scheint mir, als würde das Muster der Einzelverantwortung durchbrochen, insbesondere, dass die Consumer-Klasse auch anderen Klassen zugeordnet ist (einige werden von einer anderen externen API benötigt), sodass sie mehrere Zuordnungsmethoden enthalten müsste.
Zuordnungskonstruktor in der Personenklasse unter Verwendung von Consumer als Argument. Auch einfach und scheint auch Single-Responsibility-Muster zu brechen. Ich brauche mehrere Mapping-Konstruktoren (da es Klassen von einer anderen API gibt, die die gleichen Daten wie Consumer liefern, aber in einem etwas anderen Format)
Converters-Klasse mit Erweiterungsmethoden. Auf diese Weise kann ich die .ToPerson () -Methode für die Consumer-Klasse schreiben. Wenn eine andere API mit einer eigenen NewConsumer-Klasse eingeführt wird, kann ich einfach eine andere Erweiterungsmethode schreiben und alles in derselben Datei belassen. Ich habe eine Meinung gehört, dass Erweiterungsmethoden im Allgemeinen böse sind und nur verwendet werden sollten, wenn dies unbedingt erforderlich ist, und das ist es, was mich zurückhält. Ansonsten mag ich diese Lösung
Konverter / Mapper-Klasse. Ich erstelle eine separate Klasse, die Konvertierungen verarbeitet und Methoden implementiert, die die Quellklasseninstanz als Argument verwenden und die Zielklasseninstanz zurückgeben.
Zusammenfassend kann mein Problem auf eine Reihe von Fragen reduziert werden (alles im Zusammenhang mit dem, was ich oben beschrieben habe):
Wird das Platzieren der Konvertierungsmethode in einem (POCO?) - Objekt (wie die .ToPerson () - Methode in der Consumer-Klasse) als Verstoß gegen das Muster einer einzelnen Verantwortung betrachtet?
Wird die Verwendung von Konvertierungskonstruktoren in einer (DTO-ähnlichen) Klasse als Verstoß gegen das Muster einer einzelnen Verantwortung angesehen? Insbesondere wenn eine solche Klasse aus mehreren Quelltypen konvertiert werden kann, wären dann mehrere Konvertierungskonstruktoren erforderlich?
Wird die Verwendung von Erweiterungsmethoden beim Zugriff auf den ursprünglichen Klassenquellcode als schlechte Praxis angesehen? Kann ein solches Verhalten als tragfähiges Muster für die Trennung von Logik verwendet werden oder ist es ein Anti-Muster?
Person
Klasse ein DTO? Enthält es irgendein Verhalten?