MVVM-Light的基本用法
通过BaseClass
- Always在App.cs文件的Application_Startup
- ViewModels中初始化DispatcherHelper创建ViewModelLocator类,该类包含所有视图模型并链接到应用程序资源
清理思路:
在适当的情况下,将ViewModel定位器的Cleanup()?
- Call ()函数添加到ViewModel中以清除
- 上的域上下文的EntitySet,以便在ViewModel中不再需要视图模型时清除视图模型
我很乐意听到其他人关于您何时/如何使用CleanUp函数的信息。随着应用程序的增长,我确实觉得需要添加一些清理功能,以便更好地管理客户端内存使用情况。
对于可混合性:
将服务/查询实现抽象为每个服务实现类的Interface.
- Create 2个类(1个用于设计,1个用于Production)
- Within您的每个ViewModel,实现其自己的服务类(使用IsInDesignMode)以创建可混合的服务实现,将DomainContext作为静态变量保存在服务实现类中。
- 将DispatcherHelper.Initialize()添加到ViewModels的构造函数中,但仅当处于设计模式时。Blend在加载页面时不加载应用程序,这可以解决这个问题。
对于添加的业务逻辑:
- 首先在模型中添加业务逻辑,然后在ViewModel.
- Use中添加模型的分部方法,以便为相应的更改/更新事件添加逻辑。
- 添加只读属性(仅限getter)以提供模型的摘要和计算值。
对于视图:
- 始终将根绑定到定位器对象。
- 尝试将代码隐藏逻辑仅用于布局或自定义UI逻辑。避免引用您的ViewModel。
对于集合:
- 将CollectionViewSource用于ViewModels中的集合,并使用DomainContext's EntitySet
- Apply的源将所有筛选、排序和分组逻辑添加到ViewModel.
- After ServiceCalls中的ViewModels中,根据需要对CollectionViewSource对象调用.View.Refresh()以更新UI。
用于ViewModel协调(控制器逻辑)
- 很少使用消息,太复杂的消息很难管理。
- 使用NotificationMessage和PropertyChangedMessage类进行发送/接收。
对于RIA DomainServices:
如果需要通过导航属性引用另一个实体,请先检查EntityStatus或从另一个上下文加载实体,以防止EntityStatus冲突。如果需要通过导航属性引用另一个实体,则
- 将在persist函数中实现任何日志记录,而不是update/ Insert /delete logic.
- During Insert、Update、Update和Delete函数。
用于调试/测试:
- 检查输出窗口中的绑定错误并修复它们。绑定错误会以静默方式向用户失败,但会降低应用程序性能和Silverlight中预期的behavior.
- Create单元测试,以验证任何添加的模型/业务逻辑
- Create单元测试项目,以测试服务器端逻辑和功能
对于实体框架:
- 保持EntitiesContext对域服务的一对一匹配。尝试以另一种方式拆分会出现问题。
- 不使用Composition属性,除非您完全打算花费大量时间仔细构建插入、更新和删除逻辑。
- 使用单独的服务将自定义类型返回给您的RIA。不要将它们添加到PersistChangeSet函数中的EntityFramework Object
- Perform服务器端更新/集成逻辑(如更新其他系统)的DomainService中,而不是添加到插入、更新和删除函数中。这将防止您通过导航属性意外引入实体,这将为您的分离版本non-updated.
- Create留下一个额外的上下文,以便在更新/集成逻辑期间查找当前值。