我有以下域类:在这种情况下使用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列表,并填充它并将其传递给视图。
这是个好主意还是坏主意?为什么?
感谢
Thomas,谢谢你的回答。我编辑了这些问题,并补充说相关产品已经从上述代码中的仓库中获取。领域模型产品实体具有已经加载的相关产品的列表。我很困惑,我是如何从相关产品中获得的。知道该列表不属于DTO是有帮助的,这使得事情变得更容易一些。 – Thomas 2010-08-08 05:13:42
托马斯,我编辑了这个问题,试图让事情更清楚一些。如果你有一秒钟,你能再看一次吗? – Thomas 2010-08-09 06:44:06
如果您的业务模型 - 产品已经有'GetRelatedProducts()'方法,那么您的ProductDTO也可能会有这种情况(返回ProductDTO的只读列表)。如果您需要将相关产品交付给您的用户界面而无需产生ProductDTO,则可能更容易拥有额外的服务方法... 两者同样可行并且“有效”,这一切都取决于您的更有意义UI上下文/工作流程。 – 2010-08-09 07:03:22