MVVM-light + RIA Services 最佳实践

15

我希望开始一个MVVM-light(带RIA服务)最佳实践的收集。我发现一些有用的最佳实践或最佳方法,但希望听听其他使用MVVM-light工具包的人所发现的内容。

请将您的最佳实践作为对这个问题的回答发布。


3
考虑将此转换为社区维基,以便任何人都可以编辑。 - Matt Casto
我不认为这是一个共享维基的问题。提问者应该因这个好问题而获得声誉。 - Shimmy Weitzhandler
1个回答

25
  • 在 App.cs 文件的 Application_Startup 函数中初始化 DispatcherHelper。
  • 从 BaseClass 创建 ViewModels。
  • 始终创建 ViewModelLocator 类,其中包含所有视图模型,并在应用程序资源中链接。
  • 使用 RelayCommands 将函数暴露给您的视图。
  • 了解何时使用 DispatchHelper。
  • 清理想法:

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

    我很想听听其他人何时/如何使用 CleanUp 函数。随着我的应用程序增长,我确实感到需要添加一些清理函数来更好地管理客户端内存使用。

    为了 Blendability:

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

    用于添加业务逻辑:

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

    用于视图:

    1. 始终将根绑定到 Locator 对象。
    2. 尽量只将代码后台逻辑保留为布局或自定义 UI 逻辑。避免引用您的 ViewModel。

    关于集合:

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

      对于ViewModel协调(控制器逻辑):

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

      对于RIA DomainServices:

      1. 将任何记录日志的操作放在PersistChange函数中,而不是更新/插入/删除逻辑中。
      2. 在插入、更新、删除函数期间,如果需要通过导航属性引用另一个实体,则首先检查EntityStatus,或从另一个上下文中加载实体,以防止EntityStatus冲突。

      用于调试/测试:

      1. 检查输出窗口以查找绑定错误并修复它们。 绑定错误对用户默默失败,但会影响应用程序性能和预期行为。
      2. 在Silverlight中创建单元测试来验证添加的Model / Business Logic。
      3. 创建单元测试项目以测试服务器端逻辑和功能。

      对于Entity Framework:

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

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接