Wenn Geschäftsregeln die Präsentation in MVC beeinflussen

8

Das MVC-Entwurfsmuster soll dazu führen, dass Geschäftsregeln von der Präsentation getrennt werden.

Aber manchmal beeinflussen Geschäftsregeln die Präsentation. Was ist der beste Weg, um damit umzugehen? Sollte dann ein ViewModel verwendet werden?

Wenn ein Bibliothekar beispielsweise zu meiner nicht vorhandenen Bibliotheksanwendung zurückkehrt, scannt er zurückgegebene Bücher. Das System zeigt an, dass ein Buch zu spät ist, und verhängt eine Geldstrafe gegen diesen Benutzer.

Bestimmte Mitarbeiter haben möglicherweise die Sicherheit, diese Geldbuße unter bestimmten Bedingungen außer Kraft zu setzen.

In der Präsentationsebene meiner Bibliotheksanwendung muss der Mitarbeiter die Geldbuße auf 0 setzen oder auf eine Schaltfläche klicken, um die Geldbuße zu überschreiben.

Mitarbeiter, die KEINE Sicherheit dafür haben, sollten die Gebühr entweder als deaktivierte Eingabe oder als schreibgeschützt betrachten.

Beachten Sie, dass Sicherheit möglicherweise nicht die einzige Geschäftsregel ist . Dies ist nur ein Beispiel. In meiner Anwendung sind beispielsweise möglicherweise Konfigurationsinformationen eingerichtet, die dazu führen, dass ein Feld auf einem Bildschirm nicht mehr benötigt wird.

Während der Code es jedem ermöglichen könnte, die Geldbuße zu ändern und dann eine Validierungsnachricht anzuzeigen, ist dies keine gute Benutzererfahrung.

Was ist eine gute Praxis, um dies zu erreichen? Folgende Optionen (mit ASP.NET MVC) sind denkbar:

  1. Lassen Sie die Ansicht selbst die Geschäftsregel überprüfen und das Feld deaktivieren oder aktivieren.

  2. Verwenden Sie eine HTMLHelper-Funktion, die die Präsentation für das Feinfeld implementiert, und lassen Sie diese Hilfsfunktion die Geschäftsregel überprüfen.

  3. Lassen Sie den Controller die Geschäftsregel überprüfen und eine andere Ansicht verwenden.

  4. Lassen Sie den Controller die Geschäftsregel überprüfen und im ViewBag eine Eigenschaft festlegen, die angibt, ob das Feld aktiviert ist.

  5. Mit einem ViewModel wird die Geschäftsregel überprüft und Informationen festgelegt, die angeben, dass das Feld aktiviert ist.

Die Optionen 1 und 2 führen dazu, dass die Präsentationsebene die Validierung von Geschäftsregeln durchführen muss, was die Dinge durcheinander bringt.

Option 3 führt zu Doppelarbeit, da jetzt zwei Ansichten definiert sind.

Bei Option 4 und 5 muss die Präsentationsschicht wissen, dass das Feld aktiviert oder deaktiviert werden KANN, jedoch nicht WARUM. Ich denke, ich mag 4 oder 5 am liebsten.

Unsere anderen Optionen, an die ich nicht denke?

scott.korin
quelle

Antworten:

3

Ich denke, Ihre Option Nummer 5 ist am besten, aber mit einigen geringfügigen Änderungen:

Sie ViewModelsollten über eine Eigenschaft verfügen, die angibt, ob die Daten aktualisiert werden können oder nicht. Möglicherweise eine boolesche Eigenschaft "CanOverrideLateFine".

Was auch immer das ViewModel erstellt (Ihr Controller oder eher ein Geschäftsdienst, an den Ihr Controller delegiert), ist für die Bewertung der Geschäftsregeln und das Festlegen dieser Eigenschaft verantwortlich. Nicht das ViewModel selbst.

Das Viewwird dann die „CanOverride“ Eigenschaft prüfen und festzustellen , wie man richtig für den Benutzer zu machen. Es kann so einfach sein wie das Aktivieren oder Deaktivieren eines Formularfelds, aber es kann etwas völlig anderes sein (möglicherweise wird das Feld nicht einmal gerendert oder es wird ein völlig anderes visuelles Element bereitgestellt).

Eric King
quelle