我可以使用WCF接口作为MVVM模型吗?

我可以使用WCF接口作为MVVM模型吗?

问题描述:

我的WPF应用程序应通过WCF从管道接收数据: 我是MVVM的新手,我无法理解在哪里放置一些东西。我很清楚什么是视图,但不清楚什么是ViewModel,尤其是什么是模型在我的情况下(在WCF涉及的情况下)问题是:我可以使用WCF接口作为MVVM模型吗?

  • 什么是模型?我需要特殊的班级来代表模特吗?或模型是WCF服务器应用程序?什么是有效的工作流程“WCF服务器应用程序----命名管道-----> ViewModel < - 数据绑定 - >查看”“WCF服务器应用程序----命名管道----- > Model < ---> ViewModel < - 数据绑定 - >查看“
  • 如何重构下面的代码?在哪里把所有这些初始化?到ViewModel?到Model类(如果我需要它),到特殊的“初始化”类?

    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(); 
} 

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

ViewModel是一个描述在View中显示的数据的类。这些数据通常但不一定是来自Model类。

ViewModel负责管理Model类:将他们的信息暴露给View,并根据View的输入对他们做些什么。这就是说,我不想在ViewModel中看到实际的通信工作。相反,我将通信抽象到另一层(我称之为服务层,但在这种情况下可能会造成混淆)。

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

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

+0

谢谢,我喜欢那样!我不喜欢用“沟通”的东西来玷污模特。所以ViewModel最适合MVVM,但引入一个“服务层”可能会有所帮助。这也意味着我需要为模型添加一个类,并且IManagementConsole不是模型,因为模型可以包含额外的东西,而不仅仅是来自WCF的数据...服务层应该通过WCF到服务器应用程序并创建在ViewModel中使用的模型实例。 – javapowered

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

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

ViewModel'包装'模型并使其适用于支持UI内容和UI逻辑。

在你的情况下,你会想要一个class ManagementConsoleViewModelclass StrategyDescriptorViewModel

ViewModels实现INotifyPropertyChanged并可能为数据绑定提供命令和额外属性。

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

+0

我不想使用'IManagementConsole'作为ViewModel,我想使用'IManagementConsole'作为模型 – javapowered

可能使用您的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服务通常包含会员逻辑上一起去。