2

我想知道,我在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 并将其转换为域以保存在存储库中?

非常感谢!

干杯

4

1 回答 1

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。

于 2010-05-19T15:24:29.643 回答