1

使用 Visual Studio 2012,我添加了对远程 Web 服务的服务引用。它被配置为使用异步调用。该应用程序使用带有 MVVM 模式的 WPF。

一个模型类被调用Projects并公开一个ProjectList可以在视图模型中使用的属性。ProjectList应包含从服务中检索到的项目列表。

到目前为止,我像这样从视图模型中调用此服务(实际上它是由命令调用的):

Projects.ProjectList = proxy.getProjectList(username, password);

是的,它有效,但从我所学到的“业务逻辑”不应该由视图模型处理。ProjectList那么当视图在视图模型中触发命令时,我将如何以及在哪里调用服务并设置模型的属性?

4

2 回答 2

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.
   }
}
于 2013-01-30T20:29:55.193 回答
0

将依赖项传递给 ViewModel 以使用代理,我更喜欢始终使用异步系统的同步代码,因此代理具有方法 proxy.GetCustomerList,您可以使用 async 关键字或 TaskFactory。

我正在为 MVVM 维护一个小框架助手来简单地完成这项任务,特别是:

  1. 检索 DTO、单个或列表
  2. 使用自定义映射器(也为 AutoMapper)转换为 ViewModel
  3. [可选] 对列表进行排序
  4. [可选] 完成后执行方法

也可以在单个线程中执行所有内容以更改配置以进行测试

源代码(不是实时更新)在这里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));
}
于 2013-01-30T20:50:30.213 回答