我们是否应该使用BLL项目中的数据传输对象(DTO)作为Web项目中的模型来显示数据?

时间:2014-07-11 11:30:45

标签: asp.net asp.net-mvc

我们是否应该使用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; }
}

1 个答案:

答案 0 :(得分:2)

您可能不需要为这些示例类创建视图模型。没有视图模型映射,这些工作正常。但如果这些仅仅是示例,并且您拥有更大的域模型,那么它取决于许多问题:

  1. 域模型是否非常复杂,是否存在深层继承树?
  2. 是否要向班级添加特定于视图的信息?
  3. 如果这两个问题得到肯定,那么创建视图模型映射可能会很有用。在某些情况下,某些机制往往会变得有点复杂,尤其是在与JSON进行序列化时。一个非常深的域类树可以让你在这里遇到麻烦。

    我总是建议使用专用的视图模型并使用AutoMapper映射域模型,因为它的使用非常简单有效,并且您还可以使用视图特定信息扩展视图模型类,在域模型中没有位置。当域模型用于其他应用程序或层时,这一点变得特别有趣,并且不应该混淆视图数据。