wcf - 关于服务引用和 MVVM 模式的一些常见问题

标签 wcf web-services mvvm visual-studio-2012

有一个网络服务。

  • 它提供类型 ZooAnimal
  • Zoo 有一个动物 ID 和名称的字典。
  • Animal 具有属性:IdName(其他内容)
  • 它有一个返回动物园对象的方法 GetZoo
  • 它有一个方法 GetAnimalStuffById,该方法返回一个 Animal 对象,其中包含 IdName (附加内容)

所以想法是 - GetZoo 允许我获取动物 id + 名称的列表,然后 GetAnimalStuffById 获取完整的动物信息。

我在 VS 中向该服务添加了一个“服务引用”,并且想要编写一个 MVVM 应用程序。有些事情我不太明白,需要洗脑。

  1. 自动生成的类可以作为我的模型吗?

  2. 与示例无关,但无论如何:添加服务引用时应该指定什么“集合类型”?对于模型来说,ObservableCollection 是否是一种矫枉过正和不好的做法?

  3. 假设,用户转到显示完整动物信息的应用程序页面。显然,最初我有一个只有 IdName 值的 AnimalViewModel(取自 GetZoo)。当导航到页面时,我调用 GetAnimalStuffById 并获取包含所有数据的 Animal 对象。接下来我应该做什么?将我 View 的 DataContext 替换为从新 Animal 对象创建的新 AnimalViewModel (A),或者仅替换其中的值 (B)?

    <
  4. 如果答案是(A),如何替换所有 View 中的 DataContext?

  5. 如果答案是 (B),什么会导致更新?虚拟机是否应该订阅某个高级经理关于获取 Animal 更新的事件?或者还有其他方法吗?

  6. 自动生成的类中 INotifyPropertyChanged 的用途是什么?在我的例子中,它们总是从网络服务中新鲜返回。 Microsoft 是否建议在某些情况下也将它们用作 ViewModel?

谢谢。

最佳答案

以下是根据我自己的 MVVM 经验得出的一些答案(可能是也可能不是“最佳实践”..)

  1. 绝对!无需将所有事情都做两次 - 请参阅 #5 和 #6(尽管有些人不同意这里)。

  2. 是的,除非您确实需要 ObservableCollection 的功能服务器端,我会说这是矫枉过正,并且可能会让其他人感到困惑。从技术上讲,通过网络发送消息没有任何开销,但我会选择更简单的东西,比如数组。

  3. 选择选项 B。

  4. -

  5. 例如,您的 AnimalViewModel 中可以有一个属性保存所有附加内容:public Animal AdditionalData { ... 。现在,无论谁调用GetAnimalStuffById可以用Animal更新当前ViewModel的AdditionalData对象。

  6. 我假设您已经知道 INotifyPropertyChanged是为了让 View 知道某些数据在某处发生了更改(如果没有,谷歌搜索“inotifypropertychanged mvvm”应该可以帮助您开始)。现在,连接#1 和#5 中的点,您的 View 现在可以通过“AdditionalData”属性绑定(bind)到动物的附加数据,而无需在 ViewModel 中重新创建所有内容:<TextBox Text="{Binding Path=AdditionalData.HeightOrWhatever}" /> .

注意:如果您的 View 不是 WPF 或 Silverlight,则最后一点没有多大意义。

关于wcf - 关于服务引用和 MVVM 模式的一些常见问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14293766/

相关文章:

wcf - 在哪里 Hook 到 WCF 管道以从传入的 HTTP 请求 header 中提取 UserNamePasswordValidator 的凭据

c# - WCF 在没有 IIS 的情况下与多个客户端通信

web-services - 如何为公共(public)和内部流量保护 Kong Gateway 后面的 API

c# - View 模型 (WPF) 中的 UI 更新命令

用于堆栈面板中收集的 Silverlight 数据绑定(bind)

c# - 如何使用 MVVM 为用户偏好创建程序架构

javascript - 将 CORS + SOAP + WCF 用于 HTTPS 服务

jquery - Azure 托管的 WCF 服务导致错误 400

java - 使用camel的网络服务链

java - 如何修复没有 SOAPAction header 的问题!错误