Wie implementieren Sie bei der Planung der Architektur für eine mittelgroße MVC-Webanwendung die Ebenen, die so entkoppelt wie möglich und einfach zu testen sind? Nehmen wir an, ich verwende zuerst Code als Datenzugriff.
Ich habe Probleme damit, was "Geschäftslogik" zu definieren ist und wie es mit der Datenschicht interagieren soll. Wäre Geschäftslogik am Beispiel einer Fahrzeugverkaufsanwendung Klassen, die Aufgaben wie die Berechnung des Steuerbandes für bestimmte Fahrzeuge, den Vergleich von Meilen pro Gallone-Statistiken usw. ausführten? Die Geschäftseinheiten (z. B. Autos, Lieferwagen, Motorräder) würde ich zusammen mit meiner DataContext
Klasse in die Datenschicht einfügen .
Auch was würde Anwendungslogik im Gegensatz zu Geschäft ausmachen - ich vermute Dinge wie Validierungen von Sitzungen / Benutzereingaben?
So kann beispielsweise ein Autocontroller ein Aktions- / Ansichtsergebnis zurückgeben, in dem die zehn besten Autos aufgelistet sind, die nach Typ und bester mpg gefiltert sind. ICarRepository
Nehmen wir also an, ich habe ein 'carRepo' in meinen Controller injiziert (unter Verwendung des Repository-Musters / DI). Ich filtere meine Autos aus einem Aktionsmethodenparameter, zvar cars = carRepo.getCarsByType("hatchback");
Daher habe ich das Datenzugriffswissen mithilfe eines Repositorys von meinem Controller ferngehalten, um die Geschäftslogik mithilfe eines Domänenmodells vom Controller fernzuhalten - var result = new MpgCalculator (cars); - Angenommen, ich benötige die Rechnerklasse, da sie zusätzliche Logik ausführen muss, um die beste Kraftstoffeffizienz zu berechnen, und nicht nur Entitäten aus der Datenbank laden / filtern. Jetzt habe ich einen Datensatz für meine Ansicht zum Rendern, der ein Repository zum Abrufen von der Datenzugriffsschicht und ein domänenspezifisches Objekt zum Verarbeiten und Ausführen geschäftsbezogener Aufgaben für diese Daten verwendet.
Mache ich hier Fehler? Müssen wir noch das Repository-Muster verwenden oder kann ich einfach gegen eine Schnittstelle codieren, um das ORM zu entkoppeln und zu testen? Sollten sich zu diesem Thema die Schnittstellendefinitionen in der Domänen- / Geschäftsschicht befinden, da sich meine konkreten Datenzugriffsklassen dbcontext in der Datenschicht befinden, was bedeutet, dass meine anderen Schichten nicht betroffen sind, wenn die Datenzugriffstechnologie jemals geändert wird?
Nach dem, was ich bisher studiert habe, sieht meine Struktur folgendermaßen aus:
MVC Internet Application -> Die Standard-Internetprojektmodelle hier sind ViewModels
Domänen- / Geschäftsschicht -> Geschäftsspezifische Klassen / Modelle, mit denen Controller Domänenentitäten aus der Datenschicht verarbeiten können, bevor sie an die relevanten Ansichten weitergeleitet werden
Repository-Abstraktion notwendig? -> Ich höre viele Debatten darüber, besonders wenn ich ein ORM benutze
Datenschicht -> Entitätsklassen (Auto, Van, Motorrad), DbContext - Schicht der konkreten Datenzugriffstechnologie
quelle
Es sieht so aus, als ob alles für Ihre Struktur korrekt ist. Das einzige, bei dem ich mir nicht sicher bin, ist, dass Sie erwähnen, dass die Modelle in MVC "ViewModels" sind und dass Ihre Controller mit der Domänenschicht kommunizieren. Ich denke, dies ist sinnvoll, wenn Ihr Standardmuster darin besteht, den Controller für den Zugriff auf die Domänenschicht zu verwenden und dann Ihre "ViewModels" als ansichtsspezifischere Zusammenstellungen von Informationen aus mehreren Domänenentitäten zu verwenden, wie dies für diese bestimmte Ansicht sinnvoll ist. Wenn Sie das tun, sind Sie wahrscheinlich in Ordnung.
Es gibt eine Meinung, dass Sie eine vollständige Abstraktion Ihrer Domänenschicht in Ihrer MVC-Anwendung haben sollten, wenn Sie welche haben werden. Persönlich verursacht mir der Gedanke, dies in einer Unternehmensanwendung zu tun, starke mentale Schmerzen.
Ich bevorzuge die Verwendung des Repository-Musters, um den Zugriff auf die Datenschicht zu verwalten, da dies die Testbarkeit und Flexibilität verbessert. Die beiden Dinge, die dazu neigen, die drastischsten Änderungen vorzunehmen, sind die Benutzeroberfläche und die Datenbank. Stellen Sie sich vor, einige der Informationen, die Sie direkt aus der Datenbank abrufen, werden so geändert, dass sie nicht aus einem Datenbankaufruf, sondern aus einem Serviceabruf abgerufen werden müssen, oder einige Informationen werden in eine andere Datenbank verschoben, für die eine andere .edmx erforderlich ist Datei. Das Repository-Muster bietet eine Abstraktion, um dies zu unterstützen.
quelle