Tho*_*mas 1 asp.net-mvc domain-driven-design data-transfer-objects dto asp.net-mvc-2
我有以下域实体:
public class CartItem
{
public virtual Guid Id { get; set; }
public virtual Guid SessionId { get; set; }
public virtual int Quantity { get; set; }
public virtual Product Product { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我有以下DTO:
public class CartItemDTO
{
public CartItemDTO(CartItem cartItem)
{
Id = cartItem.Id;
Quantity = cartItem.Quantity;
Name = cartItem.Product.Name;
Price = cartItem.Product.Price;
}
public Guid Id { get; private set; }
public int Quantity { get; private set; }
public string Name { get; private set; }
public decimal Price { get; private set; }
}
Run Code Online (Sandbox Code Playgroud)
当前的工作流程非常简单:我的存储库返回一个类型为CartItem的IEnumerable.我的服务将其转换为dto(CartItemDTO).我的控制器然后将它传递给视图.到现在为止还挺好.
现在我想为每个订单项实施一个总计.我将以下属性添加到CartItemDTO.
public decimal Total { get; private set; }
Run Code Online (Sandbox Code Playgroud)
然后我将以下代码添加到CartItemDTO构造函数中.
Total = cartItem.Quantity * cartItem.Product.Price;
Run Code Online (Sandbox Code Playgroud)
我的第一个问题是,这是一种最佳实践方法吗?如果没有,为什么?我应该在其他地方添加Total属性吗?如果是这样,为什么?
我还想为整个购物车实现一个总数,所以我创建了一个新类(下面)并修改了我的服务以返回它.
public class CartItemResult
{
public CartItemResult(IEnumerable<CartItemDTO> result)
{
CartItems = new List<CartItemDTO>(result);
Total = result.Sum(total => total.Total);
}
public IList<CartItemDTO> CartItems { get; private set; }
public decimal Total { get; private set; }
}
Run Code Online (Sandbox Code Playgroud)
我现在可以将新类传递给视图,也可以创建一个单独的ViewModel,并将新类的内容传递给ViewModel并将其传递给视图.
我的第二个问题是,如果这种方法是最佳实践方法吗?如果没有,为什么以及我应该采取哪些不同的做法?
DTO是用于传输数据的纯类.它不应该包含任何逻辑.您已添加域驱动设计标记,因此我认为您要使用域对象和域服务.您的域对象(CartItem)负责计算项目的总计.域对象是数据+业务逻辑和使用该数据的规则.计算总计是业务逻辑.同样对于你的第二部分(CartItemResult),这通常由称为域服务的东西处理.域服务提供的业务逻辑与单个域对象无关,而是与许多域对象一起使用.
但是你也应该考虑项目的复杂性.你真的需要这个吗?不要因为它们存在而使用模式,总是找到使用它们的理由.David Neale提到的方法对于某些应用程序也是正确的.
最好的问候,拉迪斯拉夫
| 归档时间: |
|
| 查看次数: |
1015 次 |
| 最近记录: |