我正在构建一个WP7应用程序,它通过WCF服务获取所有数据。我想在其中实现MVVM-Light,但在我做过的教程中,我看到在ViewModelLocator中,它想要在应用程序启动时创建所有ViewModels的静态实例。我的问题是,在我的VM的构造函数中,是我进行WCF调用的地方,当然,结果会在回调中返回。在我将结果分配给我的可观察集合的回调中,我的视图可以看到。这在不使用MVVM-Light时工作得很好,但如果我实现它,我就不能在启动时调用这些WCF,因为它们传递的参数在用户使用应用程序之前是未知的/可用的(选择项目等)。我尝试将对WCF的调用移动到我的可观察集合的getter中,但它一直在无限循环中调用WCF。在我见过的所有MVVM-light示例中,我没有看到有人调用WCF服务。关于如何将WCF调用放在模型中的位置,有什么建议吗?
发布于 2011-07-31 15:39:17
在MVVM中,没有正确的方法。因为它是关于感觉... :-)
如果需要,您可以将代码放入视图模型中。但是,您还必须在视图模型中生成设计时数据-如果您想使用它的话。
这种方法的最大缺点是在视图模型和服务代码之间引入了耦合(因为您必须在视图模型中实例化服务)。分离组件的一般方法是创建一个描述您的服务的接口,并将实现此接口的对象的实例注入到视图模型的构造函数中。这使您能够创建设计时和运行时实现,并且您的视图模型并不关心它使用哪一个-即对象是解耦的。
编辑
在我的帖子中注入并不意味着你使用了注入容器/框架,它只是意味着你使用一个接口来抽象你的服务行为,然后将这个接口的实现者或实现者传递到你的视图模型的构造器中。您现在可以在创建视图模型时传递接口的不同实现,例如在视图定位器中。
建议的模式被称为“控制反转”,注入是一种将在别处创建的对象传递到您创建的类中的技术。通过这一点,我们的类现在屏蔽了实现者的任何细节知识,并且它们变得可互换。
控制容器的反转--如ninject,unity等--只是帮助你自动解析依赖关系,然而,在使用in版本的控制模式时,它们并不是必需的()。
发布于 2011-07-31 14:19:27
我不认为将WCF调用放在ViewModel中是好的,你应该将WCF调用封装在另一个类中。您的ViewModel应该只包含图形用户界面逻辑。我认为你从WCF调用中得到的是模型,你可以使用这个模型来创建ViewModel。
发布于 2011-08-01 21:55:19
以下是我的CommonServiceHelper.cs文件示例
public void GetUserSettings(UserInfoIn input, Action<UserInfoOut, Exception> callback)
{
var proxy = new CommonServiceClient();
try
{
proxy.GetUserSettingsCompleted += (sender, eventargs) =>
{
var userCallback = eventargs.UserState as Action<UserInfoOut, Exception>;
if (userCallback == null)
return;
if (eventargs.Error != null)
{
userCallback(null, eventargs.Error);
return;
}
userCallback(eventargs.Result, null);
};
proxy.GetUserSettingsAsync(input, callback);
}
catch (Exception ex)
{
proxy.Abort();
//ErrorHelper.WriteErrorLog(ex.ToString());
}
finally
{
if (proxy.State != CommunicationState.Closed)
{
proxy.CloseAsync();
}
}
}然后在ViewModel中,我这样调用它:
var serviceCommon = new CommonServiceHelper();
serviceCommon.GetUserSettings(userSettingsInput, (result, error) =>
{
if (result != null && error != null)
{
//everything is ok
}
else
{
//handle errors
}
});https://stackoverflow.com/questions/6886018
复制相似问题