从视图模型映射到域模型的最佳位置在哪里?
本文关键字:模型 最佳位置 在哪里 视图 映射 | 更新日期: 2023-09-27 17:49:41
从视图模型到域模型的映射最好的地方在哪里?通过映射,我的意思是从我的EditGrantApplicationViewModel
到GrantApplication
对象。
[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和其他类之间的