MVVM-light + RIA服务最佳实践

Rya*_*ver 15 silverlight wcf-ria-services mvvm-light

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

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

Rya*_*ver 25

MVVM-Light的基本用法

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

清理理念:

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

我很想听听其他人关于何时/如何使用CleanUp功能的消息.随着我的应用程序的增长,我觉得需要添加一些清理函数来更好地管理客户端内存使用.

对于可混合性:

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

对于添加的业务逻辑:

  1. 首先在模型中添加业务逻辑,然后在ViewModel中添加.
  2. 使用Model的部分方法为适当的更改/更新事件添加逻辑.
  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 DomainServices:

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

对于调试/测试:

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

对于实体框架:

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