2010-06-29 2 views
7

Ich fühle mich im Moment ein wenig widersprüchlich. Ich habe eine Webanwendung, die Stripes für ein MVC-Framework und Spring/Hibernate für das Back-End verwendet. Ich habe ein Konto Registrierungsverfahren in meiner MVC-Schicht, die die folgende Validierung erfordert:Sollte ich die Validierung in meiner MVC-Ebene und Serviceebene duplizieren?

  • Benutzername nicht bereits vergeben ist, wird
  • Die angegebene E-Mail-Adresse nicht bereits mit einem anderen Konto

Ich habe assoziiert ein Validierungsmethode in Stripes (MVC-Ebene), die diese beiden Fälle überprüft, aber sich gefragt hat, ob meine Dienstschicht diese Prüfungen duplizieren sollte? Wenn die Service-Layer-Schnittstelle als Web-Service verfügbar gemacht wurde, dann wäre die Validierung eine gute Idee, aber wenn sie nur im Kontext einer Web-Anwendung verwendet wird, ist sie erforderlich?

Edit: Ich beabsichtige nicht, den Validierungscode zu duplizieren - ich meine, die Validierungsmethode an zwei Stellen zu duplizieren.

Ich sehe meine Optionen wie:

  1. die Validierungs Anrufe sowohl in der MVC Duplizieren und Service-Layer
  2. Nur diese Validierung in der Schicht MVC ausführen
  3. Nur diese Validierung in der Dienstschicht durchzuführen.

Was ist die beste Praxis hier? Ich suche Rat/Meinungen zu welcher Option ich gehen sollte und warum.

Beachten Sie, dass es bei den Eingabefeldern des Registrierungsformulars einfache Validierungsprüfungen gibt (wie das Überprüfen von Leerzeichen) und dass diese nur von der MVC-Validierung behandelt werden sollten. Ich bin nur besorgt über komplexere Validierungen.

Antwort

1

Annie,

Gute Frage, ich habe mich gleich in vielen Gelegenheiten gefragt. Hier ist, womit ich (bis jetzt) ​​endete.

Der reinste (aber mühsame) Ansatz besteht darin, die Validierungslogik in beiden Schichten aufzurufen. der pragmatische Ansatz könnte sein, nur im Web-Land (z. B. Ihre Controller) aufzurufen.

Ich denke, es gibt keine Antwort, die alle Diskussion beendet. Ich denke, das hängt vom Kontext Ihres Projekts ab. Wenn die Projektgröße bescheiden ist (in Bezug auf Personen und Größe der Codebasis) und Sie sicher sind, dass nicht viel Code von anderen entwickelt wird, die Ihre Service-API aufrufen (in einem Umfang, den Sie nicht überwachen können)), dann kann die Validierung in der Web-Ebene nur ausreichen.

Wenn Sie jedoch viele Clients erwarten, benötigen Sie möglicherweise eine höhere Sicherheit. Wenn ich hier Sicherheit sage, bezeichne ich dies als das Niveau der Konsistenz - Garantien, die Sie brauchen. Wenn dieses Level hoch ist, gibt es kein Problem damit: Sie müssen es sowohl im Service (für die Sicherheit) als auch im Web-Layer tun (hauptsächlich um den Endbenutzern eine akzeptable Erfahrung zu bieten).

Der Schlüsseltreiber hier ist Sicherheit und wie viel davon Sie wirklich brauchen. Wenn Sie viel brauchen, gehen Sie für den "puristischen" Ansatz. Wenn Ihre Bewerbung nicht genau Entscheidungen trifft, die sich auf Leben und Tod beziehen, gehen Sie für den pragmatischen Ansatz.

5

Kopieren Sie den Code nicht. Verwenden Sie JSR303 Bean Validation, damit Sie die gleiche Validierungslogik in allen Schichten Ihrer App verwenden können.

(ein separates Projekt aus dem Hibernate ORM-Zeug) bietet die Referenzimplementierung dieser Schnittstelle. Es ist tot einfach zu bedienen, können Sie get started with it very quickly.

+0

Yep, ich meine nicht, ich werde den Validierungscode duplizieren - ich meine, ich werde den gleichen Validierungscode an zwei Stellen aufrufen – JMM

+0

Nun, wie du schon erwähnt hast, musst du die Validierung zweimal durchführen Falls Sie neben der Controller-Schicht noch andere Clients haben. Potenziell könnte ich sehen, dass ich möglicherweise auch eine andere Validierungslogik haben möchte –

1
  1. Idealerweise macht die Validierung in den beiden Schichten, da Ihre Dienstschicht

    mit einem Client anders als die aktuelle mvc Schicht verwendet werden kann
  2. Wiederverwendung den Validierungsmechanismus an beiden Orten (Bean-Validierung, zum Beispiel

    )
3

meiner Meinung nach sollte man zwei Arten von Validierungen diferenciate:

  • Die Validierung der Formatdaten: Welche sollten in der Präsentationsschicht validiert werden (MVC in Ihrem Fall). Normalerweise sowohl in der Client- und der Server-Seite
  • Die Bussines Datenvalidierung: Welche in der Dienstschicht validiert werden soll

In Ihrem Fall sind die Prüfungen sind im Zusammenhang mit Geschäftsregeln, also werde ich sie setzen nur in der Serviceschicht. Wenn Sie Ihre Prüfungen in beiden Schichten duplizieren, werden Sie die gleichen Abfragen zweimal durchführen, was die Leistung Ihrer Anwendung verlangsamt.