Где лучше всего сопоставить модель представления с моделью домена? - PullRequest
14 голосов
/ 10 апреля 2011

Где лучшее место для сопоставления модели представления с моделью домена? Под отображениями я подразумеваю от моего EditGrantApplicationViewModel до GrantApplication объекта.

Допустим, у меня есть следующий метод действия (частичный код):

[HttpPost]
public ActionResult Create(EditGrantApplicationViewModel editGrantApplicationViewModel)
{
   if (!ModelState.IsValid)
   {
      return View("Create", editGrantApplicationViewModel);
   }

   return View("Index");
}

Нужно ли передавать editGrantApplicationViewModel в метод уровня обслуживания и выполнять сопоставления в методе?

Ответы [ 4 ]

24 голосов
/ 10 апреля 2011

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

Почему вы можете спросить?Достаточно просто, поместив логику сопоставления на ваш сервисный уровень, он должен знать о ViewModels, о которых НИКОГДА не должен знать сервисный уровень, - это также снижает гибкость приложения, в которое вы помещаете логику отображения, поскольку вы не можетеповторно использовать сервисный уровень без большого количества хаков.

Вместо этого вы должны сделать что-то вроде:

// Web layer (Controller)
public ActionResult Add(AddPersonViewModel viewModel)
{
    service.AddPerson(viewModel.FirstName, viewModel.LastName)
    // some other stuff...
}

// Service layer
public void AddPerson(string firstName, string lastName)
{
    var person = new Person { FirstName = firstName, LastName = lastName };
    // some other stuff...
}

Поступая так, как описано выше, вы делаете свой сервисный уровень более гибким, поскольку он не привязан копределенного класса, и он не знает о существовании вашей модели представления.

ОБНОВЛЕНИЕ:

Чтобы отобразить ваши сущности, возвращенные из сервисного слоя, в ViewModels, вы можете захотеть взятьвзгляд на Automapper или Значение Injecter .

4 голосов
/ 10 апреля 2011

Используйте AutoMapper или аналогичный каркас непосредственно в вашем контроллере.

Вот введение

1 голос
/ 10 апреля 2011

сделайте это в вашем WebUI слое, но не делайте этого в контроллере , вместо этого вызовите свой пользовательский интерфейс / класс / конструктор / там

образец : http://prodinner.codeplex.com

0 голосов
/ 10 апреля 2011

Я бы никогда не передал модель представления на уровень обслуживания.Если вы пойдете по этому маршруту, ваша служба получит прямые знания о том, что отображается в представлении.Это может привести к изменениям в вашей модели представления, что приведет к изменениям в вашем слое обслуживания.

Например: Допустим, вы решили добавить SelectList в модель представления для причины редактирования гранта.

public class EditGrantApplicationViewModel
{
   //...
   public SelectList ReasonForEdit {get;set;}
   //...
}

Это может быть вполне допустимым требованием, но спросите себя, имеет ли смысл передача SelectList на уровень обслуживания?Список выбора больше относится к области пользовательского интерфейса и ничего не значит для уровня обслуживания.Служебный уровень заботится только о причине, а не о списке выбора.

Я бы взял вашу модель представления, переварил необходимую информацию и затем передал бы эту единицу на уровень обслуживания.

[HttpPost]
public ActionResult Create(EditGrantApplicationViewModel editGrantApplicationViewModel)
{
   if (!ModelState.IsValid)
   {
      return View("Create", editGrantApplicationViewModel);
   }

   GrantApplication grantApplication = new GrantApplication();
   grantApplication. // other fields.
   grantApplication.Reason = editGrantApplicationViewModel.ReasonForEdit.SelectedValue;
   grantApplication. // other fields.
   _someService.EditApplication(grantApplication);

   return View("Index");
}

Есливы еще не посмотрели, посмотрите AutoMapper , так как он может помочь вам сделать между моделью представления, dto и другими классами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...