我正在使用WPF开发应用程序。我正在使用的模式显然是MVVM。此外,我正在使用Entity Framework ORM和LINQ-to-Entities来查询EF对象。
我对MVVM的理解是View应该没有代码隐藏,只有ViewModel应该具备的知识是ViewModel包含View绑定的某些属性,并且它包含处理视图事件的命令。而模型仅包含从DB获取数据的代码。
在我的模型类中,我刚刚编写了使用Linq-to-entities直接查询EF对象的函数。在将数据分配给VM中的属性之前,我需要对数据执行的处理要么存在于VM中,要么存在于VM项目中的类中。在这里提一下,我有3个项目 - View,ViewModel和Model。
我的问题是,我可以将这些功能(涉及处理来自数据库的数据)保存在VM项目中,还是应该保存在Model项目中?如果在ViewModel项目中,它应该在相关的VM中还是在VM项目中存在的单独的类中?
答案 0 :(得分:2)
常用的做法之一是将业务逻辑委派给服务层并使用Repository Pattern执行业务逻辑。正如其他答案中所提到的,ViewModel应该使用视图特定属性和处理UI交互的命令来修饰模型。通过自己的定义,模型应具有操纵数据的所有逻辑。
如果您遵循面向服务的体系结构,则可以向ViewModel注入服务。该服务负责执行业务功能。这些业务功能主要是在持久化数据上完成的。并且可以使用任何ORM工具和技术(如EF或NHibernate)很好地抽象逻辑。您可以在Google搜索Repository Pattern,如果您遵循此架构,这将非常有用。
如果您不需要,则无需使用存储库模式。您仍然可以直接从服务层使用EF。拥有存储库的优点是它就像持久层(数据库)和域层(模型)之间的映射器。
希望这有帮助。
答案 1 :(得分:1)
它们应该在Model项目中,ViewModel只是View所期望的表示,仅此而已。
答案 2 :(得分:1)
责任是: 型号 - >从db,service等获取数据并通过域对象公开数据。不关心数据的显示方式。仅涉及涉及域对象的业务逻辑。
ViewModel - >从模型中读取数据并对其进行装饰,以便它们以适当的格式显示在View中。公开View可以绑定的属性以获取数据。同时公开视图可以调用用户输入的命令。
查看 - >根据从VM通过DataBinding接收的数据,使用漂亮的DataTemplate或UserControl显示数据。绑定到VM命令以调用用户输入。
理想情况下,ViewModel仅关注在UI上显示数据而不是修改模型。它在其构造函数中接收模型对象,并通过数据绑定公开视图使用的属性。模型不知道ViewModel。每当模型数据发生变化时,可以通过VM订阅的模型抛出的事件向ViewModel通知更改。或者,只要View在VM中调用属性getter获取数据,VM就必须查询模型。
模型应该公开属性,而不管它们将如何显示。所以它不应该对属性进行任何处理。 ViewModel可以根据View的要求修饰从Model接收的数据。
答案 3 :(得分:1)
在我看来,最好将数据库处理功能移到Model项目中,因为ViewModel可能会承担太多责任。
我将尝试展示一个例子:
假设我们有一个类SomeViewModel
,其属性为IsHighlited
和Item
,如下所示:
class SomeViewModel
{
public bool IsHighlighted
{
get
{
/* View logic here */
}
}
public SomeClass Item
{
get
{
/* Retreiveing an item from database */
}
}
}
现在当您需要修改视图逻辑时,您必须修改SomeViewModel
类(没关系),但是当您需要修改数据库通信逻辑时,您还需要修改同一个类,而不是这样好的。
Single responsibility principle说:
永远不应该有一个以上 课程改变的原因。
因此,如果您保持现状,那么将来可能会遇到不必要的大量复杂问题。
答案 4 :(得分:-1)
您可能对 WPF Application Framework (WAF) 的 BookLibrary 示例应用感兴趣。它展示了如何将实体框架与MVVM模式一起使用。