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