Geschäftsregeln gehen in das Modell ein.
Angenommen, Sie haben E-Mails für eine Mailingliste angezeigt. Der Benutzer klickt auf die Schaltfläche "Löschen" neben einer der E-Mails, der Controller benachrichtigt das Modell, um Eintrag N zu löschen, und benachrichtigt dann die Ansicht, die das Modell geändert hat.
Vielleicht sollte die E-Mail des Administrators niemals von der Liste entfernt werden. Das ist eine Geschäftsregel, dass Wissen in das Modell gehört. Die Ansicht kann letztlich repräsentiert diese Regel irgendwie - vielleicht das Modell eine „IsDeletable“ Eigenschaft aussetzt , die eine Funktion der Geschäftsregel ist, so dass die Löschtaste in der Ansicht für bestimmte Einträge deaktiviert ist - aber die Regel selbst nicht enthalten sind in der Ansicht.
Das Modell ist letztendlich der Gatekeeper für Ihre Daten. Sie sollten in der Lage sein, Ihre Geschäftslogik zu testen, ohne die Benutzeroberfläche zu berühren.
Faust von allem:
Ich glaube, dass Sie das MVC-Muster und die n-Tier-basierten Designprinzipien verwechseln.
Die Verwendung eines MVC-Ansatzes bedeutet nicht, dass Sie Ihre Anwendung nicht überlagern sollten.
Es kann hilfreich sein, wenn Sie MVC eher als Erweiterung der Präsentationsebene sehen.
Wenn Sie Nicht-Präsentationscode in das MVC-Muster einfügen, kann dies sehr bald zu einem komplizierten Design führen.
Daher würde ich vorschlagen, dass Sie Ihre Geschäftslogik in eine separate Geschäftsschicht einteilen.
Schauen Sie sich das an: Wikipedia-Artikel über mehrschichtige Architektur
Es heißt:
Wie auch immer ... wenn es sich um eine Unternehmenswebanwendung handelt, sollten die Aufrufe von der Benutzeroberfläche an die Geschäftslogikschicht innerhalb des (Präsentations-) Controllers platziert werden.
Dies liegt daran, dass der Controller die Aufrufe einer bestimmten Ressource tatsächlich verarbeitet, die Daten durch Aufrufe der Geschäftslogik abfragt und die Daten (das Modell) mit der entsprechenden Ansicht verknüpft.
Mud hat Ihnen gesagt, dass die Geschäftsregeln in das Modell einfließen.
Das ist auch wahr, aber er hat das (Präsentations-) Modell (das 'M' in MVC) und das Datenschichtmodell eines tierbasierten Anwendungsdesigns verwechselt.
So gilt es Ihre Datenbank bezogenen Geschäft zu platzieren Regeln im Modell (Datenschicht) der Anwendung.
Sie sollten sie jedoch nicht in das Modell Ihrer MVC-strukturierten Präsentationsebene einfügen, da dies nur für eine bestimmte Benutzeroberfläche gilt.
Diese Technik ist unabhängig davon, ob Sie ein domänengesteuertes Design oder einen auf Transaktionsskripten basierenden Ansatz verwenden.
Lassen Sie mich das für Sie visualisieren:
Präsentationsschicht: Modell - Ansicht - Controller
Geschäftsschicht: Domänenlogik - Anwendungslogik
Datenschicht: Datenrepositorys - Datenzugriffsschicht
Das oben gezeigte Modell bedeutet, dass Sie über eine Anwendung verfügen, die MVC, DDD und eine datenbankunabhängige Datenschicht verwendet.
Dies ist ein gängiger Ansatz zum Entwerfen einer größeren Unternehmenswebanwendung.
Sie können es aber auch verkleinern, um eine einfache Nicht-DDD-Geschäftsschicht (eine Geschäftsschicht ohne Domänenlogik) und eine einfache Datenschicht zu verwenden, die direkt in eine bestimmte Datenbank schreibt.
Sie können sogar die gesamte Datenschicht löschen und direkt von der Geschäftsschicht aus auf die Datenbank zugreifen, obwohl ich dies nicht empfehle.
Das ist der Trick ... Ich hoffe das hilft ...
[Hinweis:] Sie sollten sich auch der Tatsache bewusst sein, dass heutzutage mehr als nur ein "Modell" in einer Anwendung vorhanden ist. Im Allgemeinen hat jede Ebene einer Anwendung ein eigenes Modell. Das Modell der Präsentationsebene ist ansichtsspezifisch, jedoch häufig unabhängig von den verwendeten Steuerelementen. Die Geschäftsschicht kann auch ein Modell haben, das als "Domänenmodell" bezeichnet wird. Dies ist normalerweise der Fall, wenn Sie sich für einen domänengesteuerten Ansatz entscheiden. Dieses "Domänenmodell" enthält sowohl Daten als auch Geschäftslogik (die Hauptlogik Ihres Programms) und ist normalerweise unabhängig von der Präsentationsschicht. Die Präsentationsschicht ruft normalerweise die Geschäftsschicht bei einem bestimmten "Ereignis" (Taste gedrückt usw.) auf, um Daten von der Datenschicht zu lesen oder in diese zu schreiben. Die Datenschicht verfügt möglicherweise auch über ein eigenes Modell, das normalerweise datenbankbezogen ist.
Die Frage ist: Wie passt das in das MVC-Konzept?
Antwort -> nicht!
Nun - das tut es irgendwie, aber nicht vollständig.
Dies liegt daran, dass MVC ein Ansatz ist, der Ende der 1970er Jahre für die Programmiersprache Smalltalk-80 entwickelt wurde. Zu dieser Zeit waren GUIs und PCs ziemlich ungewöhnlich und das World Wide Web wurde nicht einmal erfunden! Die meisten heutigen Programmiersprachen und IDEs wurden in den 1990er Jahren entwickelt. Zu dieser Zeit waren Computer und Benutzeroberflächen völlig anders als in den 1970er Jahren.
Sie sollten dies berücksichtigen, wenn Sie über MVC sprechen.
Martin Fowler hat einen sehr guten Artikel über MVC, MVP und die heutigen GUIs geschrieben.
quelle
Der Begriff Geschäftslogik ist meiner Meinung nach keine genaue Definition. Evans spricht in seinem Buch Domain Driven Design über zwei Arten von Geschäftslogik:
Diese Trennung ist meiner Meinung nach viel klarer. Und mit der Erkenntnis, dass es verschiedene Arten von Geschäftsregeln gibt, kommt auch die Erkenntnis, dass nicht alle notwendigerweise an den gleichen Ort gehen.
Domänenlogik ist eine Logik, die der tatsächlichen Domäne entspricht. Wenn Sie also eine Buchhaltungsanwendung erstellen, sind Domänenregeln Regeln für Konten, Buchungen, Steuern usw. In einem agilen Software-Planungstool sind die Regeln beispielsweise die Berechnung von Veröffentlichungsdaten basierend auf Geschwindigkeit und Story-Punkten im Backlog. etc.
Für beide Anwendungstypen könnte der CSV-Import / Export relevant sein, aber die Regeln für den CSV-Import / Export haben nichts mit der tatsächlichen Domäne zu tun. Diese Art von Logik ist Anwendungslogik.
Die Domänenlogik geht mit Sicherheit in die Modellschicht. Das Modell würde auch der Domänenschicht in DDD entsprechen.
Die Anwendungslogik muss jedoch nicht unbedingt in der Modellebene platziert werden. Dies kann direkt in den Controllern platziert werden, oder Sie können eine separate Anwendungsebene erstellen, in der diese Regeln gehostet werden. Was in diesem Fall am logischsten ist, hängt von der tatsächlichen Anwendung ab.
quelle
A1 : Business Logic geht zum
Model
TeilMVC
. Die Rolle vonModel
besteht darin, Daten und Geschäftslogik zu enthalten.Controller
Auf der anderen Seite ist er dafür verantwortlich, Benutzereingaben zu erhalten und zu entscheiden, was zu tun ist.A2 : A
Business Rule
ist ein Teil vonBusiness Logic
. Sie haben einehas a
Beziehung.Business Logic
hatBusiness Rules
.Schau es dir an
Wikipedia entry for MVC
. Gehen Sie zur Übersicht, in der derMVC
Musterfluss erwähnt wird.Schauen Sie sich auch an
Wikipedia entry for Business Logic
. Es wird erwähnt, dassBusiness Logic
ausBusiness Rules
und bestehtWorkflow
.quelle
Wie einige Antworten gezeigt haben, gibt es meines Erachtens einige Missverständnisse zwischen der mehrschichtigen und der MVC-Architektur.
Bei einer mehrschichtigen Architektur wird Ihre Anwendung in Ebenen / Ebenen unterteilt (z. B. Präsentation, Geschäftslogik, Datenzugriff).
MVC ist ein Architekturstil für die Präsentationsschicht einer Anwendung. Bei nicht trivialen Anwendungen sollte Geschäftslogik / Geschäftsregeln / Datenzugriff nicht direkt in Modellen, Ansichten oder Controllern platziert werden. Dies würde bedeuten, dass Geschäftslogik in Ihre Präsentationsebene eingefügt wird und somit die Wiederverwendung und Wartbarkeit Ihres Codes verringert wird.
Das Modell ist eine sehr vernünftige Wahl, um Geschäftslogik zu platzieren. Ein besserer / wartbarerer Ansatz besteht jedoch darin, Ihre Präsentationsschicht von Ihrer Geschäftslogikschicht zu trennen, eine Geschäftslogikschicht zu erstellen und bei Bedarf einfach die Geschäftslogikschicht aus Ihren Modellen aufzurufen. Die Geschäftslogikschicht ruft wiederum die Datenzugriffsschicht auf.
Ich möchte darauf hinweisen, dass es nicht ungewöhnlich ist, Code zu finden, der Geschäftslogik und Datenzugriff in einer der MVC-Komponenten mischt, insbesondere wenn die Anwendung nicht mit mehreren Ebenen erstellt wurde. In den meisten Unternehmensanwendungen finden Sie jedoch häufig mehrschichtige Architekturen mit einer MVC-Architektur innerhalb der Präsentationsschicht.
quelle
Dies ist eine beantwortete Frage, aber ich gebe meinen "einen Cent":
Geschäftsregeln gehören in das Modell. Das "Modell" besteht immer aus (logisch oder physikalisch getrennt):
Geschäftsregeln leben im Domänenmodell, werden in einer für die Präsentation geeigneten Form dem "Präsentations" -Modell ausgesetzt und manchmal in der "Datenschicht" dupliziert (oder auch erzwungen).
quelle
Es ist nicht sinnvoll, Ihre Geschäftsschicht in das Modell für ein MVC-Projekt aufzunehmen.
Sagen Sie, dass Ihr Chef beschließt, die Präsentationsebene in etwas anderes zu ändern, Sie wären fertig! Die Geschäftsschicht sollte eine separate Baugruppe sein. Ein Modell enthält die Daten, die von der Geschäftsschicht stammen, die zur Anzeige an die Ansicht übergeben wird. Beim Binden beispielsweise bindet das Modell an eine Personenklasse, die sich in der Geschäftsschicht befindet, und ruft PersonBusiness.SavePerson (p) auf. Dabei ist p die Personenklasse. Folgendes mache ich (BusinessError-Klasse fehlt, würde aber auch in den BusinessLayer aufgenommen werden):
quelle
Q1:
Geschäftslogiken können in zwei Kategorien betrachtet werden:
Domänenlogiken wie Steuerelemente für eine E-Mail-Adresse (Eindeutigkeit, Einschränkungen usw.), Abrufen des Rechnungspreises eines Produkts oder Berechnen des Gesamtpreises des Einkaufswagens anhand seiner Produktobjekte.
Breitere und kompliziertere Workflows, die als Geschäftsprozesse bezeichnet werden, wie die Steuerung des Registrierungsprozesses für den Schüler (der normalerweise mehrere Schritte umfasst und unterschiedliche Prüfungen erfordert und kompliziertere Einschränkungen aufweist).
Die erste Kategorie gehört zum Modell und die zweite gehört zum Controller . Dies liegt daran, dass die Fälle in der zweiten Kategorie eine breite Anwendungslogik sind und das Einfügen in das Modell die Abstraktion des Modells mischen kann (zum Beispiel ist nicht klar, ob wir diese Entscheidungen in die eine oder andere Modellklasse einordnen müssen, da sie zusammenhängen an beide!).
In dieser Antwort finden Sie eine spezifische Unterscheidung zwischen Modell und Controller, in diesem Link sehr genaue Definitionen und auch in diesem Link ein schönes Android-Beispiel.
Der Punkt ist, dass die oben von "Mud" und "Frank" erwähnten Notizen sowohl wahr als auch "Pete" sein können (Geschäftslogik kann je nach Art der Geschäftslogik in ein Modell oder einen Controller eingefügt werden).
Beachten Sie schließlich, dass MVC von Kontext zu Kontext unterschiedlich ist. In Android-Anwendungen werden beispielsweise einige alternative Definitionen vorgeschlagen, die sich von webbasierten unterscheiden (siehe beispielsweise diesen Beitrag ).
Q2:
Die Geschäftslogik ist allgemeiner und (als "Decyclone" oben erwähnt) haben wir die folgende Beziehung zwischen ihnen:
quelle
Warum führen Sie keine Service-Schicht ein? Dann ist Ihr Controller schlank und besser lesbar. Dann sind alle Controller-Funktionen reine Aktionen. Sie können die Geschäftslogik innerhalb der Serviceschicht beliebig zerlegen. Die Wiederverwendbarkeit von Code ist hoch. Keine Auswirkungen auf Modelle und Repositorys.
quelle
Modell = Code für CRUD-Datenbankoperationen.
Controller = reagiert auf Benutzeraktionen und übergibt die Benutzeranforderungen zum Abrufen oder Löschen / Aktualisieren von Daten an das Modell, vorbehaltlich der organisationsspezifischen Geschäftsregeln. Diese Geschäftsregeln können in Hilfsklassen implementiert werden oder, wenn sie nicht zu komplex sind, direkt in den Controller-Aktionen. Der Controller fordert die Ansicht schließlich auf, sich selbst zu aktualisieren, um dem Benutzer Feedback in Form einer neuen Anzeige oder einer Meldung wie "aktualisiert, danke" usw. zu geben.
Ansicht = Benutzeroberfläche, die basierend auf einer Abfrage im Modell generiert wird.
Es gibt keine festen Regeln, wohin Geschäftsregeln gehen sollen. In einigen Designs werden sie modelliert, in anderen sind sie im Controller enthalten. Aber ich denke, es ist besser, sie beim Controller zu behalten. Lassen Sie das Modell sich nur um die Datenbankkonnektivität kümmern.
quelle