我们是否应该使用BLL项目中的数据传输对象(DTO)作为Web项目中的模型来显示数据,或者我们应该始终创建ViewModel?什么是最好的方法?
例如我在BLL项目DTO课程中:
public class EmployeeDTO
{
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
}
在控制器操作的Web项目中,我从BLL项目中调用方法,该方法返回EmployeeDTO的数据类型。然后我在视图中使用EmployeeDTO作为模型。
// in controller:
public ActionResult Employee(int id)
{
EmployeeDTO employeeDTO = BLL.BusinessLogic.GetEmployee(id);
return View(employeeDTO);
}
// in view:
@model BLL.DTO.EmployeeDTO
<dl class="dl-horizontal">
<dd>
@Html.DisplayFor(model => model.Id)
</dd>
<dd>
@Html.DisplayFor(model => model.Name)
</dd>
<dd>
@Html.DisplayFor(model => model.Age)
</dd>
</dl>
是否正确或者我应该创建ViewModel,将数据从DTO映射到ViewModel并在视图中使用ViewModel?但是ViewModel和DTO一样。
// ViewModel the same like DTO
public class EmployeeViewModel
{
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
}
答案 0 :(得分:2)
您可能不需要为这些示例类创建视图模型。没有视图模型映射,这些工作正常。但如果这些仅仅是示例,并且您拥有更大的域模型,那么它取决于许多问题:
如果这两个问题得到肯定,那么创建视图模型映射可能会很有用。在某些情况下,某些机制往往会变得有点复杂,尤其是在与JSON进行序列化时。一个非常深的域类树可以让你在这里遇到麻烦。
我总是建议使用专用的视图模型并使用AutoMapper
映射域模型,因为它的使用非常简单有效,并且您还可以使用视图特定信息扩展视图模型类,在域模型中没有位置。当域模型用于其他应用程序或层时,这一点变得特别有趣,并且不应该混淆视图数据。