2010-08-08 44 views
3

我有以下域类:在这种情况下使用DTO的正确方法是什么?

public class Product 
{ 
    public virtual Guid Id { get; set; } 
    public virtual string Name { get; set; } 
    public virtual IList<Product> RelatedProducts { get; set; } 
} 

我有以下DTO类:

public class ProductDTO 
{ 
    public ProductDTO(Product product) 
    { 
     Id = product.Id; 
     Name = product.Name; 
    } 

    public Guid Id { get; private set; } 
    public string Name { get; private set; } 
} 

我在我的服务提出了以下方法:

public ProductDTO GetBySlug(string slug) 
{ 
    Product product = productRepository.GetBySlug(slug); 
    return (product != null) ? new ProductDTO(product) : null; 
} 

我有以下在我的控制器中执行操作:

public ActionResult Details(string slug) 
{ 
    ProductDTO viewModel = productService.GetBySlug(slug); 
    return View("Details", viewModel); 
} 

在阅读了一下之后,我的理解是,使用DTO作为视图模型是可以的,因为当前的场景很简单直接。当我想要返回的数据变得更加复杂时,我会发生混淆。假设我也想将相关产品列表返回到视图。我会在哪里添加这个列表?

我读到DTO是用于传输数据的域实体的扁平版本。这是否意味着在DTO内部不应允许包含相关产品的通用清单?我迄今收到的答案表明如此。那我如何将相关产品交给控制器?

一种选择是:

而是在服务返回ProductDTO的我会创建一个保存ProductDTO和类型ProductDTO对相关产品的列表中的新类,并从服务返回。在控制器中,我会将新类传递给视图,或者创建一个单独的ProductViewModel,其中包含ProductDTO和相关产品的ProductDTO列表,并填充它并将其传递给视图。

这是个好主意还是坏主意?为什么?

感谢

回答

2

我不会列表放在里面DTO在所有的,因为它不自然属于那里。而且我也不确定你的'包装类'是什么意思。所有你需要的是一个产品列表,在返回这个列表的服务上有另一个方法是完全可以的。

因此,你有这样的事情在你的服务:

public IList<ProductDTO> GetRelatedProducts(ProductDTO productDTO) 
{ 
    ... 

一个视图模型(被称为以上服务的东西)背后的最重要的观点是,它的UI和之间起中介作用商业模式。换句话说:它以与UI相关的方式编排和汇总业务模型。如果用户界面在某个时候想要一个相关产品的列表,那么该服务必须提供它。它非常简单,在这里,商业模式本身是否也有这个概念是完全不相干的。

HTH! Thomas

P.S. 如果您的DTO变大并且您的列表变长,那么您可能会考虑引入另一个(简化的)DTO,仅使用名称和某种标识符来减少必须从存储库检索的不必要数据量。

+0

Thomas,谢谢你的回答。我编辑了这些问题,并补充说相关产品已经从上述代码中的仓库中获取。领域模型产品实体具有已经加载的相关产品的列表。我很困惑,我是如何从相关产品中获得的。知道该列表不属于DTO是有帮助的,这使得事情变得更容易一些。 – Thomas 2010-08-08 05:13:42

+0

托马斯,我编辑了这个问题,试图让事情更清楚一些。如果你有一秒钟,你能再看一次吗? – Thomas 2010-08-09 06:44:06

+0

如果您的业务模型 - 产品已经有'GetRelatedProducts()'方法,那么您的ProductDTO也可能会有这种情况(返回ProductDTO的只读列表)。如果您需要将相关产品交付给您的用户界面而无需产生ProductDTO,则可能更容易拥有额外的服务方法... 两者同样可行并且“有效”,这一切都取决于您的更有意义UI上下文/工作流程。 – 2010-08-09 07:03:22

相关问题