2015-05-06 63 views
2

上下文:
C#/ WPF Windows-Store应用程序使用SQLite在本地存储数据,并通过Web访问来下载数据。

应用程序:
数据必须从网上下载并映射到存储在本地SQLite数据库中的类。例如,在客户类: MVVM - 正确执行模型

[Table("Customer")] 
class Customer{ 
    [AutoIncrement, PrimaryKey, Unique] 
    public int Id {get;set;} 
    public string Name {get; set;} 
    … 
} 

类得到由不同的线程操作,所以在INotifyPropertyChanged的Customer类是一个坏主意。此外,多个客户应该通过GUI显示,因此ViewModel包含一个Customers列表。此外,客户必须通过多个属性进行扩展才能正确显示GUI。

问题:
什么是模型?客户?
我应该如何扩展客户的额外属性而不会搞乱客户类?
我应该在哪里存储客户在数据库中的业务逻辑,或者将数据从网络下载并映射到客户类?在模型中?
如果你的答案是客户是模型​​,它不应该包含任何逻辑,为什么MVVM模式说模型包含业务逻辑?

回答

3

客户肯定是这种情况下的模型。一个模型应该是POCO,并且每个只能由GUI使用的属性应该在视图模型中,例如CustomerViewModel。

业务逻辑应该在模型中。存储在数据库中可以通过使用repository pattern来解决。

模型通常具有逻辑,但仅限于业务逻辑。根据MVVM,您不应该在模型中使用任何UI逻辑,而应该在视图模型中使用。

比方说,我们有你的模型

class Customer { 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

,有必要显示大写客户的名称。而不是增加额外的属性Customer类,添加一个在视图模型

class CustomerViewModel implements INotifyPropertyChanged { 
    ... 
    public string UpperCaseName { ... } 
    ... 
} 

我觉得Wikipedia page总结起来相当不错:

型号

模式是指无论是一个它代表真实状态内容(面向对象的方法),或者代表内容的数据访问层(以数据为中心的方法)。

查看

如在MVC和MVP模式中,视图是用户界面(UI)。

查看模型

视图模型是暴露的公共属性和指令视图的抽象。而不是MVC模式的控制器,或者MVP模式的主持人,MVVM有一个活页夹。在该模型的视图 模型中,此资料夹介于视图和数据联编程序之间的通信。视图模型已被描述为模型中的数据状态 。

粘合剂

声明数据和命令结合在MVVM模式隐含的。在Microsoft解决方案堆栈中,活页夹是标记为 的语言,称为XAML。该活页夹使开发者免于被迫写入锅炉板逻辑以同步视图模型和 视图。在Microsoft堆栈之外实施时,声明性数据绑定技术的存在是该模式的关键推动因素。

0

什么是模型?

实体或任何持有/是数据框架的类。

我该如何扩展客户的额外属性而不会搞乱客户类?

通过Partial类修饰符。允许您将专用逻辑放入扩展的操作/属性中。另外你可以让客户坚持改变INotifyProperty

我应该在哪里存储客户在数据库中的业务逻辑,或者将数据从网络下载并映射到客户类?在模型中?

将所有业务逻辑放在ViewModel中以获取和存储信息。这是魔术发生的地方,并且是ViewModels之间的通道,用于显示View

为什么MVVM模式会说模型包含业务逻辑?

业务逻辑是构成数据的实体的形式。


刚接触MVVM的人不知道他们是否正在遵循MVVM。 MVVM(恕我直言)只是一个三层数据系统(记住范式),它将数据从逻辑中分离出来以获取数据以最终显示数据;三层。

如果有人将MVVM视为旧学校三层数据系统其中VM包含/获取数据(称为模型)并处理业务逻辑以处理数据并且仅允许View显示所述数据;它是如此简单。