【问题标题】:How should be my DTO object for ASP.Net MVC View?我的 ASP.Net MVC 视图的 DTO 对象应该如何?
【发布时间】:2011-02-21 10:15:39
【问题描述】:

我想知道,我在 asp.net mvc 和 nhibernate 中有一个应用程序。我在 asp.net mvc 的 Views 中读到了这一点,不应该知道域,它需要使用 DTO 对象。所以,我正在尝试这样做,我找到了 AutoMapper 组件,但对于某些域对象,我不知道执行 DTOS 的正确方法。我有一个这样的域类:

public class Entity 
{
   public virtual int Id { get; set; }
   public virtual bool Active { get; set; }
}

public class Category : Entity 
{ 
   public virtual string Name { get; set; }
   public virtual IList<Product> Products { get; set; }

   public Category() { }
}

public class Product : Entity 
{ 
   public virtual string Name { get; set; }
   public virtual string Details { get; set; }
   public virtual decimal Prince { get; set; }
   public virtual int Stock { get; set; }
   public virtual Category Category { get; set; }
   public virtual Supplier Supplier { get; set; }

   public Product() { }
}

public class Supplier : Entity 
{
   public virtual string Name { get; set; }
   public virtual IList<Product> Products { get; set; } 

   public Supplier() { }  
}

我想获得一些关于如何执行 DTO 来查看的示例?我需要在 DTO 中只使用字符串吗?而我的控制器,它应该获取域对象或 DTO 并将其转换为域以保存在存储库中?

非常感谢!

干杯

【问题讨论】:

    标签: asp.net-mvc nhibernate viewmodel dto


    【解决方案1】:

    没有关于这件事的指导方针,这取决于你的个人风格。我有一些在实践中证明有用的建议:
    1. 使用平面 DTO——这意味着 DTO 的属性必须尽可能原始。这使您无需进行空引用检查。 例如,如果您有这样的域对象:

    public class Employee
    {
      prop string FirstName{get; set;}
      prop string LastName{get; set;}
      prop Employee Boss{get; set;}
      ...
    }
    

    您需要在网格中输出员工列表并显示他们的第一级老板的信息我更喜欢创建一个 DTO

    public class EmployeeDTO
    {
      prop string FirstName{get; set;}
      prop string LastName{get; set;}
      prop bool HaveABoss{get;set}
      prop string BossFirstName{get; set;}
      prop string BossLastName{get; set;}
      ...
    }
    

    或类似的东西 (-:
    2. 不要将所有内容都转换为 sting - 这会将 DTO 绑定到具体视图,因为您将应用特殊格式。直接在视图中应用简单格式不是问题。
    3. 在您的发布操作中使用 DTO,然后将它们转换为域对象。通常,控制器的操作是针对不正确数据的第一道防线,您不能期望总能根据用户的输入构造一个有效的域对象。在大多数情况下,您必须进行一些后处理,例如验证、设置默认值等。之后,您可以创建 DTO。

    【讨论】:

    • 您好 Branislav,感谢您的回答! :) 我会这样做(尽可能使用原始类型)...您看到了关于验证的内容,在 .net 框架中有一个 dataAnocations 来验证对象的属性....如果我将在帖子中使用 DTO (我的控制器的)操作必须有效并且代码必须检查它,所以我需要在 DTO 中使用 dataAnnotations 吗?你用什么来创建你的 DTO? AutoMapper 是一个不错的选择吗?还是用硬代码来做?再次感谢人!干杯 PS:对不起我的英语!
    • 我使用 AutoMapper。它非常稳定且易于使用。对于评估,您可以使用数据注释或一些第三方库,如 xVal - blog.stevensanderson.com/2009/01/10/…
    猜你喜欢
    • 2013-01-23
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多