使用Visual Studio 2012我已经向远程Web服务添加了服务引用。它配置为使用异步调用。该应用程序使用WPF和MVVM模式。
一个模型类称为Projects
,并公开可在视图模型中使用的属性ProjectList
。 ProjectList
应包含从服务中检索的项目列表。
到目前为止,我从视图模型中调用此服务(实际上它是由命令调用的):
Projects.ProjectList = proxy.getProjectList(username, password);
是的,它有效,但从我所知道的“业务逻辑”不应该由视图模型处理。那么当视图在视图模型中触发命令时,如何以及在何处调用服务并设置模型的ProjectList
属性?
答案 0 :(得分:0)
使用依赖注入将多态接口传递到ViewModel。
在此界面中定义将与您的Web服务进行通信的函数,并在具体对象中实现此接口。根据您需要访问的服务源实例化您需要的具体对象,并通过您定义的接口将其传递到ViewModel。
通过这种方式,您可以轻松实现松散耦合和多态性的所有好处......
例如:
public ProjectListViewModel(IProjectListServiceAgent sa)
public interface IProjectListServiceAgent
{
GetProjectList(string userName, string password)
}
public SqlProjectListFetcher : IProjectListServiceAgent
{
GetProjectList(string userName, string password)
{
//Fetch project list using direct SQL server access.
}
}
public WebServiceProjectListFetcher : IProjectListServiceAgent
{
GetProjectList(string userName, string password)
{
//Fetch project list using web service.
}
}
答案 1 :(得分:0)
将依赖项传递给ViewModel以使用代理,我更喜欢使用异步系统的始终同步代码,因此代理具有方法proxy.GetCustomerList,您可以使用async关键字或TaskFactory。
我正在为MVVM维护一个小框架帮助程序来完成这项任务,特别是:
也可以在单个线程中执行所有操作以进行测试,从而更改配置
源代码(非实时更新)位于http://hyperionsdk.codeplex.com,此处的包http://nuget.org/packages/EyeSoft.Wpf.Facilities。
用法示例:
public ViewModelSorted(ServiceFactory<ICustomerService> customerServiceFactory)
{
customerServiceFactory
.Collection(this, x => CustomerCollection)
.Sort(x => x.LastName)
.Fill(x => x.GetCustomersWithTurnoverGreatherThan(0));
}