Ich baue ein ASP.NET MVC-Projekt und gehe für die folgende Architektur:
Sagen wir also, ich möchte einen Benutzer hinzufügen. Ich definiere ein NewUserInputModel
im Core Projekt. Ich gebe ein paar Datenanmerkungen wie [Required]
. Anschließend führt das Web -Projekt anhand dieser Anmerkungen eine clientseitige Validierung durch.
Meine Frage betrifft die serverseitige Validierung. Ich möchte die NewUserInputModel
unter Verwendung der gleichen Regeln validieren, die auf der Client-Seite verwendet werden, und ich möchte diese Validierungswetterfunktion ausführen, bei der NewUserInputModel
von der API oder der stammt Web Projekt.
Mir ist klar, dass ich ModelState.IsValid
von einem Controller im Web -Projekt aufrufen könnte - aber ich möchte diese Validierung vom Core -Projekt aus aufrufen, damit alle Validierungslogik funktioniert in Kern . Auf diese Weise, egal wie dieses Modell in die Kern Logik kommt, rufe ich immer dieselbe Validierung an. Ich möchte keine System.Web
-Referenz in mein Core -Projekt ausliefern.
Ist das ein vernünftiges Design? Ich denke, es ist - aber wenn etwas darüber riecht, würde ich mich freuen, es zu hören.
Vielen Dank im Voraus für jede Hilfe.
Normalerweise halte ich meine Ansichtsmodelle im Webprojekt und führe die Eingabe Validierung im Controller mit der Eigenschaft ModelState
durch. Wenn dies gelingt, ordne ich sie Domänenmodellen zu (die in der Core-Schicht leben) und sende diese an meine Dienste im Layer Service (könnte auch Core sein). Die Serviceebene validiert Geschäftsregeln und wenn dies erfolgreich ist, ruft sie ein Repository auf, um die gewünschte Aktion auszuführen, und gibt das Ergebnis der Operation an den Controller zurück.
Wenn Sie Ihre Ansichtsmodelle im Webprojekt beibehalten, können Sie auch MVC-Validierungsattribute wie RemoteAttribute
.
Ich sage nicht, dass Ihr Design riecht , aber ich denke, es ist gut, die Präsentationslogik von Ihrer Core-Ebene zu trennen.
Mein Ansatz dafür, schnell zu denken, ist, so etwas zu tun. Erstellen Sie in der Business-Schicht
%Vor%Jetzt mit einem Service-Beispiel
%Vor%Jetzt rufen Sie im Controller den Dienst auf und übergeben die Validierungsnachrichten an die Ansicht. Es kann notwendig sein, ViewBag zu verwenden und die gesamte Liste zu übergeben. In der Ansicht können Sie Info, Warnung, Fehler markieren. Zum Beispiel könnten Sie eine Erfolgsmeldung mit Info-Typ oder gar nichts zurückgeben und im Controller eine Erfolgsmeldung erstellen.
Im Allgemeinen ist dieser Ansatz mehr Codierung, aber mehr Flexibilität. Idealerweise würde der Dienst alles validieren, aber für kleinere Projekte, um doppelte Validierung zu vermeiden, wie Henk Mollema in seiner Antwort erklärte, könnten Sie die Benutzereingabe über ViewModel validieren und im Service einfach nur kritische Geschäftsregeln validieren.
ValidationMessageType kann auch ein Overkill sein, daher ist es möglich, nur List vom Service als Fehlerliste zurückzugeben, und die leere Liste würde Erfolg bedeuten.
Eine gemischte Validierung könnte auch nützlich sein, um DataAnnotations mit einer eigenen Validierungslogik zu mischen
Dies kann hilfreich sein Ссылка
Tags und Links asp.net-mvc-4 design validation