【问题标题】:How to make sure all models have access to service agents?如何确保所有模型都可以访问服务代理?
【发布时间】:2012-07-10 13:19:59
【问题描述】:

我有一个 MVVM 架构中的 WPF 客户端。

WPP 客户端需要连接到 WCF 服务,并向其发送操作。

这种能力需要来自不同的观点,因此意味着不同的模型(对吗?)

问题:

  1. 我的假设是,models 是访问 WCF 服务客户端的那些 - 正确吗?含义 - 我们不希望视图或模型视图连接到 WCF 服务,对吗?只有模型本身...
  2. 如何确保所有模型都可以访问 WCF 服务的客户端?我是否使用某种“ServiceLocator”? (我在某处读过这个词,但不知道它的确切含义。如果以前做过这件事的人能对这个话题有所了解,我会很高兴)。

【问题讨论】:

标签: wpf wcf mvvm model


【解决方案1】:

我个人认为Models 不应该只是保存数据的普通容器对象。它们不应包含数据访问代码或任何其他应用程序逻辑,除了可能用于验证其数据完整性的基本数据验证。

您的ViewModels 应该是负责与 WCF 服务器通信的人。或者更好的是,创建一个包含所有数据访问调用的存储库类,并让 ViewModel 使用它。

不要忘记,使用 MVVM,您的ViewModels 就是您的应用程序。他们负责从应用程序流到业务逻辑再到数据访问的所有事情(尽管有时这些概念是从 VM 中抽象出来的,例如使用存储库进行数据访问)。

Views 只是位于 ViewModel 之上的用户友好界面,允许用户与其交互,Models 只是用于包含数据的对象。

【讨论】:

    【解决方案2】:
    1. Model 代表数据,因此 ViewModel 应该了解服务
    2. 只需将 IMyWcfService 作为任何 ViewModel 的依赖项,您可以使用接受 IMyWcfService 的受保护构造函数创建 ViewModelBase 抽象类,因此所有具体的 ViewModel 都有义务提供此服务

    正如 cmets 中所述 - 尽量避免使用服务定位器,这会弄乱 API 和单元测试。只需将所有依赖项作为构造函数参数提供,这将使类 API 更加清晰,因此您将看到所需的内容,而不必担心诸如“服务定位器无法解析服务”之类的运行时错误

    【讨论】:

    • 服务客户端什么时候被实例化? ViewModel 何时创建? MainWindowViewModel 呢?它总是可见的——所以它的客户端应该总是“连接”的吗? (有人告诉我这是个坏主意,而且在 WCF 中 - 只应在通话期间创建客户端)
    • 此外 - 我有一个特定的服务,我的 WPF 应用程序总是需要连接到该服务(用于使用 ICallback 的通知)。我不确定我应该在哪里实例化它...
    • 你应该在实际调用之前实例化它,或者如果它仍然会被使用 - 在你的应用程序的顶层实例化它,关于调用期间的可用性 - 这是另一个问题
    • 你说我应该在应用程序的顶层实例化它?这是在“App.xaml.cs”中完成的吗? “App.xaml.cs”如何访问所有服务? 'App.xaml.cs' 实例化服务似乎很奇怪,而 ViewModel 将使用它......还有另一件事 - 我将有一个'登录'窗口 - 用户将在其中输入用户名和密码,将用于连接到服务。这意味着在应用程序启动期间我无法连接到服务。这需要在“LoginViewModel”中发生,不是吗?
    • 对不起,我不是说App.xaml.cs级别的。我的意思是您的业务对象进入场景的顶层,基本上是主要服务/主视图模型被实例化的地方
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-11
    • 2011-08-03
    • 1970-01-01
    相关资源
    最近更新 更多