Создание сервисного уровня для моего приложения MVC?
из того, что я понимаю, MVC отделяет определения классов (модель) от представления (представления) через "клей", который является контроллером. Контроллер должен нести единую ответственность и поэтому быть проверяемым. ViewModels используются для объединения данных из нескольких объектов и для" массажа " данных из контроллера для представления.
похоже, что бизнес-логика на самом деле не имеет места... поэтому я думаю, что другой слой для услуг будет подходящим. Я просто не уверен, где разместить этот слой, или как построить сервисы-должен ли это быть класс под названием "сервисы", который содержит кучу функций? Я немного новичок в MVC, поэтому любые материалы для чтения, образцы или общие советы Новичка были бы потрясающими.
5 ответов:
Я обычно использую уровень сервиса при разработке ASP.NET приложение MVC. Это похоже на Шаблон Уровня Сервиса что Мартин Фаулер рассматривает в Шаблоны архитектуры корпоративных приложений. Он инкапсулирует вашу бизнес-логику и делает контроллеры довольно тонкими. В основном контроллеры используют уровень сервиса для получения моделей домена, которые затем преобразуются в модели представления. Я также использую единица работы шаблон to обрабатывать транзакции и Шаблон Проектирования Репозитория для инкапсуляции слой доступа к данным для упрощения тестирования и возможность легко поменять ОРМ по. Этот рисунок показывает типичный слои, которые я использую в приложении MVC.
уровень сервиса обозначен как "уровень приложения или домена" на этой диаграмме, потому что я нахожу, что люди путаются, когда вы используете термин "уровень сервиса". Они склонны думать, что это веб-служба. Оно на самом деле это сборка, которая может быть использована вашей любимой технологией веб-сервиса, например ASP.NET Web API или WCF, а также контроллер.
Что касается соглашений об именах, я обычно использую что-то, что описывает домен, за которым следует служба. Например, если у меня есть уровень сервиса, который обрабатывает членство пользователя, то у меня будет класс с именем MembershipService, который имеет все методы, необходимые контроллерам и веб-службам для запроса и управления доменом членства. Отмечать вы можете иметь несколько доменов в одном приложении, так что вы можете иметь несколько слоев. Моя точка зрения заключается в том, что вам не нужно иметь одну монолитную службу, которая заботится обо всем приложении.
мой совет-создать отдельные классы под названием "сервисы". Поместите их в другой проект библиотеки классов (или пространства имен) и сделайте их независимыми от инфраструктуры MVC framework. Я рекомендую использовать также некоторую инъекцию зависимостей (лучше всего это инъекция конструктора). Тогда ваши классы обслуживания могут выглядеть так:
public class MyService : IMyService { IFirstDependency _firstService; ISecondDependency _secondService; public MyService(IFirstDependency firstService, ISecondDependency secondService) { } public Result DoStuf(InputDTO) { // some important logic } }затем вы потребляете эти службы от ваших контроллеров. Смотри здесь для полного примера.
По Репозиториям - мой совет-не использовать их, если вы собираетесь использовать какой-то современный ORM (NHibernate, EntityFramework), потому что ваша бизнес-логика будет инкапсулирована на уровне сервиса, а ваша база данных будет уже инкапсулирована с помощью ORM framework.
цитирую "бизнес-логика должна быть в сервисе, а не в модели"?:
в архитектуре MVP/MVC/MVVM/MV* службы вообще не существуют. Или если они это делают, термин используется для обозначения любого универсального объекта, который может быть введен в контроллер или модель представления. Бизнес-логика находится в вашей модели. Если вы хотите создать "объекты обслуживания" для организации сложных операций, это рассматривается как деталь реализации. Многие люди, к сожалению, реализуют MVC, как это, но это считается анти-шаблоном (анемичная модель домена), потому что сама модель ничего не делает, это просто куча свойств для пользовательского интерфейса.
некоторые люди ошибочно думают, что принимая 100-линейный метод контроллера и запихивая все это в сервис каким-то образом делает для лучшей архитектуры. На самом деле это не так; все, что он делает, это добавляет еще один, вероятно, ненужный слой косвенности. Практически говоря, контроллер все еще делает работу, он просто делает это через плохо название "вспомогательных" объектов. Я очень рекомендую Джимми Богарда Злые Доменные Модели презентация для наглядного примера того, как превратить анемичную модель домена в полезную. Он включает в себя тщательное изучение моделей, которые вы предоставляете, и какие операции действительно действительны в бизнес-контексте.
похоже, что вы будете после чего-то вроде шаблона репозитория. Вы можете прочитать об этом здесь:
этот ответ здесь также может помочь:

Comments