【问题标题】:can I use WCF interface as a MVVM Model?我可以使用 WCF 接口作为 MVVM 模型吗?
【发布时间】:2011-11-18 18:22:28
【问题描述】:

我的 WPF 应用程序应该通过 WCF 从管道接收数据: 我是 MVVM 的新手,我不明白在哪里放一些东西。我很清楚什么是 View,但不清楚什么是 ViewModel,尤其是在我的情况下是什么 Model(如果涉及 WCF)问题是:

  • 什么是型号?我需要特殊的类来代表模型吗?还是模型是 WCF 服务器应用程序?什么是有效的工作流 "WCF Server application ----命名管道-----> ViewModel View""WCF Server application ----命名管道-----> ModelViewModel View"
  • 如何重构下面的代码?把所有这些初始化放在哪里?视图模型?到模型类(如果我需要的话),到特殊的“初始化”类?

    public MainWindow()
    {
    ChannelFactory<IManagementConsole> pipeFactory =
    new ChannelFactory<IManagementConsole>(
        new NetNamedPipeBinding(),
        new EndpointAddress(
            "net.pipe://localhost/PipeMBClientManagementConsole"));
    
        IManagementConsole pipeProxy =
          pipeFactory.CreateChannel();
    
        List<ConsoleData> datas = new List<ConsoleData>();
        foreach (StrategyDescriptor sd in pipeProxy.GetStrategies())
        {
            datas.Add(pipeProxy.GetData(sd.Id));
        }
        this.DataContext = datas;
    }
    

我可以假设这是我的 MVVM 模型吗? :

[ServiceContract]
public interface IManagementConsole
{
    [OperationContract]
    ConsoleData GetData(int strategyId);

    [OperationContract]
    List<StrategyDescriptor> GetStrategies();
}

【问题讨论】:

    标签: c# wpf mvvm


    【解决方案1】:

    模型是一个描述来自后端数据源的数据的类。它们可以是来自源的实际类(如 EF 或 WCF 代理),也可以是简单的 DTO。这真的取决于你的喜好。

    ViewModel 是一个描述要在视图中显示的数据的类。数据经常(但不一定)来自模型类。

    ViewModel 负责管理 Model 类:将它们的信息暴露给 View,并根据来自 View 的输入对它们做一些事情。话虽如此,我不希望在 ViewModel 中看到实际的通信工作。相反,我将通信抽象到另一个层(我将我的称为服务层,但在这种情况下可能会造成混淆)。

    本质上,我让 ViewModel 向与后端通信的服务层发出请求,以检索/创建模型对象,然后将这些对象返回给 ViewModel。如果服务调用是异步的,但仍然可以完成,这会变得复杂。

    对于一个简单的例子,从practicalmvvm.com下载代码示例。

    【讨论】:

    • 谢谢,我喜欢!我不想用“交流”的东西弄脏模型。所以 ViewModel 最适合 MVVM 中的那个,但是再引入一个“服务层”可能会有所帮助。这也意味着我确实需要一个 Model 类,而 IManagementConsole 不是 Model,因为 Model 可以包含额外的东西,而不仅仅是来自 WCF 的数据......服务层应该去服务器通过 WCF 应用程序并创建模型实例以在 ViewModel 中使用。
    【解决方案2】:

    我可以假设这个 [IManagementConsole] 是我的 MVVM 模型吗? :

    是的,它是(可以是)模型。但它不太可能用作 ViewModel。

    ViewModel 会“包装”模型并使其适合支持 UI 内容和 UI 逻辑。

    在您的情况下,您需要class ManagementConsoleViewModelclass StrategyDescriptorViewModel

    ViewModel 实现了 INotifyPropertyChanged,并且可以为数据绑定提供命令和额外属性。

    最好的办法是查看一些基本的 MVVM 示例(它真的非常基本,只需将 BaseViewModel 和 RelayCommand 类添加到您的项目中),然后决定一个(小)框架。像 Caliburn-micro 或 MVVM-light。

    【讨论】:

    • 我不想使用IManagementConsole作为ViewModel,我想使用IManagementConsole作为Model
    【解决方案3】:

    可以将您的 WCF 服务客户端用作 MVVM“模型”。然而,通常会创建一个实际的 Model 类,然后使用 WCF 服务,因为通常没有单个 View 和/或 ViewModel 的单个 WCF 服务。

    例如:

    public class MyModel
    {
        IUsersService usersSrv;
        ICompaniesService compSrv;
    
        public MyModel(IUsersService usersSrv, ICompaniesService compSrv)
        {
            this.usersSrv = usersSrv;
            this.compSrv = compSrv;
        }
    
        public string GetUserAndCompanyName()
        {
            return usersSrv.GetUserName() + " belongs to " + compSrv.GetCompanyName();
        }
    }
    

    换句话说,您的模型通常会包含与您的视图对应的成员,而您的 WCF 服务通常会包含逻辑上组合在一起的成员。

    【讨论】:

      猜你喜欢
      • 2013-05-28
      • 2020-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多