【问题标题】:MVVM-light + RIA Services best practices [closed]MVVM-light + RIA 服务最佳实践 [关闭]
【发布时间】:2010-08-05 16:04:31
【问题描述】:

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

请发布您的最佳做法作为此问题的答案。

【问题讨论】:

  • 考虑将其转换为社区 wiki,以便任何人都可以编辑。
  • 我不会认为它是一个 com-wiki。提问者应该得到这个好问题的声誉。

标签: silverlight wcf-ria-services mvvm-light


【解决方案1】:

MVVM-Light 的基本用法

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

清理思路:

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

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

混合性:

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

对于添加的业务逻辑:

  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. 创建额外的上下文以在更新/集成逻辑期间查找当前值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-07
    • 1970-01-01
    • 1970-01-01
    • 2015-09-01
    • 2010-09-20
    • 1970-01-01
    相关资源
    最近更新 更多