Как структурировать приложение MVC на предприятии и куда идет бизнес-логика?

Я новичок в MVC. Насколько я могу судить:

  • Контроллер: обрабатывает запросы маршрутизации
  • Просмотр: относится к представлению данных
  • Модель: выглядит так же, как уровень доступа к данным

Где идет бизнес-логика?

Возьмите большое корпоративное приложение с помощью

  • Несколько разных источников данных (WCF, WebServices и ADO) связаны между собой на уровне доступа к данным (использование нескольких разных DTO).
  • Много бизнес-логики сегментированы по нескольким DLL.

Каким образом веб-приложение MVC подходит для работы над этим (с точки зрения кода и структуры проекта)?

В примере, который я видел, где все просто идет в папке "Модель", похоже, что они не подходят для очень больших приложений.

Спасибо за любой совет!

Ответ 1

В моих приложениях я обычно создаю проект "Core" отдельно от веб-проекта.

Основной проект содержит:

  • Бизнес-объекты, такие как объекты и т.д.
  • Доступ к данным
  • Все, что специально не предназначено для Интернета

Веб-проект содержит:

  • Контроллеры, которые направляют запросы от пользовательского интерфейса к основной логике
  • Представления, в которых основное внимание уделяется представлению данных в HTML
  • Показать Модели, которые сглаживают/трансформируют основные бизнес-объекты в более простые структуры, предназначенные для поддержки определенных представлений.

Ключевым моментом здесь является то, что веб-пространство моделей/пространство имен используется ТОЛЬКО для моделей, ориентированных на конкретные презентации, которые документируют конкретные переменные, необходимые для данного представления. Как можно больше "бизнес-логика" входит в основной проект.

Ответ 2

[ M] odel [ V] iew [ C], он звучит так, как будто он адресован вашим 3 уровням, но это не так. Он действительно организует, как ваш пользовательский интерфейс объединяется. Контроллер находится в середине, и обычно (A) делает вещи, используя объекты удобства [ B], и (B) из объектов B] получает [ M], чтобы перейти к [ V]. Часть MVC вашей системы (функциональность пользовательского интерфейса) не знает, что происходит на другой стороне бизнес-уровня. DB? Сервисные звонки? Диск IO? Лазеры для стрельбы? Таким образом, MVC-B -? будет аббревиатурой, описывающей MVC и как она подключается.

Подумайте о [ C] ontroller в центре, с линией, идущей вниз к объектам usiness [ B]. Контроллер обычно получает [ M] odel от объектов удобства [ B], чтобы перейти к [ V], но [ M] odel - это просто данные. Этот ключ. В настоящее время [ C] он является самой умной частью системы, но объекты удобства [ B] по-прежнему являются самыми мощными.

Таким образом, объекты [ M] являются большой частью связи между [ C] ontroller и [ B]. предметы удобства. Кроме того, каждое представление имеет объект VM ([ V] iew [ M]), который он принимает, который может быть [ M], но может быть построено с помощью [ C] ontroller для передачи более сложных наборов информации в [ V]. p >

Итак, контроллер (1) берет данные у клиента и делает вещи с бизнес-объектами (при необходимости), возможно, обмениваясь с использованием объектного объекта, а затем ( 2 > ) получить [ M] объект odel от объекта (ов) [ B], строит VM и дает ему на вид (возможно несколько) для рендеринга.

Сначала это действительно будет похоже на слои и уровни по всему месту, тем более, что попасть в MVC - это хорошее время для увеличения использования интерфейсов (см. последние 3 или 4 Solid principals) и модульное тестирование. У вас будет, вероятно, еще много файлов в вашем проекте, чем вы в противном случае. Очень быстро, хотя вы видите, что на самом деле это отличный способ организовать вещи.

Как эта "верхняя" часть системы, часть MVC, нам все равно, как были построены объекты [ M] или что [ B ] объекты удобства использования с ними. Не удивляйтесь, конечно, если ваш объект модели Customer выглядит очень похож на таблицу клиентов db! Это нормально и распространено. Тем не менее, ваш объект [ M] клиента и ваш пользовательский объект B] действительно будут иметь отдельные жизни. Хорошее время для рассмотрения шаблона репозитория .

Схватите соблазн быть ленивым и вложите много логики в [ C] ontroller. Стремитесь в каждый момент беспокоиться о том, где они внизу. Экран [ C] предназначен только для подключения. Если требуется много кода для создания адекватной VM для представления, это нормально, потому что это задание контроллеров. Слишком часто вы видите бизнес-логику или визуализацию логики в контроллере. Поместите его туда, где он принадлежит!

Я старался сбалансировать полноту с краткости, но вы задали огромный вопрос!

Ответ 3

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

Ответ 4

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

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

Таким образом, существует чистый разрыв между существующей бизнес-логикой и новым кодом на основе MVC.

Ответ 5

"Зависит":)

Запросы направляются контроллерам, которые обрабатывают их соответствующим образом. Контроллеры - это "клей", который держит все остальное (Модели, Представления и т.д.) Вместе. Таким образом, естественно, что "бизнес-логика" либо обрабатывается напрямую, либо выгружается другим компонентом контроллером.

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

В качестве альтернативы вы можете поместить логику в вспомогательные классы/функции или (как указывали другие), вы можете создать уровень сервиса для бизнес-логики.

Ответ 6

Вы можете использовать S # arp Architecture, чтобы правильно структурировать ваше приложение, используя лучшие практики. Существует всеобъемлющее примерное приложение, доступное по адресу: Кто может мне помочь?

Ответ 7

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

Проверьте MVC Contrib Project и образец лагеря кода, чтобы получить пример этого.

Я также нашел Rob Conery eCommerce Storefront и Northwind MVC стартовый комплект, чтобы помочь.

Ответ 8

IMO этот сценарий более подходит для чего-то вроде использования в WPF. ViewModel View Controller.

Контроллер разговаривает с бизнес-службами, которые выполняют функции на объектах домена. Контроллер преобразует данные, возвращенные из бизнес-сервисов (объединяя несколько, если необходимо) в View Models ( "M" в MVC). Затем модель просмотра передается в представление.

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