问题描述
我想开始收集MVVM-light(带有RIA服务)最佳实践.我发现有很多项目是有用的最佳实践或最佳方法,但是希望听到使用MVVM-light工具包的其他人的意见,并看看他们的发现.
I would like to start a collection of MVVM-light (w/ RIA Services) Best Practices. There are a number of items I have found to be helpful best practices or best approaches, but would like to hear from others using the MVVM-light toolkit and see what they have found as well.
请发布您的最佳做法作为此问题的答案.
Please post your best practices as answers to this question.
推荐答案
MVVM-Light的基本用法
Basic Usage of MVVM-Light
- 在App.cs文件的Application_Startup函数中初始化DispatcherHelper
- 从BaseClass创建ViewModels
- 始终创建一个ViewModelLocator类,该类包含您的所有视图模型,并在您的应用程序资源中链接
- 使用RelayCommands将功能公开给您的视图
- 了解何时使用DispatchHelper.
清理思路:
- 适当时,添加到ViewModel上以清除Cleanup()上DomainContext的EntitySet吗?
- 当视图模型在应用程序中不再需要时,调用ViewModelLocator的CleanupSomeVM()函数来清除视图模型.
我很想听听其他人何时/如何使用CleanUp功能.随着应用程序的增长,我确实需要添加一些清理功能以更好地管理客户端内存使用情况.
对于可混合性:
- 将服务/查询实现抽象到接口.
- 为每个服务实现类创建2个类(用于设计的1个,用于生产的1个)
- 在每个ViewModel中,实现自己的服务类(使用IsInDesignMode)以根据需要创建Blendable Service实现.
- 使用静态变量将您的DomainContext保留在服务实例类中.
- 在ViewModels的构造函数中添加DispatcherHelper.Initialize(),但仅当处于设计模式"下时. Blend不会在加载页面时加载App,这可以解决此问题.
对于添加的业务逻辑:
- 首先在模型中添加业务逻辑,然后在ViewModel中添加.
- 使用模型的部分方法为适当的更改/更新事件添加逻辑.
- 添加只读属性(仅getter)以在模型上提供汇总值和计算值.
对于视图:
- 始终将根绑定到Locator对象.
- 尝试将代码隐藏逻辑仅保留在布局或自定义UI逻辑中.避免引用您的ViewModel.
对于收藏集:
- 将CollectionViewSource用于ViewModel中的集合,并带有DomainContext的EntitySet的源
- 将所有筛选,排序和分组逻辑应用于ViewModel中的CollectionViewSource.
- 在ServiceCalls之后,根据需要在CollectionViewSource对象上调用.View.Refresh()以更新UI.
用于ViewModel协调(控制器逻辑)
For ViewModel coordination (Controller Logic)
- 谨慎使用消息,可能很难管理太多复杂性.
- 使用NotificationMessage和PropertyChangedMessage类进行发送/接收.
对于RIA DomainServices:
For RIA DomainServices:
- 在持久更改功能中执行任何日志记录,而不是更新/插入/删除逻辑.
- 在插入,更新,删除功能期间,如果需要通过导航属性引用另一个实体,请先检查EntityStatus,或者从另一个上下文加载该实体,以防止EntityStatus冲突.
用于调试/测试:
- 检查输出"窗口中的装订错误并进行修复.绑定错误对用户无声失败,但会降低应用程序性能和预期行为.
- 在Silverlight中创建单元测试以验证任何添加的模型/业务逻辑
- 创建单元测试项目以测试服务器端逻辑和功能
对于实体框架:
- 保持EntitiesContext与域服务的一对一匹配.尝试以其他方式拆分会导致问题.
- 除非您完全打算花费大量时间仔细构建插入",更新"和删除"逻辑,否则请不要使用[Composition]属性.
- 使用单独的服务将自定义类型提供回RIA客户端.不要将它们添加到EntityFramework对象的DomainService中.
- 在PersistChangeSet函数中而不是在Insert,Update,Delete函数中执行服务器端更新/集成逻辑(例如,更新其他系统).这将防止您通过导航属性意外拉入实体,这将使分离的版本保持未更新状态.
- 创建一个附加上下文,以在更新/集成逻辑期间查找当前值.
这篇关于MVVM-light + RIA服务最佳做法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!