Модель жира / тонкий контроллер против сервисного слоя [закрыто]



Я разрабатываю корпоративные приложения в течение многих лет, используя .Net
Мои приложения обычно имеют модель домена, содержащую сопоставление сущностей с таблицами БД SQL.
Я использую шаблон репозитория, инъекцию зависимостей и уровень сервиса.



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



Вариант 1-Модель разговаривает с услуги



контроллер тонкий, вызывает методы на моделях. Модели "знают", как загружать себя из БД и общаться с репозиториями или службами.
Например, customerModel имеет метод Load (id) и загружает клиента и некоторые дочерние объекты, такие как GetContracts ().



Вариант 2-контроллер разговаривает со службами



контроллер запрашивает службы для извлечения объектов модели. Логика погрузки / хранения и т. д. Находится в сервисном слое. Модель-это чистая модель сущности с только данные.



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



Спасибо за все советы и ссылки на хорошие ресурсы.

828   4  

4 ответов:

все это зависит от намерений и требований вашего приложения.

тем не менее, вот мое предложение для "среднего масштаба" (не местный ресторан, а не Twitter/Facebook) веб-приложений.

  1. Lean Domain Modeling

    сухие объекты стиля POCO, предпочтительно неосведомленные об архитектуре MVC вашего веб-приложения, чтобы оставаться как можно более свободно связанными с вашей конкретной реализацией.возможно, даже класс библиотека repack-возможность использования во внешнем приложении, например, REST API через веб-службу WCF).

    "модель" в MVC наиболее точно означает модель, о которой знает контроллер и так модель, предназначенная для просмотра.

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

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

  2. Надежный Уровень Обслуживания

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

    в моей личной практике я кодирую службы как на уровне данных, так и на уровне данных, которые я считаю своим поведенческим моделированием объектов POCO (механика персистентности, проверка низкого уровня и т. д.), и услуги более высокого уровня (бизнес / функция рабочего процесса) ближе к MVC механика.

  3. Lean Контроллеры

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

    1. вызов служб, которые взаимодействуют с сущностью / доменом Модели

    2. подготовьте модель вида для соответствующего вида.

    даже аутентифицированные / авторизованные действия контроллера выполняются с помощью введенных сервисов / атрибутов.


редактировать 1:

имейте в виду, что это не означает, что ваша модель сущности/домена является или должна быть анемичной. ОРМ, репозитории и фабрики, валидация или государственная механика приветствуются. Это единственное средство для применения умеренный масштаб,модель в MVC представляет модель, предназначенная для контроллера, чтобы передать ваш взгляд.

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

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


EDIT 2:

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


редактировать 3:

Я хотел бы отметить, что это объяснение и совет для контекста на стороне сервера Архитектура MVC нравится ASP.Net, а не для кленовых рамок, таких как нокаут или позвоночник.

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

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

MVC

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

контроллер Контроллер-это клей. Он принимает информацию от модели и приспосабливает ее к взгляду и недостатку наоборот.

View Представление должно отображать только то, что видит пользователь.

обратите внимание, что вы не должны путать модель с моделями представления. Microsoft действительно должна была назвать папку "модель" "ViewModels", так как это то, что они есть. Я бы не стал использовать информацию из "модели" непосредственно в представлениях. В противном случае вам придется изменить модель, если вид будет изменен, и наоборот.

ответ

в модель - это не модель вида, а слой. Все в модели используется для получения информации, необходимой для представления. Контроллер принимает эту информацию и помещает ее в одну модель представления.

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

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

обратите внимание, что уровень сервиса может не понадобиться. Вы можете позвонить в или в/М непосредственно от контроллеров. Но если вы обнаружите, что дублируете код или получаете контроллеры fat, просто переместите логику на уровень сервиса. Это изменение не повлияет ни на что, кроме контроллера, так как вы используете правильные модели представления.

1: Можно подумать, что модель = = сервис. Модель также является бизнес-слоем.

Вариант 2 является анемичной моделью домена анти-паттерн. http://en.wikipedia.org/wiki/Anemic_domain_model

Вариант 2-это то, что описывается как архитектура Fat Stupid Ugly Controllers (ссылка на автора этого выражения). Это решение, как правило, против духа MVC, поскольку оно нарушает разделение проблем.

Comments

    Ничего не найдено.