[免责声明:我是ASP.NET MVC开发人员]
您好,
我正在寻找一些在Silverlight 4中使用WCF RIA实现MVVM模式的最佳实践。
我不打算使用IoC的MEF来查找我的ViewModel。我想知道的是如何在Silverlight 4和WCF RIA中应用MVVM模式。
我不想使用像Prism或MVVM Light工具包这样的其他东西。我在互联网上发现了许多例子,展示了如何在视图上拖放数据源并完成工作(它让我想起了我的第一个VB6开发)。
我尝试使用WCF RIA实现MVVM,并且它根本不是直截了当的。如果我理解,MVVM应该包含所有逻辑,以便单独测试它,但是当它与WCF RIA结合时,它是另一个故事。我有以下问题。
我可以将生成的元数据用作模型吗?如果我从头开始写所有内容会更容易使用它。
我看到了获取数据的唯一方法是通过DomainContext或通过视图中的直接绑定(本地资源)。我不希望视图中的直接绑定,根本不可测试。另一方面,我不能使用DomainContext,它不暴露任何单个实体!我所拥有的只是可以绑定到datagrid的EntitySet。如何从ViewModel将单个实体绑定到DataForm?
如何将模型更新到数据库?
如何从一个实体导航到其项目的集合。例如,如果我有公司实体,我想显示一个DataForm来更新实体信息,并显示一个数据网格来显示公司的地址。保存表单时,我希望将信息保存到公司,并提供有关选择哪个地址为活动状态的信息。
请帮助我了解如何做得好。或者我可能会放弃WCF RIA并从头开始使用WCF吗?
您怎么看?
答案 0 :(得分:9)
您可能对此session感兴趣。它解释了如何将MVVM模式与RIA WCF服务一起使用。
答案 1 :(得分:4)
答案 2 :(得分:4)
一些随机答案......
我不认为MEF特别适合Silverlight。它主要用于桌面应用程序,并且可以适用于插件位于相对于应用程序的本地文件系统中的其他用途。
MVVM要求您了解角色。 “视图”是您的XAML和代码隐藏。代码隐藏应该处理来自用户控件的事件,但只是处理它。
ViewModel保存用户控件将绑定到的数据。通常,ViewModel绑定到View作为其DataContext,因此表单中的所有内容都可以数据绑定到ViewModel中的属性。 ViewModel必须实现INotifyPropertyChanged,并为表单数据绑定到的每个属性引发属性更改事件。
您可能希望使用EntitySet作为源来创建ObservableCollection。这将处理INotifyCollectionChanged以进行数据绑定。如果EntitySet中的实体也处理INotifyPropertyChanged,那么您在集合的数据绑定方面处于良好状态。
您可以为单个实体创建一个属性,并为此数据绑定,假设还实现了更改通知(实体成员和实体属性)。
RIA Services将在每次构建时重新生成DomainContext,这有助于保持同步。它的目的是成为ORM上方的服务层,因此您的ORM或其他数据映射仍然必须通过其他方式进行维护。
我没有看过RIA Services的最终版本,但我对测试版没有留下深刻的印象。我宁愿在服务器上定义好的实体类,并与Silverlight项目共享它们。但是,设置并不容易,并且需要一些不依赖于服务引用的非平凡WCF。 (RIA Services最终版本可能已经清理了一些,但Silverlight中的本机WCF服务引用非常恶劣,主要是因为它不会自动重新创建生成的类,并且它会对服务器端服务的URI进行硬编码。)
元数据是RIA Services beta的另一个问题。如果您控制实体源,则更容易将元数据属性直接附加到DataContract类和单个DataMember属性。同样,这可能意味着不使用RIA服务。正如RIA测试版所要求的那样编写单独的元数据类并不是一个好的解决方案。
我最终没有使用Silverlight 3的RIA服务,并且没有后悔。这是一个excellent article on WCF and Silverlight。虽然它说Silverlight 2,但它仍然是任何Silverlight版本的目标。
我推荐MVVM Light。 Codeplex上有源,如果这是一个问题。它提供消息传递和命令支持,以及ViewModelLocator;虽然后者需要做一些工作才能理解,但它确实是对基本MVVM模型的一个很好的扩展。
希望这会有所帮助.....
答案 3 :(得分:2)
我想我会告诉你一个我正在研究的项目 - 刚刚完成我们的第一个版本。提供了一种非常简单的方法来专门处理Silverlight + RIA服务的MVVM。简化了很多MVVM的东西,并在Notifications类中提供了一些类似控制器的函数。 http://slmvvms.codeplex.com/