【发布时间】:2011-03-26 20:25:52
【问题描述】:
我有以下域类:
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 类型的列表,填充它并将其传递给视图。
这是个好主意还是坏主意?为什么?
谢谢
【问题讨论】:
标签: asp.net-mvc asp.net-mvc-2 domain-driven-design dto