我想开始收集 MVVM-light(带 RIA 服务)最佳实践。我发现许多项目都是有用的最佳实践或最佳方法,但我想听听其他使用 MVVM-light 工具包的人的意见,看看他们也发现了什么。

请发布您的最佳实践作为此问题的答案。

有帮助吗?

解决方案

MVVM-Light 的基本用法

  1. 在App.cs文件的Application_Startup函数中初始化DispatcherHelper
  2. 从基类创建 ViewModel
  3. 始终创建一个 ViewModelLocator 类,其中包含所有视图模型并链接到您的应用程序资源中
  4. 使用 RelayCommands 将函数公开给您的视图
  5. 了解何时使用 DispatchHelper。

清理思路:

  1. 在适当的时候,添加到您的 ViewModel 以在 Cleanup() 上清除 DomainContext 的 EntitySet?
  2. 当应用程序不再需要视图模型时,调用 ViewModelLocator 的 CleanupSomeVM() 函数来清除视图模型。

我很想听听其他人关于您何时/如何使用 CleanUp 功能的信息。随着我的应用程序的增长,我确实觉得需要添加一些清理功能以更好地管理客户端内存使用情况。

对于可混合性:

  1. 将服务/查询实现抽象为接口。
  2. 为每个服务实现类创建 2 个类(1 个用于设计,1 个用于生产)
  3. 在每个 ViewModel 中,实现其自己的服务类(使用 IsInDesignMode)以根据需要创建 Blendable Service 实现。
  4. 使用静态变量将 DomainContext 保存在服务实现类中。
  5. 在 ViewModel 的构造函数中添加 DispatcherHelper.Initialize(),但仅限在设计模式下。Blend 在加载页面时不会加载 App,这可以解决这个问题。

对于添加的业务逻辑:

  1. 首先在模型中添加业务逻辑,然后在视图模型中添加。
  2. 使用模型的部分方法为适当的更改/更新事件添加逻辑。
  3. 添加只读属性(仅 getter)以提供模型的摘要和计算值。

对于视图:

  1. 始终将根绑定到定位器对象。
  2. 尝试将代码隐藏逻辑仅保留在布局或自定义 UI 逻辑中。避免引用您的 ViewModel。

对于收藏:

  1. 将 CollectionViewSource 用于 ViewModel 中的集合,并使用 DomainContext 的 EntitySet 源
  2. 将所有过滤、排序和分组逻辑应用到 ViewModel 中的 CollectionViewSource。
  3. 在 ServiceCalls 之后,根据需要对 CollectionViewSource 对象调用 .View.Refresh() 以更新 UI。

用于 ViewModel 协调(控制器逻辑)

  1. 谨慎使用消息,太多的复杂性可能难以管理。
  2. 使用NotificationMessage 和PropertyChangedMessage 类进行发送/接收。

对于 RIA 域服务:

  1. 在持久更改功能中实现任何日志记录,而不是更新/插入/删除逻辑。
  2. 在插入,更新,删除功能期间,如果需要通过导航属性引用另一个实体,请先检查EntityStatus,或从另一个Context加载实体,以防止EntityStatus冲突。

用于调试/测试:

  1. 检查输出窗口中是否存在绑定错误并修复它们。绑定错误对用户来说会默默失败,但会降低应用程序性能和预期行为。
  2. 在 Silverlight 中创建单元测试以验证任何添加的模型/业务逻辑
  3. 创建单元测试项目来测试服务器端逻辑和功能

对于实体框架:

  1. 保持 EntitiesContext 与领域服务的一对一匹配。尝试以另一种方式拆分它会导致问题。
  2. 除非您完全打算花费大量时间仔细构建插入、更新和删除逻辑,否则不要使用 [Composition] 属性。
  3. 使用单独的服务将自定义类型返回给您的 RIA 客户端。不要将它们添加到 EntityFramework 对象的 DomainService 中
  4. 在 PersistChangeSet 函数中执行服务器端更新/集成逻辑(例如更新其他系统),而不是在 Insert、Update、Delete 函数中。这将防止您意外地通过导航属性拉入实体,这将使您的分离版本不更新。
  5. 创建一个附加上下文以在更新/集成逻辑期间查找当前值。
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top