从视图模型映射到域模型的最佳位置在哪里?

本文关键字:模型 最佳位置 在哪里 视图 映射 | 更新日期: 2023-09-27 17:49:41

从视图模型到域模型的映射最好的地方在哪里?通过映射,我的意思是从我的EditGrantApplicationViewModelGrantApplication对象。

假设我有以下动作方法(部分代码):
[HttpPost]
public ActionResult Create(EditGrantApplicationViewModel editGrantApplicationViewModel)
{
   if (!ModelState.IsValid)
   {
      return View("Create", editGrantApplicationViewModel);
   }
   return View("Index");
}

我是否需要将editGrantApplicationViewModel传递给业务层方法并在该方法中进行映射?

从视图模型映射到域模型的最佳位置在哪里?

您不应该将任何映射逻辑放在服务层中,因为它根本不属于那里。映射逻辑应该在你的控制器内部,而不是其他任何地方。

你可能会问为什么?很简单,通过将映射逻辑放置在服务层中,它需要知道服务层永远不应该知道的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或Value injector

在控制器中直接使用AutoMapper或类似的框架

简介

在您的 web 层中执行,但不要在控制器中执行,而是调用您的自定义映射器/构建器接口/类

: http://prodinner.codeplex.com

我个人永远不会将视图模型传递给服务层。如果您沿着这条路走下去,您的服务最终会直接了解视图上显示的内容。这将导致视图模型的更改,从而导致服务层的更改。

例如

:假设您决定在视图模型中添加一个SelectList,以便进行授权编辑。

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

这可能是一个完全有效的需求,但问问你自己,有一个SelectList传递到服务层有意义吗?选择列表更像是一个UI域,对服务层没有任何意义。服务层只关心原因而不关心选择列表。

我将使用您的视图模型,消化所需的信息,然后将该单元传递给您的服务层。

[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和其他类之间的