WPF / MVVM应用程序的数据层框架的最佳特征是什么?

时间:2009-05-14 12:59:10

标签: wpf mvvm frameworks

我正在创建一个WPF / MVVM框架,它为模型类生成代码。

我打算为每个数据库表/网络服务(例如“客户”)两个模型类

  • 一个单一的模型类(例如“客户”)
  • 和复数模型类(例如“客户”)

奇异模型类具有其所有属性(FirstName,LastName等)以及对单个实例有意义的所有方法,例如: Save(),Delete(),CalculateSalary()等。

复数模型类具有一系列奇异模型对象,加上相同的方法,因为您还希望对一组单个对象执行操作,例如: Save(),Delete(),CalculateSalary(),还有特殊的方法,如Sort(),以及使某些组变得非常容易的方法,例如: LoadAllGoldCustomers(),甚至LoadWithSql(string sql)等。

我之前(PHP)已经完成了这样的框架,它非常容易编写和理解这样的代码:

Customers customers = new Customers("all");
customers.CalculateSalary();

一对继承的类(Item和Items)占用了每个数据库表的单个单数和复数类的大部分代码,这为编程创建了一个非常干净的环境。

然而,我很少见到其他应用程序这样做单数/复数模型类拆分。相反,每个数据库表几乎总是只有一个类,例如Customer这个类有多种必要的方法,例如GetCustomers(string sql)等

我刚刚在WPF Model-View-ViewModel Toolkit 0.1演练中注意到,他们为你的“模型”目录制作了两个模型两个类:

  • Customer.cs(仅限字段)
  • CustomersDataSource.cs(一个List Load()方法)

哪个似乎是一个类似的概念,只是“复数”类被称为DataSource。

所以现在我要创建另一个基于WPF / MVVM的框架,并且可以决定如何构建模型类。我希望框架是:

  • 清晰且易于从ViewModel 编程,因此明确分离单数和复数模型类,您只需要实例化一个单数或复数类并调用它上面的方法即可得到你的数据。
  • 适合MVVM模式(我理解这意味着尽可能保持简单,只需拥有ViewModel可以调用的属性和方法,但不实现WPF特有的功能,如INotifyProperityChanged )
  • 希望我的数据层位于任何数据源之上,所以如果我使用LINQ-to-SQL,我仍然会调用我自己的模型类,如果我想切换到在Oracle中保存,我会写一个较低的数据适配器层,供我的类与之交互。
  • 以最佳方式利用LINQ

我很感谢那些为框架开发数据层的人的反馈,特别是使用WPF / MVVM /复合应用程序库,以及您发现哪些特性最好,或者您是否使用过其他框架,如CSLA,Subsonic等。另外,关于LINQ如何更改/简化构建数据层结构的任何经验或想法。感谢。

1 个答案:

答案 0 :(得分:3)

哇。如果没有一天坐下来与你交谈,这是一个难以回答的问题。但无论如何,这里都是一个缩短的版本。

首先,尝试将框架或该框架的任何特征从一种语言移植到另一种语言似乎可能试图在圆孔中推入一个方形钉。虽然我不怀疑可以移植功能(例如客户和客户),但我当然可以争辩说不应移植它们。坚持使用customer.CalculateSalary exmaple,你可以使用.NET并为IEnumerable创建一个做同样事情的扩展方法,从而消除了对Customers类的需求。我意识到你可能还有其他功能,但这只是一个例子。另一个例子是使用LINQ对IEnumerable进行排序。

其次,我个人发现在对象内部使用持久性方法(例如Save,Delete等)在大型系统中不能很好地工作,特别是在处理WCF时。在这些场景中似乎可以更好地使用某种类型的存储库,这似乎也适用于在开发过程中切换到Oracle的过程。

我还想完全不同意你关于适应MVVM的问题。对我来说,视图模型是模型和视图之间的粘合剂。视图模型不仅可能需要知道视图(因此,WPF特定功能),而是希望它知道它。 ICommand是视图模型知道的关键接口,并且是WPF-y程序集之一(WindowsBase,PresentationCore,PresentationFramework,不记得哪个)。此外,INotifyPropertyChanged对数据绑定也很重要,应该在所有视图模型中实现,而且与WPF无关(我认为来自System.ComponentModel?)。

那是我的两分钱。同样,在对您的问题的简短回答中解释这一点真的很难。在建立框架之前,我建议使用该模式一段时间。祝你好运!