繁体   English   中英

asp.net MVC应用程序中的POCO格式

[英]POCO format in asp.net MVC app

我正在创建一个简单的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添加其他方法,但仍然允许我将对象作为组合实体呈现给视图(通过viewmodel)。

两种格式都没有明显的优势,但我希望对设计有任何反馈。

最好的祝福,

哈尔

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

  1. 有明显的“有”关系表明Cart中有CartItems。

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

  3. 将其分解为另一个对象会增加没有特色的复杂性

  4. 无论是哪种方式,都可以轻松地将项目放入View中。

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

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

不要违反肯特贝克的“一次又一次的规则”。

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

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

善良,

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM