2009-08-24 38 views
2

我创建一个简单的aspnetmvc车应用程序和定义类似于以下类:POCO格式

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,但仍允许我介绍对象的视图(通过视图模型)作为合并后的实体。

这两种格式都可能没有明显的优势,但我会喜欢任何关于设计的反馈。

最好的问候,

哈尔

回答

3

我只在你的模型车,并引用它通过Cart.CartItems的项目坚持下去。当你开始尝试在两个地方做某些事情时,你会打开自己的代码重复。

不要违反Kent Beck的“一次又一次的规则”。

您的模型的唯一目的是为所有视图提供所需的视图。你的业务和数据逻辑不应该在那里。

只是我的两美分,祝你好运!

善良,

5

个人而言,我将保持CartItems的车。原因如下:

  1. 有明确的“有”关系,表明购物车中有CartItems。

  2. 购物车是您的域模型中的明确聚合。如果没有加载购物车物品,则不太可能会装载购物车实体。虽然这会使您的CRUD在您的存储库中运行得更复杂一些,但这是任何存储库使用者执行UpdateCart()的预期行为,而不是执行自己的迭代并执行UpdateCartItem()。

  3. 打破它到另一个对象补充说,没有鲜明的目的

  4. 这也很容易得到的物品放入您的浏览两种方式的复杂性。

如果您的域模型或处理购物车项目的方式发生任何变化,这些假设可能会发生变化,从而导致您采取的方法。但这就是我目前看到的。

+0

前两个答案都很棒,并得出基本相同的结论。我已经接受了最快的回应。感谢您的帮助...... – Hal 2009-08-24 17:54:41