Frage

Ich baue eine Anwendung auf einer Legacy-Datenbank (die ich nicht ändern kann). Ich verwende Linq für den Datenzugriff auf SQL, was bedeutet, ich habe eine (LINQ to SQL) Klasse für jede Tabelle.

Meine Domain-Modell nicht mit der Datenbank nicht überein. Zum Beispiel gibt es zwei Tabellen Users und Employees genannt, und deshalb habe ich zwei Linq to SQL-Klassen namens User und Employee. Aber in meinem Domain-Modell würde Ich mag eine User Klasse haben, die einige Felder aus entweder Tabelle enthalten soll (aber ich kümmere mich nicht um eine Menge von den anderen Bereichen dieser Tabellen).

Ich bin mir nicht sicher, wie ich meine Repositories Entwurf:

  • sollten die Verwahrungsstellen führen die Abbildung zwischen Linq zu SQL-Klassen (z.B. User, Employee) mit den Domain-Klassen (User) und nur die Domäne Klassen an die Anwendung zurück
  • oder sollte meine Repositories geben die Linq to SQL-Klassen und lassen Sie die Zuordnung zu dem Anrufer

Der erste Ansatz scheint mehr Sinn für mich zu machen, aber dann ist dies der richtige Weg, um meine Repositories zu implementieren?

War es hilfreich?

Lösung

Die puristische (ich versuche, rein zu bleiben) werden Ihnen sagen, dass Ihr Modell Ihrer Daten darstellt. Und deshalb alles, was beibehalten werden muss, ist dies nur geschehen, wenn durch Repositories benötigt. Auch, wenn Sie komplexe Gebilde haben, möchten Sie einen Service nutzen, sie zu kombinieren. Zum Beispiel, Benutzer + Mitarbeiter = UserEmployee Einheit, die nur über eine IUserEmployeeService ist.

Mit diesen vagen Aussagen, Sie haben eine ausgezeichnete Gelegenheit, hier.

Erstellen Sie eine Anti-Korruptions-Schicht, die man zugleich das Losfahren der Legacy-DB starten kann.

Dies ist ein weiteres Kapitel in dem DDD-Textbuch. Eine Anti-Korruptions-Schicht verwendet wird, mit einem Legacy-System unter Verwendung von Fassaden, Übersetzern und Adapter als Schnittstelle des Erbe DB mit Ihrem reinen Domain-Modell zu isolieren.

Nun kann dies viel mehr Arbeit, als Sie wollten. Also, Sie haben sich an dieser Stelle fragen:

  

Will ich den Prozess der starten   dieses Erbe DB Losfahren oder wird   es bleibt für das Leben der   Anwendung?

Wenn Ihre Antwort können Sie beginnen, die Migration, dann modellieren Ihre tatsächliche Domain so, wie Sie es wollen. Persist es mit normalen Repositories und Dienstleistungen. Viel Spaß es die Art und Weise der Gestaltung Sie es gespeichert werden soll. Dann nutzen Sie die Dienste der aggregierten Wurzeln in die Anti-Korruptions-Schicht zu erreichen und die Entitäten herausziehen, zu speichern / aktualisieren, um sie lokal und übersetzt in Entitäten Ihre Domain.

Wenn die Antwort ist, dass das Erbe DB für die gesamte Lebensdauer des Projekts bleiben wird, dann ist es Ihre Aufgabe viel einfacher. Verwenden Sie Ihre Domain-Dienste (zum Beispiel UserEmployeeService) in den Anti-Korruptions des UserFacade und EmployeeFacade (ähnlich ein „Remote Service“ -Konzept) zu erreichen.

Im Rahmen der Fassaden, Zugriff auf die Legacy-db der Adapter (z.B. LegacyDbSqlDatabase) ein rohes legacyUser zu erhalten (). Der nächste Schritt wäre eine UserTranslator () zu verwenden und EmployeeTranslator () Mapper, den die Legacy-Benutzerdaten in die tatsächlichen Domain-Version der Benutzer () Einheit konvertiert und schicken Sie es von der UserFacade zurück zu Ihrem UserEmployeeService, wo sie kombiniert wird mit die Mitarbeiter Einheit, die von der gleichen Stelle kam.

Whoa, das war eine Menge Tipp ...

Mit Ihrem Adapter und Fassaden Ihrer Anti-Korruptions-Schicht, können Sie Ihr Linq-to-Sql tun oder was auch immer Sie tun mögen. Es spielt keine Rolle, weil Sie vollständig das Erbe DB / System weg von Ihrer schönen und reinen Domain getrennt haben - Ihre Domäne, die seine eigene Version von Benutzern () und Mitarbeitern () Einheiten und Wertobjekten hat.

Andere Tipps

DDD und LINQ to SQL nicht zusammen sehr gut, weil die generierten Klassen nicht wesentlich von Ihrer DB-Tabellenstruktur abweichen sollen. Sie müssen entweder auf Ihre Klassen in einer Art und Weise abzubilden, die mit Linq Arbeit macht einen Schmerz SQL oder einfach nur mit einem nicht idealen Objektmodell lebt.

Wenn Sie wirklich wollen DDD nutzen und die Repository-Muster für Entity Framework gehen oder noch besser NHibernate.

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