我正在调查WPF的MVVM设计模式。但我不确定将数据访问代码放在何处?
在我看过的一些例子中,数据访问是直接在ViewModel中执行的。在ViewModel中将linq这样的东西放到sql中似乎很奇怪?其他示例有一个单独的数据访问项目,这似乎更像?
这是一般方法吗?我觉得我在这里错过了一些东西!
由于
答案 0 :(得分:42)
以下是我组织MVVM与LINQ项目的方式:
模型 - 我认为模型是系统的状态。它提供数据接口,并跟踪系统状态。模型不知道ViewModel或View - 它只是为其数据和各种事件提供一个公共接口,让消费者(通常是ViewModels)知道状态何时发生了变化。
ViewModel - ViewModel负责组织或构建View所需的所有数据,跟踪视图的状态(例如数据网格的当前选定行),并响应视图上的操作(例如按钮按下)。它知道需要的视图,但它实际上并不了解视图。
查看 - 视图是用户界面的实际外观。它包含所有内置和自定义控件,它们的排列方式以及它们的样式。它知道ViewModel,但仅用于绑定其属性。
网关 - 这是直接解决您问题的部分。网关(基本上我称之为“DataAccessLayer”)是它自己的独立层。它包含CRUD的所有代码(包括LINQ查询),或者从/向数据源(数据库,XML文件等)选择,插入,更新和删除数据。它还为Model提供了一个公共接口,允许Model专注于维护系统状态,而不必关心更新数据源所需的细节(即查询)。
DataAccess类 - 在C#中,这些是非常简单的类,用于为元素数据对象建模。当您使用LINQ查询选择某些内容时,通常会创建IEnumerable<T>
或List<T>
,其中T
是您的数据对象之一。数据对象的一个例子是:
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
这样的设计的一大优势在于它真正区分了您的顾虑。一切都有专门的工作,而且(通常)很容易知道什么样的东西在哪里。
缺点是小型项目可能有点过分。您最终会为公共接口创建大量基础结构,这些基础结构基本上可以通过多个层传递单个愿望。所以,你可能会得到这样的场景:[用户点击提交,ViewModel告诉Model到AddNewPerson,模型告诉Gateway到InsertPerson]而不是像这样的场景[用户点击提交,ViewModel直接向数据库添加新记录]。
希望有所帮助。
答案 1 :(得分:12)
我会添加另一层,基本上你想要的是一个数据工厂。您希望为您创建一组CRUD到数据库的类,并将干净的POCO对象返回给ViewModel。
Nerd Dinner书中有一个很好的例子。它涵盖了MVC而不是MVVM,但模式非常相似,它们在该解决方案中访问数据的方式将是一个很好的起点。
希望这有帮助。
答案 2 :(得分:11)
数据访问应该不在视图模型中,因为这应该是域模型的视图特定(可能是简化的)表示。
使用某种映射器将您的视图模型(MVVM中的VM)映射到您的模型(第一个M)。可以使用工厂模式创建模型中的新对象。创建后,您可以使用存储库模式将它们存储在数据库中。然后,存储库将代表您的数据访问层。在您的存储库中,您可以使用像NHibernate或Entity Framework这样的O / R映射器。
修改强>
我看到GraemeF建议将数据访问代码放在模型中。这是 NOT 这是一种很好的方法,因为如果您要从例如SQL Server到Oracle或XML文件。 域对象不应该担心它们的持久性。存储库模式将域与其持久性隔离开来。
答案 3 :(得分:7)
MVVM代表模型,查看和 ViewModel 。您缺少的部分是模型,它是您的数据访问代码所在的位置。
ViewModel接受Model并将其呈现给View进行显示,所以通常会有类似这样的内容:
class PersonModel : IPerson
{
// data access stuff goes in here
public string Name { get; set; }
}
class PersonViewModel
{
IPerson _person;
public PersonViewModel(IPerson person)
{
_person = person;
}
public Name
{
get { return _person.Name; }
set { _person.Name = value; }
}
}
然后PersonView
将绑定到PersonViewModel
的属性,而不是直接绑定到模型本身。在许多情况下,您可能已经拥有一个对MVVM一无所知的数据访问层(也不应该知道它),但您仍然可以构建ViewModel以将其呈现给视图。
答案 4 :(得分:2)
WPF Application Framework (WAF) 包含一个示例应用程序,该应用程序显示了如何将Model-View-ViewModel(MVVM)模式与实体框架结合使用。
答案 5 :(得分:1)
您的ViewModel应该是一个仅为视图提供服务的薄层。我的经验法则:如果它与UI的呈现有关,那么它属于ViewModel,否则它应该在模型中。