Архитектура ASP.Net MVC — отсутствует слой?

Я использую метод слоя Entity Framework/Repository-UnitOfWork/Service в этом приложении ASP.NET MVC, и он отлично работает, но кажется, что слой может отсутствовать, чтобы контроллеры были тонкими.

Возьмем, к примеру, сценарий аутентификации пользователя:

1) AuthenticationController принимает IAuthenticationService, который, в свою очередь, принимает IUnitOfWork и IRepository<User> (я использую общие репозитории).

2) В контроллере я хочу сделать его единственной заботой о том, чтобы служба аутентифицировала пользователя:

if (userService.AuthenticateUser(model.userName, model.password)) {
    FormsAuthentication.SetCookie(...);
    return RedirectToAction(...);
}

return View(model);

Некоторые скажут, что в контроллере слишком много логики, верно? Таким образом, кажется, что нам может понадобиться диспетчер приложений, если вы:

if (appManager.AuthenticateUser(model.userName, model.password)) {
    // Here the app manager calls the service???
    return RedirectToAction(...);
}

Я пытаюсь, чтобы мои доменные службы не зависели от приложения-потребителя, чтобы я мог использовать их в MVC, WinForms, Console, WPF, WCF и т. д.

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

Любой вклад в это было бы здорово!!


person Sam    schedule 26.08.2012    source источник
comment
Это может лучше подойти для Programers.stackexchange.com, если вы просто ищете советы по передовой практике. Хотя вы определенно движетесь в правильном направлении.   -  person Tieson T.    schedule 26.08.2012


Ответы (1)


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

person Erik Funkenbusch    schedule 26.08.2012
comment
Я согласен с использованием AutoMapper, я уже согласен, но в этом примере установка файла cookie FormsAuthentication не является обязанностью контроллера, или это так? Также как насчет более сложной ситуации, когда вы строите агрегированную модель? - person Sam; 26.08.2012
comment
@SamStriano - Вы должны понимать, что уровень представления отвечает за установку файлов cookie и работу с внешней аутентификацией. Установка файла cookie является частью уровня пользовательского интерфейса, а не частью более низких уровней. - person Erik Funkenbusch; 26.08.2012