代码之家  ›  专栏  ›  技术社区  ›  Tomasz Jaskuλa

Silverlight 4 WCF RIA服务和MVVM并不是那么简单

  •  8
  • Tomasz Jaskuλa  · 技术社区  · 15 年前

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

    你好,

    我正在寻找一些在Silverlight4中使用WCFRIA实现MVVM模式的最佳实践。

    我不想用IOC的MEF来定位我的视图模型。我想知道的是如何在Silverlight4和WCF RIA中应用MVVM模式。

    我不想用其他的东西,比如棱镜或者MVVM光工具包。我在互联网上找到了许多例子,展示了在视图上拖放数据源是多么的美妙,并且完成了任务(它提醒了我我的第一个vb6开发)。

    我试着用WCF RIA实现MVVM,但这根本不是一个挑战。如果我理解的话,MVVM应该包含所有逻辑,以便独立地对其进行单元测试,但是当它要与WCF RIA结合时,这是另一回事。我有以下问题。

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

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

    3. 如何将模型添加到数据库中?

    4. 如何从一个实体导航到其项的集合。例如,如果我有一个公司实体,我想显示一个数据表单来更新实体信息,以及一个数据网格来显示公司地址。在保存表单时,我希望将信息保存到公司,并将信息保存到地址,以说明选择哪个地址为活动地址。

    请帮助我理解如何做好这件事。或者我应该放弃WCF RIA,从头开始使用WCF?

    你怎么认为?

    4 回复  |  直到 14 年前
        1
  •  9
  •   Larry Grass    15 年前

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

        2
  •  4
  •   Dan    14 年前
        3
  •  4
  •   Cylon Cat    14 年前

    一些随机答案…

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

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

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

    您可能需要创建一个ObservableCollection,使用EntitySet作为源。这将处理用于数据绑定的inotifyCollectionChanged。如果EntitySet中的实体也处理inotifyPropertiesChanged,那么您在集合的数据绑定方面状态良好。

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

    RIA服务将在每个构建上重新生成域上下文,这有助于保持同步。不过,它的目的是作为ORM之上的服务层,因此您的ORM或其他数据映射仍然需要通过其他方式进行维护。

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

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

    我最终没有使用Silverlight3的RIA服务,对此我并不后悔。这里有一个 excellent article on WCF and Silverlight . 虽然它说Silverlight2,但它仍然是任何Silverlight版本的目标。

    我推荐MVVM灯。如果这是一个问题,那么codeplex上提供了源代码。它提供消息传递和命令支持,以及一个ViewModelLocator;虽然后者需要一些工作来理解,但它确实是对基本MVVM模型的一个很好的扩展。

    希望这有帮助…..

        4
  •  2
  •   Ryan from Denver    14 年前

    我只是想让你知道我正在做的一个项目-刚刚完成了我们的第一个版本。提供了一种非常简单的方法来专门为Silverlight+RIA服务访问MVVM。简化了许多MVVM内容,并为通知类提供了更多类似控制器的函数。 http://slmvvms.codeplex.com/