【问题标题】:MVC, is M model of domain or it is confined and prepared data?MVC,是域的M模型还是限制和准备好的数据?
【发布时间】:2013-09-05 05:53:29
【问题描述】:

我正在开发一个 MVC 网络应用程序。我只是想知道是 M、域模型还是 poco 类,还是经过精炼和处理的数据准备好发送到 View 进行显示?

例如考虑一个数据库表:

Id, Name, Salary

要显示,我需要 4 列而不是 3:

Id, Name, Salary, Annual Salary (Salary * 12)

根据模式指南,我对我的模型类中的内容感到困惑,我会在 Controller 中执行 AnnualSalary=Salary*12 并将所有 4 条数据传递给查看还是我的模型将返回 4 列?

另一点是,如果我需要使用这 4 列从其他表中添加地址,模型应该返回精炼和所需的数据,还是在控制器中我应该查询 2 个不同的数据表并进一步选择并将数据传递给视图?

【问题讨论】:

  • 视图模型和数据模型(或业务模型)之间经常存在混淆。

标签: asp.net-mvc asp.net-mvc-4 design-patterns


【解决方案1】:

ASP.NET MVC 的一个好的做法是将模型从数据库中分离出来,并将模型用于视图。 在您的情况下,我们将有两个模型:EmployeeDTO 和 Employee。

public class EmployeeDTO
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int Salary { get; set; }
}

public class Employee
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int Salary { get; set; }
    public int AnnualSalary { get { return this.Salary * 12; } } 
}

之后,您将在控制器上将 EmployeeDTO 映射到 Employee(以读取操作),并将 Employee 映射到 EmployeeDTO(以创建/更新操作)。 例如,一个 Read 方法:

public ActionResult Read(int id)
{
    EmployeeDTO employeeDTO = db.Employee.Find(id);
    Employee employee = new Employee()
    {
        Id = employeeDTO.Id,
        Name = employeeDTO.Name,
        Salary = employeeDTO.Salary
    };
    return View(employee);
}

使用此方法,您可以为 EmployeeDTO 实现 DataAnnotations,它不会自动应用于 Employee(因此应用于您的视图),反之亦然。 在您的情况下,您可以添加一个不会影响数据库架构的新属性。

希望对你有帮助。

【讨论】:

  • 通常,DTO = 数据传输对象,仅适用于从服务提供控制器的情况。不在问题中。
【解决方案2】:

基于 MVC 模式,Controller 负责提供 View 自己制作所需的所有信息。此外,ViewModel 是一个类,它可以组合来自不同来源的视图的所有信息。

所以,建议你的Annual Salary在你的Controller中计算出来,放到ViewModel中,并将ViewModel发送到view。

这是一种非常有效且深受开发者欢迎的方法。

当您有几十个不同的值要传递给一个视图时,同样的灵活性可以让您 快速添加一个新条目,或重命名一个现有条目,成为你最大的敌人。你留在你的 拥有跟踪项目名称和值;您无法从 Microsoft IntelliSense 和编译器获得帮助。 处理软件复杂性的唯一行之有效的方法是通过适当的设计。因此,为每个视图定义一个对象模型有助于您跟踪该视图真正需要什么。我建议你定义一个 您添加到应用程序的每个视图的视图模型类

-- Dino Esposito 的“Microsoft ASP.NET MVC 编程”

更新:

我的假设是 Annual Salary 是 ViewModel 属性而不是业务属性。

【讨论】:

  • '建议您在控制器中计算您的年薪'。是吗?通过谁?对我来说,域逻辑似乎泄漏到控制器中。
【解决方案3】:

无论您如何与视图沟通,年薪计算都是领域逻辑,因此应该成为您领域模型的一部分。

让域逻辑泄漏到你的控制器中对我来说看起来很冒险。

【讨论】:

    【解决方案4】:

    我只是想知道是 M、域模型还是 poco 类,还是经过提炼和处理的数据准备好发送到 View 进行显示?

    MVC 模式定义模糊,在 M、V、C 和类之间没有 1-1 映射。

    模型是用来获取视图所需信息的一切。因此,它是您的存储库/wcf 客户端/dto/entity 等。

    该模式并不真正关心您如何获取信息、信息包含什么或信息的结构。它只是说 Controller 应该从 Model 中获取信息并将其提供给 View。

    现在,ASP.NET MVC 使用 ViewModels,它旨在用作模型信息的适配器,因此对其进行调整,以便视图不必包含转换信息的逻辑。

    VM 本身可以使用您的实体、存储库等。但通常最好的方法是仅使用您的实体(以使控制器更清洁)。

    【讨论】:

      猜你喜欢
      • 2012-02-09
      • 2011-08-02
      • 1970-01-01
      • 1970-01-01
      • 2013-10-06
      • 1970-01-01
      • 2012-06-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多