【问题标题】:Silverlight 4 WCF RIA Services and MVVM is not as simpleSilverlight 4 WCF RIA 服务和 MVVM 没有那么简单
【发布时间】:2011-02-13 13:59:49
【问题描述】:

[免责声明:我是 ASP.NET MVC 开发人员]

嗨,

我正在寻找一些在 Silverlight 4 中使用 WCF RIA 实现 MVVM 模式的最佳实践。

我不打算使用 IoC 的 MEF 来定位我的 ViewModel。我想知道的是如何将 MVVM 模式与 Silverlight 4 和 WCF RIA 一起应用。

我不想使用 Prism 或 MVVM Light 工具包等其他东西。我在 Internet 上找到了许多示例,展示了将数据源拖放到视图上并完成工作是多么美妙(这让我想起了我的第一次 VB6 开发)。

我尝试使用 WCF RIA 实现 MVVM,但它一点也不简单。如果我理解的话,MVVM 应该包含所有逻辑,以便对其进行单独的单元测试,但是当它与 WCF RIA 结合起来时,那就是另一回事了。我有以下问题。

  1. 我可以使用生成的元数据作为模型吗?如果我从头开始写,会更容易使用。

  2. 正如我所见,获取数据的唯一方法是通过 DomainContext 或通过视图中的直接绑定(本地资源)。我不希望视图中的直接绑定,根本不可测试。另一方面,我不能使用 DomainContext,它不会公开任何单个实体!!!我所拥有的只是可以绑定到数据网格的 EntitySet。如何将单个实体从 ViewModel 绑定到 DataForm ?

  3. 如何将模型更新到数据库?

  4. 如何从一个实体导航到它的项目集合。例如,如果我有一个公司实体,我想显示一个 DataForm 来更新实体信息和一个数据网格来显示公司地址。保存表单时,我想将信息保存到公司和地址信息,以了解哪个地址被选为活动地址。

请帮助我了解如何做好。或者也许我应该放弃 WCF RIA 并从头开始使用 WCF?

你怎么看?

【问题讨论】:

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


    【解决方案1】:

    您可能对此session 感兴趣。它解释了如何将 MVVM 模式与 RIA WCF 服务一起使用。

    【讨论】:

    • 绝对会推荐查看本文中的示例“BookClub”代码。从中学到了很多
    【解决方案2】:

    【讨论】:

      【解决方案3】:

      一些随机的答案...

      我不认为 MEF 特别适合 Silverlight。它主要用于桌面应用程序,并且可以适用于插件位于相对于应用程序的本地文件系统中的其他用途。

      MVVM 要求您了解角色。 “视图”是您的 XAML 和代码隐藏。代码隐藏应该处理来自用户控件的事件,但仅此而已。

      ViewModel 保存用户控件将绑定到的数据。通常,ViewModel 作为其 DataContext 绑定到 View,因此表单中的所有内容都可以数据绑定到 ViewModel 中的属性。 ViewModel 必须实现 INotifyPropertyChanged,并为表单数据绑定到的每个属性引发属性更改事件。

      您可能希望创建一个 ObservableCollection,使用 EntitySet 作为源。这将处理 INotifyCollectionChanged 以进行数据绑定。如果 EntitySet 中的实体也处理 INotifyPropertyChanged,那么您在集合的数据绑定方面处于良好状态。

      您可以为单个实体创建一个属性,并对其进行数据绑定,假设还实现了更改通知(对于实体成员和实体属性)。

      RIA 服务将在每次构建时重新生成 DomainContext,这有助于使其保持同步。不过,它旨在成为 ORM 之上的服务层,因此您的 ORM 或其他数据映射仍然必须通过其他方式维护。

      我还没有看过 RIA Services 的最终版本,但我对 beta 版本的印象并不深刻。我宁愿在服务器上定义好的实体类,并与 Silverlight 项目共享它们。但是,设置起来并不容易,并且需要一些不依赖服务引用的重要 WCF。 (RIA 服务最终版本可能已经清理了其中的一些内容,但 Silverlight 中的本机 WCF 服务引用非常糟糕,主要是因为它不会自动重新创建生成的类,并且它对服务器端服务的 URI 进行了硬编码.)

      元数据是 RIA 服务测试版的另一个问题。如果您控制实体源,则更容易将元数据属性直接附加到您的 DataContract 类和各个 DataMember 属性。同样,这可能意味着不使用 RIA 服务。按照 RIA 测试版的要求编写单独的元数据类并不是一个好的解决方案。

      我最终没有为 Silverlight 3 使用 RIA 服务,并且并不后悔。这是excellent article on WCF and Silverlight。虽然它说的是 Silverlight 2,但它仍然适用于任何 Silverlight 版本。

      我确实推荐 MVVM Light。如果有问题,可以在 Codeplex 上找到源代码。它提供消息传递和命令支持,以及 ViewModelLocator;虽然后者需要一些工作才能理解,但它确实是对基本 MVVM 模型的一个很好的扩展。

      希望这会有所帮助.....

      【讨论】:

      【解决方案4】:

      只是想我会让你知道我正在从事的一个项目——刚刚完成了我们的第一个版本。提供了一种非常简单的方法来专门为 Silverlight + RIA 服务处理 MVVM。简化了很多 MVVM 的东西,并通过 Notifications 类提供了更多类似控制器的功能。 http://slmvvms.codeplex.com/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-06-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多