Что является лучшим местом для бизнес-логики в ASP.NET MVC при использовании репозиториев? - PullRequest
14 голосов
/ 15 октября 2011

При реализации репозитория для базы данных в проекте ASP.NET MVC, правильно ли размещать в нем бизнес-логику или может быть лучше поместить логику в класс контроллера? Или использовать дополнительные сервисные и вспомогательные классы для манипулирования данными?

Ответы [ 5 ]

14 голосов
/ 16 октября 2011

В конечном счете, нет идеального места для вашей бизнес-логики, кроме собственного уровня (как часть уровня «Модель»).Часто вы можете обойтись без другой реализации, но в каждом случае есть компромиссы.

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

Просмотр

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

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

В наши дни очень хорошо известно, что вы просто этого не делаете:)

Репозиторий

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

С из статьи EAA по шаблону репозитория :

Репозиторий является посредником междууровни отображения доменов и данных, действующие как коллекция объектов домена в памяти

Хранилище - это абстракция, представляющая хранилище данных в виде коллекции, в которой содержит объекты домена.

Никакая доменная логика не должна находиться в нем.Вместо этого он должен существовать в объектах вашего домена (по определению, поскольку ваша бизнес-логика является вашим доменом).

Чтобы сделать иначе (чтобы ваш репозиторий выполнял двойную функцию, а также проверял логику домена)) будет нарушением SRP ( принцип единой ответственности ) и будет пахнуть кодом.

У вас могут быть объекты домена более высокого уровня, которые работают с коллекциями объектов домена для проверки логики домена(например, зависимости в коллекции объектов, ограничения размера и т. д.).Они по-прежнему будут использовать ваши репозитории под прикрытием для окончательного хранения / извлечения объектов домена, поэтому они не будут выполнять двойную функцию (поэтому не будут нарушать SRP).

Контроллер

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

Модель - это домен, а домен - это ваша бизнес-логика.

Entities

Возможно, вы захотите поместить данные домена в сущности.

Но вы должны быть осторожны при доступе к свойствам навигации, если сущности присоединены, так как вы можете инициировать непреднамеренные запросы или исключения БД (в зависимости от того, удаляется ли ваш контекст илине).Отсоединение их также является проблемой, так как оно разрушает ваш граф объектов, если вы явно не присоединяете объекты друг к другу после отсоединения их от контекста.

Если вы создаете отдельные классы модели предметной области, вы можете рассмотреть обработку сущностей как DTO * только 1060 *.

Редактировать: IValidatableObject

Я только что узнал о функции в Entity Framework 4.1, которую вы, возможно, захотите проверить:IValidatableObject interface.

Вы можете сделать ваши сущности частичными классами, а в частичном классе реализовать этот интерфейс.Когда вы это сделаете, Entity Framework при вызове вызовет Validate, и вы можете позвонить Validate всякий раз, когда это будет целесообразно для вас.

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

См. эту статью: http://msdn.microsoft.com/en-us/data/gg193959

Примечание: виды / модели просмотра

Если вы думаете об этом, я предлагаю вам избежать соблазна передать сущности обратно в представление.Во многих случаях он ломается (например, сериализация Javascript для сохранения состояния просмотра) и в других случаях вызывает непреднамеренные запросы к БД.Вместо этого передайте простые типы (строки, целые, списки, хэш-наборы, словари и т. Д.) Или создайте классы модели представления для передачи в представление.

6 голосов
/ 15 октября 2011

Добавить уровень обслуживания для передачи моделей в репозиторий, где можно добавить классы обслуживания, соответствующие контроллеру. Например, если вы используете UserController и User Model, вы можете передать User Model в класс UserService.

Здесь Сервисный Уровень может действовать как мост между Репозиторием и контроллером, так что разделение Контроллера и Репозитория является хорошо установленным.

5 голосов
/ 15 октября 2011

В вашей модели Домена должна быть бизнес-логика.

Пожалуйста, посмотрите на этот ответ.

ASP.NET MVC - должна ли существовать бизнес-логика в контроллерах?

1 голос
/ 16 октября 2011

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

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

0 голосов
/ 16 октября 2011

На мой взгляд, это зависит от бизнес-логики. Является ли логика основанной на проверке правил ввода и ввода, если так, то лучше всего быть в модели. Однако, если это бизнес-правила, основанные на рабочем процессе, то это может потребоваться в контроллере, например, пользователь выбирает параметр A, а затем перенаправляется на другую страницу / форму, чем если бы был выбран параметр B. Если бизнес-правила должны иметь дело с сохранением данных, то, возможно, их нужно поместить в репозиторий (было бы странно помещать их мне). Существует множество дискуссий по этому поводу, но все зависит от того, насколько вы или ваша команда понимаете, насколько готовым и гибким будет конечный продукт в зависимости от реализации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...