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

时间:2011-11-18 18:22:28

标签: c# wpf mvvm

我的WPF应用程序应该通过WCF从管道接收数据: 我是MVVM的新手,我无法理解在哪里放一些东西。我很清楚View是什么,但不清楚什么是ViewModel,尤其是我的案例中的模型(如果涉及到WCF)问题是:

  • 什么是模特?我需要特殊的课来代表模特吗?或者Model是WCF服务器应用程序?什么是有效的worflow “WCF服务器应用程序----命名管道-----> ViewModel< - 数据绑定 - >查看”“WCF服务器应用程序 - ---命名管道----->模型< ---> 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();
}

3 个答案:

答案 0 :(得分:2)

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

ViewModel是一个描述要在View中显示的数据的类。通常但不一定,数据来自模型类。

ViewModel负责管理Model类:将它们的信息暴露给View,并根据View的输入对它们执行某些操作。话虽这么说,我宁愿不在ViewModel中看到实际的通信工作。相反,我将通信抽象到另一层(我称之为服务层,但在这种情况下可能会令人困惑)。

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

有关此示例的简单示例,请从practicalmvvm.com下载代码示例。

答案 1 :(得分:1)

  

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

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

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

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

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

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

答案 2 :(得分:1)

可以使用您的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服务通常包含逻辑上合并的成员。