Должен быть слой сервиса в Asp.net в MVC?

должен ли быть уровень обслуживания в Asp.net MVC между контроллером и репозиторием? Поскольку репозиторий существует только для доступа к данным. Некоторая бизнес-логика просачивается в контроллер. Это может создать проблему, если та же операция используется classic Asp.Net клиент, как мы должны дублировать логику в контроллере.

6 ответов


Я настоятельно рекомендую использовать уровень сервиса, чтобы вы могли делиться общей функциональностью между различными веб-приложениями. Это может быть случай, когда архитектура уже существует, и вы можете добавить новый веб-сайт mvc на переднем конце.

для простых архитектур, построенных с нуля, это может быть перебор.


Если вы следуете за доменным дизайном до буквы, вы обнаружите, что есть 3 вида услуг (вы не любите перегруженные термины?).

  • Доменных Служб: инкапсулирует бизнес-логику, которая естественным образом не вписывается в объект домена и не является типичными операциями CRUD - они принадлежат хранилище.
  • Услуги Приложение: используется внешними потребителями для разговора с вашей системой (подумай!--14-->Веб-Служб). Если потребителям нужен доступ к операциям CRUD, они будут выставлены здесь (но обрабатываются соответствующим хранилище)
  • Услуги Инфраструктуры: используется для абстрактных технических проблем (например, MSMQ, поставщик электронной почты и т. д.)

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

надеюсь, что это поможет!


TBH, я пошел в обоих направлениях. Моя текущая перспектива заключается в том, что репозиторий is служба, это просто служба, у которой есть работа по обработке CRUD ops для агрегатного корня домена. теперь, если вы "репозитории" напрямую сопоставлены 1:1 с вашими сущностями (и, следовательно, не репозитории, а DAOs), тогда я мог бы увидеть аргумент. Но обычно я добавляю слои абстракции по мере необходимости, но не до тех пор, пока не доказано, что они нужны для данного приложения. В противном случае, вы переинженер.


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


Я немного поэкспериментировал с этим. Приложение, которое я создавал, было довольно грубым, и мой сервисный уровень в конечном итоге показал почти те же интерфейсы, что и мои репозитории. Кроме того, большинство вызовов службы не добавляли никакой дополнительной логики поверх РЕПО, они были просто сквозными методами. Единственное место, где сервис layer сделал что-нибудь во время обновления или вставки новой записи. я решил, что в системе на основе CRUD уровень обслуживания вызвал больше трение, чем добавленная стоимость. В конце концов я расширил классы бизнес-модели, чтобы логика обслуживания была представлена как операции против модели, таким образом, сохраняя мои методы контроллера сухими и чистыми.

в более поведенческой системе, однако, я думаю, что уровень сервиса может добавить больше значения.


Мне нравится иметь репозитории непосредственно в контроллере в большинстве случаев и делать сервис, где я чувствую, что он протекает. Я пытаюсь иметь богатые объекты домена, но в тех случаях, когда логика не вписывается в классы домена, я создаю сервис.