我的WPF应用程序应该通过WCF从管道接收数据: 我是MVVM的新手,我无法理解在哪里放一些东西。我很清楚View是什么,但不清楚什么是ViewModel,尤其是我的案例中的模型(如果涉及到WCF)问题是:
如何重构下面的代码?把所有这些初始化放在哪里?到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();
}
答案 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 ManagementConsoleViewModel
和class 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服务通常包含逻辑上合并的成员。