2010-06-29 5 views
7

Obecnie czuję się trochę skonfliktowany. Mam aplikację internetową używającą Stripes dla frameworku MVC i Spring/Hibernate dla back-end. Mam metodę rejestracji konta w moim warstwy MVC, które wymagają następujące Walidacja:Czy należy powielić sprawdzanie poprawności w mojej warstwie MVC i warstwie usługi?

  • Nazwa użytkownika nie jest już zajęta
  • Podany adres e-mail nie jest powiązany z innym kontem

mam metoda sprawdzania poprawności w paskach (warstwa MVC), która sprawdza te dwa przypadki, ale zastanawiała się, czy moja warstwa usług powinna powielić te kontrole? Jeśli interfejs warstwy usług został ujawniony jako usługa sieciowa, myślę, że sprawdzanie poprawności byłoby dobrym pomysłem, ale jeśli jest używane tylko w kontekście aplikacji sieciowej, czy jest to wymagane?

Edycja: Nie mam zamiaru duplikować kodu walidacyjnego - mam na myśli duplikowanie wywołań metod walidacji w dwóch miejscach.

widzę moje opcje jak:

  1. Duplikat połączeń walidacji zarówno MVC i warstwy usług
  2. wykonać tylko ten walidacji w warstwie MVC
  3. wykonać tylko ten walidacji w warstwie usług.

Jaka jest najlepsza praktyka? Szukam porady/opinii na temat opcji, którą powinienem wybrać i dlaczego.

Należy zauważyć, że istnieją proste kontrole sprawdzania poprawności w polach wejściowych formularza rejestracyjnego (np. Sprawdzanie pustych pól) i uważam, że powinny one być obsługiwane wyłącznie przez walidację MVC; Martwi mnie tylko bardziej złożona walidacja.

Odpowiedz

1

Annie,

Dobre pytanie, ja zadawałem sobie to samo w wielu okazjach. Oto, na czym skończyłem (do tej pory).

Najczystsza (ale nużąca) metoda polega na wywołaniu logiki walidacji na obu warstwach. pragmatyczne podejście może polegać jedynie na wywoływaniu go w sieci (np. Kontrolerach).

Myślę, że nie ma odpowiedzi, która kończy całą dyskusję. Myślę, że to zależy od kontekstu twojego projektu. Jeśli rozmiar projektu jest niewielki (pod względem liczby osób i wielkości bazy kodów) i masz pewność, że nie zostanie opracowany zbyt dużo kodu przez innych, którzy wywołają Twój interfejs API usług (w stopniu, w którym nie będziesz w stanie nadzorować), wtedy wystarczy tylko sprawdzenie poprawności w warstwie internetowej.

Jednakże, jeśli oczekujesz wielu klientów, możesz potrzebować zabezpieczeń na wyższym poziomie. Kiedy mówię tu o bezpieczeństwie, nazywam go poziomem gwarancji konsystencji, którego potrzebujesz. Jeśli ten poziom jest wysoki, nie ma możliwości obejścia go: będziesz musiał to zrobić zarówno w usłudze (dla bezpieczeństwa), jak i w warstwie internetowej (głównie w celu zapewnienia użytkownikom końcowym akceptowalnego doświadczenia).

Tak więc kluczowym kierowcą jest bezpieczeństwo i to, ile naprawdę potrzebujesz. Jeśli potrzebujesz dużo, wybierasz podejście "purystyczne". Jeśli twoje podanie nie podejmuje dokładnie decyzji odnoszących się do życia i śmierci, idziesz do pragmatycznego podejścia.

5

Nie duplikuj kodu. Użyj JSR303 Bean Validation, aby używać tej samej logiki sprawdzania poprawności we wszystkich warstwach aplikacji.

Hibernate Validator (osobny projekt z rzeczy w technologii Hibernate ORM) zapewnia implementację referencyjną tego interfejsu. Jest prosty w obsłudze, możesz get started with it very quickly.

+0

Tak, nie mam na myśli, że powielę kod walidacyjny - mam na myśli to, że będę dzwonił do tego samego kodu weryfikacyjnego w dwóch miejscach – JMM

+0

Tak jak wspomniałeś, naprawdę powinieneś zrobić to dwa razy, w przypadku masz innych klientów oprócz warstwy kontrolera. Potencjalnie mogłem zobaczyć, że potencjalnie chce mieć również inną logikę walidacji –

1
  1. Idealnie zrobić walidacji w obu warstwach, ponieważ Twój warstwa usługa może być używany z klientem innego niż bieżący mvc warstwy

  2. Reuse mechanizm walidacji w obu miejscach (walidacja Bean, na przykład)

3

moim zdaniem należy diferenciate dwa rodzaje walidacji:

  • Sprawdzanie poprawności formatu: które powinno być sprawdzone w warstwie prezentacji (w twoim przypadku MVC). Normalnie zarówno w kliencie i po stronie serwera
  • Walidacja danych Bussines: Jakie powinny być zatwierdzone w warstwie usług

W twoim przypadku twoje walidacji są związane z regułami biznesowymi, więc będę je tylko w warstwa usługowa. Ponadto w przypadku powielania sprawdzeń na obu warstwach będą dwa razy takie same zapytania, co spowolni działanie aplikacji.

Powiązane problemy