Должен ли я дублировать проверку в моем слое MVC и сервисном слое?

StackOverflow https://stackoverflow.com/questions/3141253

Вопрос

Я чувствую себя немного противоречивым в данный момент. У меня есть веб-приложение, используя полосы для MVC Framework и Spring / Hibernate для задней части. У меня есть метод регистрации аккаунта в моем слое MVC, который требует следующей проверки:

  • Имя пользователя еще не принято
  • Предоставленный адрес электронной почты еще не связан с другим аккаунтом

У меня есть метод проверки в полосках (MVC Layer), который проверяет эти два случая, но задавались вопросом, должен ли мой сервисный слой дублировать эти проверки? Если интерфейс сервисного слоя был выставлен в качестве веб-службы, то я думаю, что проверка будет хорошей идеей, но если она используется только в контексте веб-приложения, это требуется?

Редактировать: Я не собираюсь дублировать код проверки - я имею в виду дублирование вызовов метода проверки в двух местах.

Я вижу свои варианты как:

  1. Дублируйте вызовы проверки как в MVC и Service Layer
  2. Выполните эту проверку только в слое MVC
  3. Выполните эту проверку только в сервисном слое.

Что здесь лучше всего? Я ищу совет / мнения, на которые я должен идти и почему.

Обратите внимание, что существуют простые проверки проверки на входных полях регистрационной формы (например, проверки для пробелов) и что, я думаю, что они должны обрабатываться только путем проверки MVC; Я обеспокоен более сложными валидациями.

Это было полезно?

Решение

Энни,

Хороший вопрос, я спросил себя так же во многих случаях. Вот что я оказался с (до сих пор).

Самый чистый (но утомительный) подход состоит в том, чтобы вызвать логику проверки в обоих слоях. Прагматичный подход может быть только называть его только на веб-земле (например, ваши контроллеры).

Я думаю, что нет ответа, который заканчивает все обсуждение. Я думаю, что это зависит от контекста вашего проекта. Если размер проекта является скромным (с точки зрения людей и размеров кодовой базы), и вы уверены, что другие не будут разработаны не целым большим количеством кода, что вызывает ваш сервисный API (в той степени, в которой вы не сможете контролировать ), затем выполнение проверки в веб-слое только вполне может достаточно.

Однако, если вы ожидаете, что многие клиенты вам может понадобиться безопасность более высокого уровня. Когда я говорю о безопасности здесь, я ссылаюсь на него как уровень консистенции - гарантии, которые вам нужны. Если этот уровень высок, вокруг него нет никакого способа: вам придется сделать это как на службе (для безопасности), так и в веб-слое (в основном, что сможет предоставить конечные пользователи с приемлемым опытом).

Таким образом, ключевой водитель здесь является безопасность и сколько из этого вам действительно нужно. Если вам нужно много, вы идете на подход «Пурист». Если ваше приложение точно не принимает решения, которые касаются вопросов жизни и смерти, вы идете на прагматичный подход.

Другие советы

Не дублируйте код. Использовать Валидация бобов JSR303 Таким образом, вы можете использовать ту же логику проверки во всех слоях вашего приложения.

Hibernate Validator. (Отдельный проект от веществ Hibernate ORM) предоставляет эталонную реализацию этого интерфейса. Это мертвое простое в использовании, вы можете Начните с это очень быстро.

На мой взгляд, вы должны отличать два вида валидаций:

  • Валидация данных формата: которая должна быть подтверждена в уровне презентации (MVC в вашем случае). Обычно как в клиенте, так и на стороне сервера
  • Валидация данных Bussines: которые должны быть подтверждены в сервисном слое

В вашем случае ваши проверки связаны с бизнес-правилами, поэтому я поставлю их только в сервисный слой. Кроме того, если вы дублируете свои проверки в обоих слоях, вы будете дважды делать одни и те же вопросы, замедляя производительность вашего приложения.

  1. В идеале выполните проверку в обоих слоях, поскольку ваш сервисный слой может использоваться с клиентом, отличным от текущего уровня MVC

  2. Повторно использовать механизм проверки в обоих местах (например, проверка бобов, например)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top