2011-05-26 98 views
2

我正在开发一个使用WPF的应用程序。我使用的模式显然是MVVM。此外,我正在使用实体框架ORM和LINQ-to-Entities查询EF对象。涉及在ViewModel或Model中处理数据(来自数据库)的逻辑?

我对MVVM的理解是,View应该没有代码隐藏,只有ViewModel应该具有的知识是ViewModel包含某些与View绑定的属性,并且它包含处理事件的命令视图。模型只包含从数据库获取数据的代码。

在我的模型类中,我刚刚编写了使用Linq-to-entities直接查询EF对象的函数。在将数据分配给虚拟机中的属性之前,需要对数据执行的处理过程可能存在于虚拟机或存在于虚拟机项目中的类中。在这里要提到的是,我有3个项目 - View,ViewModel和Model。

我的问题在于,我可以在VM项目中保留这些函数(涉及处理来自数据库的数据)还是应该在Model项目中?如果在ViewModel项目中,它应该位于VM项目中的相关VM还是单独的类中?

回答

2

其中一种常用的做法是将业务逻辑委托给服务层并使用Repository Pattern执行业务逻辑。正如其他答案中所提到的,ViewModel应该使用特定于视图的属性和处理UI交互的命令来修饰模型。通过它自己的定义,模型应该拥有操纵数据的所有逻辑。

如果您遵循面向服务的体系结构,那么ViewModel可以注入一项服务。该服务负责执行业务功能。这些业务功能主要是在持久数据上完成的。并且可以使用任何ORM工具和技术(如EF或NHibernate)很好地抽象该逻辑。你可以做一个谷歌搜索仓库模式,如果你遵循这个架构可能会有所帮助。

如果您不需要它,则不需要使用存储库模式。您仍然可以直接从服务层使用EF。拥有存储库的好处是,它可以像持久层(数据库)和领域层(模型)之间的映射器一样工作。

希望这会有所帮助。

+0

感谢您的详细回复 – 2011-05-27 13:08:19

1

他们应该在模型项目中,ViewModel只是您的View所期望的一种表示形式,仅此而已。

1

责任编辑: 模型 - >从数据库,服务等获取数据,并通过域对象公开数据。不关心数据如何显示。只涉及涉及域对象的业务逻辑。

ViewModel - >从模型中读取数据并装饰它们,以便它们可以以正确的格式显示在View中。公开视图可以绑定以获取数据的属性。还公开视图可以调用用户输入的命令。

查看 - >根据通过DataBinding从VM接收的数据,使用漂亮的DataTemplate或UserControl显示数据。绑定到VM命令以调用用户输入。

理想情况下ViewModel只关心在UI上显示数据而不是修改模型。它在构造函数中接收模型对象,并通过数据绑定公开要由视图使用的属性。模型不知道ViewModel。无论何时模型数据改变,ViewModel都可以通过VM订阅的模型抛出的事件来通知更改。或者,只要View调用VM中的属性getter来获取数据,VM就必须查询模型。

模型应该公开属性,而不管它们将如何显示。所以它不应该对属性进行任何处理。 ViewModel可以按照视图的要求修饰从Model接收到的数据。

+0

“每当模型数据发生变化时,ViewModel可以通过VM订购的模型抛出的事件来通知更改”。你能用一个例子来阐述这一点吗? 如果ViewModel无法修改数据,Model无法对数据进行任何处理,那么该逻辑应该放在哪里? – 2011-05-26 12:41:31

+0

模型应根据业务逻辑更改其内部的数据。每当它改变它的数据时,它就会引发事件通知虚拟机数据改变。如果虚拟机需要更改这些数据以获得更好的显示效果,它应该将模型中的数据读取到它自己的字段中,更改它并通过属性暴露更改的数据。虚拟机不应该更改模型数据。它只关心数据如何看起来不像业务逻辑。 – 2011-05-26 12:55:19

1

在我看来,最好将数据库处理函数移动到Model项目中,因为可能过多的责任将放在ViewModel上。

我会尽量表现为例:

假设我们有一个类SomeViewModel与性能IsHighlitedItem,这样的事情:

class SomeViewModel 
{ 
    public bool IsHighlighted 
    { 
     get 
     { 
      /* View logic here */ 
     } 
    } 

    public SomeClass Item 
    { 
     get 
     { 
      /* Retreiveing an item from database */ 
     } 
    } 
} 

现在,当您需要修改视图逻辑你必须修改SomeViewModel类(没关系),但是当您需要修改数据库通信逻辑时,您还需要修改相同的类,但这还不够好。

Single responsibility principle说:

永远不应该有一个以上的 原因,一类改变。

因此,如果你保持现在的状况,将来可能会遇到代码不必要的大复杂性。

-1

您可能会感兴趣的WPF Application Framework (WAF)BookLibrary示例应用程序。它演示了如何将实体框架与MVVM模式一起使用。

+1

没有试图回答这里的问题,还有另一个地方让你链接你的WAF。您甚至不会链接到网站上的任何特定的有用网页。 – 2012-08-09 19:29:21