购物车是模型还是视图模型?

时间:2017-02-22 04:46:06

标签: c# mvvm

我正在尝试在我的应用中实施购物车系统,这比我预期的更加混乱/困难。

目前我的实现如下:

public class CartItem
{
    public Product Product { get; set; }
    public int Quantity { get; set; }
    public decimal Subtotal { get { return Quantity * Product.Price; } }
}

public class Cart
{
    public ObservableCollection<CartItem> CartItems { get; set; }
    public int ItemCount { get; set; }
    public decimal Total { get; set; }
    public ICommand AddItemCommand { get; set; }
    public ICommand RemoveItemCommand { get; set; }
    public void AddItem(Product product)
    {
    }
    public void RemoveItem(Product product)
    {
    }
}

具体来说,我很难找到它在MVVM模式中的位置。此实现有效,直到Quantity上的CartItem变量被其所属的Cart(例如视图)以外的其他内容修改。

我问过自己的一些问题:

  • 购物车是对象的抽象吗?是=&gt;这是一个模特。
  • 是否会对数据库进行序列化/反序列化?是的,所以它仍然是模特。
  • 它是否向视图提供数据?是。这是一个视图模型。
  • 是否会对该数据进行操作或修改?是的,所以它是一个视图模型。

1 个答案:

答案 0 :(得分:0)

我要说的是我看MVVM的方式,所以也许它并不完全准确,但我已经看到其他人也这么认为。

在我看来,Cart和CartItem都是Model。

当我构建MVVM应用程序时,我有:

  1. 查看:仅限Xaml,后面没有代码
  2. ViewModel :包含一个或多个模型对象和其他一些属性
  3. 模型:它似乎是DTO模型,每个属性都实现了INotifyPropertyChanged(如果使用MVVM-Light插件,则为RaisePropertieChanged)。

    该模型可以具有一些&#34; Helper属性&#34;。例如,您的&#34;小计&#34; propertie。

  4. DomainModel :您的数据库中有哪些数据。基本上你的DomainModel具有与你的表相同的结构(或多或少)
  5. 显然还有服务层,但这不是重点。

    要将模型映射到DomainModel,我使用Automapper。这很简单。

    你可以合并Model和DomainModel图层,但是我不喜欢这样。  无论如何,我使用PocoGenerator库,因此每次更新数据库结构时都会擦除MVVM代码。

    最后一件事,我发现使用MVVM-Light非常有帮助。但是,再一次,这只是我的观点。

    编辑:

    我忘记了: 我认为ICommand和方法不应该存在。所有ICommand都必须放在ViewModel类中。