ASP.NET MVC: где вы собираете модель представления для представления? - PullRequest
7 голосов
/ 22 июня 2011

Изнутри наружу, это наши уровни приложений MVC:

  1. MS SQL / Таблицы / Представления / Хранимые Procs
  2. Entity Framework 4.1 (ORM) с генерацией POCO
  3. Репозиторий
  4. Сервисные (извлекаемые) и управляющие функции (Сохранить)
  5. Маршрутизация -> Контроллер -> Просмотр бритвы
  6. (клиент) JQuery Ajax с Knockout.js(MVVM)

Все в порядке, пока мне не нужно создать одну ViewModel для шага 5 для подачи как представления Razor, так и модели представления JSON / Knockout:

  • Заголовок, который включает в себя все параметры выпадающего списка и варианты для полей ниже
  • Элементы - массив всего, что мы отправляем клиенту, который становится ViewModel

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

Просто кажется излишним создавать отдельные сервисы для каждого представления.Например, viewModel для редактирования адреса и отдельная viewModel для редактирования свойства недвижимости, которое также имеет адрес.У нас может быть дюжина форм, которые редактируют один и тот же адрес POCO.

Чтобы облегчить ответ на этот вопрос, предоставляет ли Контроллер прямой доступ к репозиториям с утечкой абстракции?

Ответы [ 2 ]

1 голос
/ 22 июня 2011

Итак, у ваших контроллеров будет код, который переводит POCO из Entity Framework в отдельные объекты модели представления?

Если это так, то вы должны переместить этот код в отдельный класс и следовать одиночномупринцип ответственности.Находится ли этот класс в «слое обслуживания» или нет, зависит от вас.И используете ли вы AutoMapper или нет, зависит от вас.Но такого рода преобразователи данных не должны быть частью логики контроллера;контроллеры должны быть настолько тупыми, насколько это возможно.

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

userService.GetByUserName("bob")

в вашем тупом контроллере и реализовывать это особым образом, возвращая

userRepository.Users.Single(u => u.UserName == "bob")

Собрав их вместе, ваш UserController в итоге получит зависимости IUserService и IUserDataMapper, а код будет очень тупым, как вам нужно:

public ActionResult ShowUserPage(string userName)
{
    var user = userService.GetByUserName(userName);
    var viewModel = userDataMapper.MakeViewModel(user);

    return View(viewModel);
}

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

Сегодня утром я читал статью, в которой вы могли бы найти некоторую информацию по этим архитектурным вопросам.Он несколько снисходительно называется « Основы разработки программного обеспечения, часть 2: Многоуровневая архитектура ».Вы, вероятно, не сможете переключиться с модели приложения базы данных на модель постоянного невежества, которую описывает и предлагает эта статья.Но это может указать вам правильное направление.

0 голосов
/ 22 июня 2011

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

как только вы это сделаете, посмотрите automapper . это сопоставитель, который после правильной настройки может сопоставить модель вашего домена с вашей моделью представления и обратно.

...