我可以使用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下载代码示例。
我可以假设这个[IManagementConsole]是我的MVVM模型吗? :
是的,它是(可以)模型。但它不太可能用作ViewModel。
ViewModel'包装'模型并使其适用于支持UI内容和UI逻辑。
在你的情况下,你会想要一个class ManagementConsoleViewModel
和class StrategyDescriptorViewModel
。
ViewModels实现INotifyPropertyChanged并可能为数据绑定提供命令和额外属性。
最好的事情是研究一些基本的MVVM示例(它非常基本,只需将BaseViewModel和RelayCommand类添加到您的项目中),然后决定一个(小)框架。像Caliburn-micro或MVVM-light。
我不想使用'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服务通常包含会员逻辑上一起去。
谢谢,我喜欢那样!我不喜欢用“沟通”的东西来玷污模特。所以ViewModel最适合MVVM,但引入一个“服务层”可能会有所帮助。这也意味着我需要为模型添加一个类,并且IManagementConsole不是模型,因为模型可以包含额外的东西,而不仅仅是来自WCF的数据...服务层应该通过WCF到服务器应用程序并创建在ViewModel中使用的模型实例。 – javapowered