我有以下域類:在這種情況下使用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