Domänengesteuertes Design vs. Datenbankgesteuertes Design für eine MVC-Webanwendung

8

Ich erweitere / konvertiere eine ältere Web Forms-Anwendung in eine völlig neue MVC-Anwendung. Die Erweiterung betrifft sowohl den technologischen als auch den geschäftlichen Anwendungsfall. Die Legacy-Anwendung ist ein gut gemachtes DBDD (Database Driven Design). So für z.B. Wenn Sie verschiedene Arten von Mitarbeitern wie Operator, Supervisor, Store Keeper usw. haben und Sie müssen einen neuen Typ hinzufügen, gehen Sie einfach und fügen Sie einige Zeilen in ein paar Tabellen hinzu und voila, Ihre Benutzeroberfläche hat automatisch alles zum Hinzufügen / Aktualisieren des neuen Art des Mitarbeiters. Die Trennung der Schichten ist jedoch nicht so gut.

Das neue Projekt hat zwei Hauptziele

  • Erweiterbarkeit (für aktuelle und zukünftige Pipelineanforderungen)
  • Leistung

Ich beabsichtige, das neue Projekt zu erstellen, das das DBDD (Database Driven Design) durch ein Domain Driven Design (DDD) ersetzt, wobei die Erweiterbarkeit berücksichtigt wird. Die Umstellung von einem datenbankgestützten Design auf ein domänengestütztes Design scheint sich jedoch umgekehrt auf die Leistungsanforderung auszuwirken, wenn ich sie mit der Leistung der älteren DBDD-Anwendung vergleiche. In der Legacy-Anwendung würde jeder Aufruf von Daten von der UI direkt mit der Datenbank interagieren, und alle Daten würden in Form eines DataReaders oder (in einigen Fällen) eines DataSets zurückgegeben werden.

Jetzt, mit einer strikten DDD-Funktion, wird jeder Datenaufruf durch die Business-Schicht und die Datenzugriffsschicht geleitet. Dies würde bedeuten, dass jeder Aufruf ein Business-Objekt und ein Datenzugriffsobjekt initialisiert. Eine einzelne UI-Seite könnte unterschiedliche Datentypen benötigen. Da es sich um eine Webanwendung handelt, kann jede Seite von mehreren Benutzern angefordert werden. Da auch eine MVC-Webanwendung statusfrei ist, müsste jede Anforderung die Geschäftsobjekte und Datenzugriffsobjekte jedes Mal initialisieren. So scheint es für eine zustandslose MVC-Anwendung der DBDD vorzuziehen, DDD für die Leistung zu verwenden.

Oder gibt es einen Weg in DDD, um beides zu erreichen, die Erweiterbarkeit, die DDD bietet und die Leistung, die DBDD bietet?

    
devanalyst 21.05.2012, 12:00
quelle

3 Antworten

6

Haben Sie eine Form der Befehlsabfragetrennung in Betracht gezogen, bei der die Aktualisierungen über das Domänenmodell erfolgen und die Lesevorgänge dennoch als DataReaders kommen? Vollständige DDD ist nicht immer angebracht.

    
Chriseyre2000 21.05.2012, 12:05
quelle
4
  

"Bei einer strikten DDD-Funktion wird jeder Datenaufruf durch die Business-Schicht und die Datenzugriffsschicht geleitet."

Ich glaube nicht, dass das wahr ist, und es ist sicherlich nicht praktisch. Ich glaube, das sollte lauten:

  

Jetzt, mit strenger DDD-Funktion, wird jeder Aufruf für eine Transaktion durch die Business-Schicht und die Datenzugriffsebene geleitet.

Es gibt nichts, das besagt, dass Sie die Datenzugriffsebene nicht direkt aufrufen können, um alle Daten abzurufen, die Sie auf dem Bildschirm anzeigen müssen. Nur wenn Sie Daten ändern müssen, müssen Sie Ihr Domänenmodell aufrufen, das auf seinem Verhalten basiert. Meiner Meinung nach ist dies eine Schlüsselunterscheidung. Wenn Sie alles durch Ihr Domänenmodell leiten, haben Sie drei Probleme:

  1. Zeit - es wird viel länger dauern, um Funktionalität zu implementieren, ohne Nutzen.
  2. Model Design - Ihr Domain-Modell wird nicht mehr in Form sein, um die Bedürfnisse zu erfüllen, anstatt das Verhalten zu überprüfen.
  3. Leistung - nicht aufgrund eines zusätzlichen Layers, sondern weil Sie die aggregierten Daten aus Ihrem Modell nicht so schnell wie direkt aus einer Abfrage abrufen können. Betrachten Sie den Gesamtwert aller Aufträge, die für einen bestimmten Kunden erteilt werden - es ist viel schneller, eine Abfrage dafür zu schreiben, als alle Auftragsentitäten für den Kunden abzurufen, zu iterieren und zu summieren.

Wie Chriseyre2000 bereits erwähnt hat, zielt CQRS darauf ab, genau diese Probleme zu lösen.

    
David Masters 25.05.2012 10:51
quelle
1

Die Verwendung von DDD sollte in Ihrem Szenario keine wesentlichen Auswirkungen auf die Leistung haben. Worüber Sie sich Sorgen machen, scheint eher ein Problem mit dem Datenzugriff zu sein. Sie bezeichnen es als

  

initialisiert ein Business-Objekt und ein Datenzugriffsobjekt

Warum ist "Initialisierung" teuer? Welche Datenzugriffsmechanismen verwenden Sie?

DDD mit langlebigen Objekten, die in einer relationalen Datenbank gespeichert sind, wird normalerweise mit ORM implementiert. Bei richtiger Verwendung wirkt sich ORM bei den meisten Anwendungen kaum auf die Leistung aus. Und Sie können immer die leistungsstärksten Teile der App auf Raw SQL umstellen, wenn es einen erwiesenen Engpass gibt.

Was es wert ist, muss NHibernate nur einmal beim Start der Anwendung initialisiert werden, danach verwendet es den gleichen ADO.NET-Verbindungspool wie Ihre normalen Datenleser. Es läuft also alles auf eine korrekte Zuordnung, Abrufstrategie und Vermeidung klassischer Datenzugriffsfehler wie 'n + 1 selects' hinaus.

    
Dmitry 23.05.2012 03:51
quelle