在MVVM中使用Web服务的位置?

时间:2013-01-30 20:23:39

标签: c# wpf wcf mvvm

使用Visual Studio 2012我已经向远程Web服务添加了服务引用。它配置为使用异步调用。该应用程序使用WPF和MVVM模式。

一个模型类称为Projects,并公开可在视图模型中使用的属性ProjectListProjectList应包含从服务中检索的项目列表。

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

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

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

2 个答案:

答案 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维护一个小框架帮助程序来完成这项任务,特别是:

  1. 检索DTO,单个或列表
  2. 使用自定义映射器(也可以是AutoMapper)转换为ViewModel
  3. [可选]对列表进行排序
  4. [可选]执行completition之后的方法
  5. 也可以在单个线程中执行所有操作以进行测试,从而更改配置

    源代码(非实时更新)位于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));
    }