Создание сервисного уровня для моего приложения MVC?



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



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

644   5  

5 ответов:

Я обычно использую уровень сервиса при разработке ASP.NET приложение MVC. Это похоже на Шаблон Уровня Сервиса что Мартин Фаулер рассматривает в Шаблоны архитектуры корпоративных приложений. Он инкапсулирует вашу бизнес-логику и делает контроллеры довольно тонкими. В основном контроллеры используют уровень сервиса для получения моделей домена, которые затем преобразуются в модели представления. Я также использую единица работы шаблон to обрабатывать транзакции и Шаблон Проектирования Репозитория для инкапсуляции слой доступа к данным для упрощения тестирования и возможность легко поменять ОРМ по. Этот рисунок показывает типичный слои, которые я использую в приложении MVC.

MVC Architecture

уровень сервиса обозначен как "уровень приложения или домена" на этой диаграмме, потому что я нахожу, что люди путаются, когда вы используете термин "уровень сервиса". Они склонны думать, что это веб-служба. Оно на самом деле это сборка, которая может быть использована вашей любимой технологией веб-сервиса, например 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.

посмотри статьи из лучших практик MSDN.

исходный код приложения в статье можно найти здесь.

цитирую "бизнес-логика должна быть в сервисе, а не в модели"?:

в архитектуре MVP/MVC/MVVM/MV* службы вообще не существуют. Или если они это делают, термин используется для обозначения любого универсального объекта, который может быть введен в контроллер или модель представления. Бизнес-логика находится в вашей модели. Если вы хотите создать "объекты обслуживания" для организации сложных операций, это рассматривается как деталь реализации. Многие люди, к сожалению, реализуют MVC, как это, но это считается анти-шаблоном (анемичная модель домена), потому что сама модель ничего не делает, это просто куча свойств для пользовательского интерфейса.

некоторые люди ошибочно думают, что принимая 100-линейный метод контроллера и запихивая все это в сервис каким-то образом делает для лучшей архитектуры. На самом деле это не так; все, что он делает, это добавляет еще один, вероятно, ненужный слой косвенности. Практически говоря, контроллер все еще делает работу, он просто делает это через плохо название "вспомогательных" объектов. Я очень рекомендую Джимми Богарда Злые Доменные Модели презентация для наглядного примера того, как превратить анемичную модель домена в полезную. Он включает в себя тщательное изучение моделей, которые вы предоставляете, и какие операции действительно действительны в бизнес-контексте.

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

http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/implementing-the-repository-and-unit-of-work-patterns-in-an-asp-net-mvc-application

этот ответ здесь также может помочь:

лучший шаблон репозитория для ASP.NET MVC

Comments

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