我的DTO对象应该如何用于ASP.Net MVC View?

时间:2010-05-19 14:32:36

标签: asp.net-mvc nhibernate viewmodel dto

我想知道,我在asp.net mvc和nhibernate中有一个应用程序。我在asp.net mvc的Views中读到过这个,不应该知道Domain,它需要使用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并在域上转换它以保存在存储库中?

非常感谢!

干杯

1 个答案:

答案 0 :(得分: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。