我正在创建一个简单的aspnetmvc cart应用程序,并定义了类似于以下类的类:
public class Cart
{
public Guid Id { get; set; }
public string Comment { get; set; }
public DateTime CreatedOn { get; set; }
public DateTime UpdatedOn { get; set; }
public DateTime? DeletedOn { get; set; }
public List<CartItem> CartItems { get; set; }
}
public class CartItem
{
public Guid Id { get; set; }
public Guid CartId { get; set; }
public string Sku { get; set; }
public double ItemAmount { get; set; }
public double Amount { get; set; }
public int Quantity { get; set; }
}
使用一个非常简单的存储库,看起来像这样:
public interface ICartRepository
{
Cart CreateCart();
Cart GetCart(Guid Id);
Cart UpdateCart(Cart cart);
void DeleteCart(Cart cart);
}
在创建类之后,我开始意识到我更适合从Cart类中分解List属性,然后在我的视图模型中重新组合它们。
public class vmCart
{
public Cart cart { get; set; }
public List<CartItem> CartItems { get; set; }
public string CreatedOn
{
get
{
return cart.CreatedOn.ToString();
}
}
public string CartTotal
{
get
{
var total = (double)0;
foreach (var lineItem in CartItems)
{
total += lineItem.Amount;
}
return total.ToString("c");
}
}
}
这意味着我必须在我的模型中为CartItems的CRUD添加其他方法,但仍然允许我将该对象呈现给视图(通过viewmodel)作为组合实体。
两种格式都没有明显的优势,但我希望对设计有任何反馈。
致以最诚挚的问候,
哈尔
答案 0 :(得分:5)
我个人会将CartItems保留在购物车中。原因如下:
明确的“有”关系表明购物车中有CartItems。
购物车是您网域模型中的明确聚合。如果没有装载购物车物品,您不太可能在装载购物车实体。虽然这会使您的CRUD操作在存储库中变得更复杂,但是任何存储库使用者都需要执行UpdateCart()而不是执行自己的迭代并执行UpdateCartItem()。
将其分解为另一个对象会增加没有特色的复杂性
将这些项目放入View中同样容易。
如果您的域名模型或处理购物车项目的方式发生任何变化,这些假设可能会发生变化,因此您采取的方法也会发生变化。但这就是我现在看到的情况。
答案 1 :(得分:3)
我坚持只在你的模型中有一个Cart并通过Cart.CartItems引用它的项目。在你开始尝试在两个地方做某事的那一刻,你正在打开自己重复的代码。
不要违反Kent Beck的“一次又一次的规则。”
您的模型的唯一目的是为所需的视图提供所有内容。您的业务和数据逻辑不应该在那里。
我的两分钱,祝你好运!
善,
丹