在Silverlight 3.0中将.NET RIA Services和MVVM相结合

8
当使用.NET RIA Services和MVVM在Silverlight 3.0中时,RIA Services的元数据类型和MVVM模式的ViewModel之间有区别吗?它们是相同的东西还是应该保持分开?
元数据类型是部分实体类的封闭内部类。似乎没有适当的分离,但元数据类型也可以用于装饰带有验证属性的ViewModel。
我已经搜索过了,但没有看到任何详细讨论这个问题的内容。
2个回答

11

同意ChuckJ的观点 - 通常DomainContext是视图模型的一部分。例如,假设我有一个搜索页面,允许对产品目录进行搜索。这是我的结构:

在服务器端:

class Catalog : DomainService {
    IQueryable<Product> GetProducts(string keyword) { ... }
}

生成的 DomainContext:
class Catalog : DomainContext {
    EntityList<Product> Products { get; }
    void LoadProducts(string keyword);
}

我会编写的视图模型:

class SearchViewModel {
    Catalog _catalog = new Catalog();

    public IEnumerable<Product> Results {
        get { return _catalog.Products; }
    }

    public void Search(string keyword) {
        _catalog.Products.Clear();
        _catalog.LoadProducts(keyword);
    }
}

最后,在我的XAML中,我会将UserControl的DataContext设置为SearchViewModel的一个实例,并将ItemsControl绑定到Results属性。我会使用您选择的ViewModel模式将按钮点击绑定到Search(这实际上是SearchViewModel公开的命令)。我个人喜欢使用Silverlight.FX中的某些东西:

<Button Content="Search"
  fxui:Interaction.ClickAction="$model.Search(keywordTextBox.Text)" />

如最初所示此处

正如Chuck所提到的,我的视图模型可能确实有其他状态,例如SelectedProduct可能会双向绑定到xaml中ListBox的SelectedItem,并将相同的SelectedProduct绑定为DataForm的DataContext以显示所选产品的详细信息。

希望这可以帮助您!我很快将在我的博客上进一步介绍这个问题。


经过上周的一些思考,我认为这就是我的想法。DomainContext并不是完整的ViewModel,而是其中的一部分。在DomainService的MetadataType中定义的属性(如[Required])是否需要在ViewModel中重新声明,或者DomainContext作为ViewModel的一部分已足够被验证引擎捕获? - Robert Kozak
Nikhil的博客文章链接:http://www.nikhilk.net/Entry.aspx?id=229 - Robert Kozak
[Required] 等元数据属性位于实体类型上,而非视图模型本身。如果您从视图模型中公开一个实体实例(例如上面的示例中的 Products),则会被捕获。 - Nikhil Kothari
从VM直接访问DomainContext是否足够聪明?还是我应该将其封装在某种存储库中,或者使用UoW进行操作?你能给我推荐一篇好的文章吗?除非你认为直接从VM查询和操作数据到DomainContext是可以的。 - Shimmy Weitzhandler
实际上,我刚刚找到了适用于我的情况的确切答案 - Shimmy Weitzhandler

1

RIA服务数据上下文被设计为在MVVM模式中扮演ViewModel的角色,因为它们本地支持数据绑定,但是在他们的文档中并没有使用这个术语。然而,这真的取决于情况。您可能需要在视图模型中使用RIAD数据上下文提供的状态,例如命令和其他与视图相关的状态。我认为您想要做的是将来自RIA服务的数据上下文作为视图模型的一部分使用。


我越看越觉得我想尽可能隐藏EntityObject及其MetaDataType。我认为你说的对,我可能确实想要在ViewModel中使用DataContext,但我也想将MetaData内部类从EntityObject中移除并移到ViewModel中。正确吗? - Robert Kozak
等等。这似乎也不对。我认为MetaData类需要在服务器端而ViewModel在客户端。噫。也许ViewModel应该作为共享代码? - Robert Kozak
经过今天早上的评论,我终于意识到你回答了这个问题。嗨,查克,好久不见了。希望生活对你很好。 - Robert Kozak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接