【问题标题】:POCO format in asp.net MVC appasp.net MVC 应用程序中的 POCO 格式
【发布时间】:2009-08-24 17:24:44
【问题描述】:

我正在创建一个简单的 aspnetmvc 购物车应用程序,并定义了类似于以下内容的类:

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 向我的模型添加额外的方法,但仍然允许我将对象作为组合实体呈现给视图(通过视图模型)。

这两种格式可能没有明显的优势,但我希望能收到有关设计的任何反馈。

最好的问候,

哈尔

【问题讨论】:

    标签: c# asp.net-mvc model-view-controller


    【解决方案1】:

    我个人会将 CartItems 保留在购物车中。原因如下:

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

    2. 购物车是您的域模型中的明确聚合。您不太可能在不加载购物车项目的情况下加载购物车实体。虽然这会使存储库中的 CRUD 操作更加复杂,但任何存储库使用者的预期行为都是执行 UpdateCart() 而不是执行自己的迭代并执行 UpdateCartItem()。

    3. 将其拆分为另一个对象会增加没有明确目的的复杂性

    4. 无论哪种方式,都可以轻松地将项目放入您的视图中。

    如果您的域模型或您处理购物车商品的方式发生任何变化,这些假设可能会发生变化,因此您采取的方法也会发生变化。但这就是我目前的看法。

    【讨论】:

    • 前两个答案都很棒,得出的结论基本相同。我接受了最快的回复。感谢所有的帮助...
    【解决方案2】:

    我会坚持在您的模型中只包含一个购物车,并通过 Cart.CartItems 引用它的项目。当你开始尝试在两个地方做某事的时候,你就是在向重复代码敞开大门。

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

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

    只要我的两分钱,祝你好运!

    善良,

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-06
      • 2011-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多