MVVM-light + RIA服务最佳实践

时间:2010-08-05 16:04:31

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

我想开始收集MVVM-light(w / RIA Services)最佳实践。我发现有许多项目是有用的最佳实践或最佳方法,但是希望听到其他人使用MVVM-light工具包并查看他们发现的内容。

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

1 个答案:

答案 0 :(得分:25)

MVVM-Light的基本用法

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

    1. 在适当的时候,添加到ViewModel以清除您在清理()上的DomainContext的EntitySet?
    2. 调用ViewModelLocator的CleanupSomeVM()函数,以清除应用程序中不再需要的视图模型。
    3. 我很想听听其他人关于何时/如何使用CleanUp功能的消息。随着我的应用程序的增长,我觉得需要添加一些清理函数来更好地管理客户端内存使用。

      For Blendability:

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

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

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

            1. 将ViewViewSource用于ViewModel中的集合,其中包含DomainContext的EntitySet源代码
            2. 将所有过滤,排序和分组逻辑应用于ViewModel中的CollectionViewSource。
            3. 在ServiceCalls之后,根据需要调用CollectionViewSource对象上的.View.Refresh()以更新UI。
            4. 用于ViewModel协调(控制器逻辑)

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

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

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

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