Контроллеры обрабатывают поток приложений, так куда же девается моя бизнес-логика?

Я начну этот вопрос с признания, что я новичок в MVC. Шаблон проектирования имеет смысл для меня на высоком уровне, но теперь, когда я изучаю ASP.NET MVC, некоторые архитектурные элементы бросают вызов моим предвзятым представлениям. Обучение это хорошая вещь.

В последнее время я работал с Oxite как инструмент обучения, написанный людьми из компании, которая создала ASP.NET MVC и, следовательно, якобы эталонное приложение для ASP.NET MVC.

Но сегодня я увидел сообщение в блоге о Оксите Роба Конери, в котором говорится:

Одна из вещей, которую команда Oxite решила сделать, это разделить Контроллеры и Представления в другом Проекте, и я могу только предположить, что это отделение бизнес-логики от логики представления. Это может привести к некоторой путанице, поскольку контроллеры предназначены для обработки потока приложения, а не для бизнес-логики.

Это бросило меня в тупик. Является ли это разделение принципом MVC и, следовательно, ошибкой разработчиков Oxite, или это мнение Роба? Если бизнес-логика принадлежит модели, почему команда Oxite поместила ее в контроллер? Как выполнить действие, которое является бизнес-логикой, если не в контроллере?

Кроме того, я делаю ошибку, используя Oxite в качестве учебного ориентира, учитывая комментарии, подобные комментариям Роба?

2 ответа

Решение

Ваша бизнес-логика идет на вашем бизнес-уровне. Контроллеры используют бизнес-уровень для создания модели ваших представлений для визуализации. Хорошим примером является приложение MVC Storefront, созданное Робом Конери. Oxite в настоящее время получает много плохой прессы, поскольку он, очевидно, не очень хорошо использует инфраструктуру MVC.

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

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

Это можно установить в одном отдельном проекте, который является не чем иным, как DLL.

Затем создайте приложение MVC, которое на самом деле является вашим уровнем представления, и используйте его для своего бизнес-уровня. контроллеры будут работать с вашими Сервисами и перекачивать данные, сгенерированные этими Сервисами, в ViewData, которые затем добавляются в ваши Представления.

Контроллеры должны иметь дело только с проблемами маршрутизации, такими как отображаемые представления, основанные на вводе данных пользователем из форм, строк запросов, файлов cookie, сеансов и т. Д.

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

Другие вопросы по тегам