涉及在ViewModel或Model中处理数据(来自DB)的逻辑?

时间:2011-05-26 11:53:07

标签: wpf entity-framework mvvm linq-to-entities

我正在使用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项目中存在的单独的类中?

5 个答案:

答案 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,其属性为IsHighlitedItem,如下所示:

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模式一起使用。