2013-02-15 2 views
58

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

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

ответ

97

Обычно я использую уровень обслуживания при разработке приложения ASP.NET MVC. Он похож на Service Layer Pattern, о котором Мартин Фаулер обсуждает в Шаблоны архитектуры корпоративного приложения. Он инкапсулирует вашу бизнес-логику и делает контроллеры довольно тонкими. В основном контроллеры используют сервисный уровень для получения моделей домена, которые затем преобразуются в модели просмотра. Я также использую Unit of Work Design Pattern для обработки транзакций и Repository Design Pattern, чтобы инкапсулировать уровень доступа к данным для более легкого тестирования модулей и возможности легко менять ORM. На этом рисунке показаны типичные слои, которые я использую в приложении MVC.

MVC Architecture

слой службы обозначен как «Application или домен слой» в этой схеме, потому что я нахожу человек запутаться, когда вы используете термин «Service Layer». Они склонны думать, что это веб-сервис. Это на самом деле сборка, которая может использоваться вашей любимой технологией веб-сервисов, такой как ASP.NET Web API или WCF, а также контроллер.

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

+0

Спасибо, Кевин. >>> – user2062383

+4

Есть ли хороший пример, который реализует эту методологию? – Animesh

+0

@ В последнее время вы просто должны составить примеры из сети, EF + Code First или POCO-шаблон для DAL, T4Scaffolding для создания репозитория и UnitOfWork. Служба - это просто координация между DAL и POCO, инкапсулирующей бизнес-логику. Затем ASP.NET MVC Controller OR WebApi, который только вызывает уровень сервиса и показывает результаты (ASP.NET MVC) или выставляет его другому клиенту (ASP.NET WebApi) –

3

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

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

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

Best Repository Pattern for ASP.NET MVC

+1

Это гораздо больше, чем шаблон репозитория. Услуги касаются доступа к данным _too_, но не исключительно imho. – boj

7

Посмотрите на article из MSDN лучших практик.

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

21

Мой совет - создать отдельные классы, называемые «сервисы». Поместите их в проект библиотеки классов (или пространства имен) и сделайте их независимыми в инфраструктуре инфраструктуры MVC. Я рекомендую использовать также некоторую инъекцию зависимости (лучше всего - инъекция конструктора). Тогда ваши классы услуг могут выглядеть так:

public class MyService : IMyService 
{ 
    IFirstDependency _firstService; 
    ISecondDependency _secondService; 

    public MyService(IFirstDependency firstService, ISecondDependency secondService) 
    { 
    } 

    public Result DoStuf(InputDTO) 
    { 
     // some important logic   
    } 
} 

Затем вы используете эту услугу у своих контроллеров. Посмотрите here для полного примера.

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

+1

Я думаю, что проблема с пропуском раздела репозитория и перехода к ORM заключается в том, что ваши классы обслуживания будут напрямую получать контекст ORM, что означает, что все эти классы в вашей службе будут иметь доступ ко всем таблицам, которые вы вытащили в контекст вместо каждого класс обслуживания, работающий только с таблицами, в которых он нуждается. Вы могли бы избежать этого, передав DbSet в ctor каждого класса и разрешив это с помощью DI, но вы можете столкнуться с проблемами с этим? – user441521

6

Цитируя “Business logic should be in a service, not in a model”?:

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

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

Смежные вопросы