从MVP Winform Client使用WebAPI的设计模式

时间:2016-06-11 16:13:14

标签: c# winforms design-patterns asp.net-web-api dotnet-httpclient

背景

我正在构建一个双层应用程序:

  • 第1层:使用MVP(Model-View-Presenter)设计模式Winforms应用程序。
  • 第2层:WebAPI RESTful服务。

Winforms客户端将使用HttpClient使用WebAPI服务。两层都大量使用IoC和依赖注入设计模式

问题

当Winforms应用程序需要来自WebAPI服务的数据时,演示者将协调请求。我的问题是,您是否会直接在演示者内部使用HttpClient?为了保持演示者的可测试性,您如何确保不必依赖具体的HttpClient电话?我想以某种方式整合了这个question的最佳答案。

1 个答案:

答案 0 :(得分:6)

我通过抽象一切来解决这个问题。

在表示层我会有一个服务抽象......

@if(in_array(Request::path(), array('/','home')) 

...从Web API中抽象出我想要的东西。演示者不需要协调请求。演示者并不关心数据的来源。它所知道的是它需要一些东西并要求它(SoC)。这是服务代理的工作(SRP)。

服务代理实现可能需要调用不同的数据源。包括网络。因此,抽象public interface IServiceAgent { Task<SomeResultObject> GetSomething(string myParameter); } 将放松与该实现的耦合。

一个简单的例子,如......

HttpClient

一些示例实现看起来像这样......

public interface IHttpClient {
    System.Threading.Tasks.Task<T> GetAsync<T>(string uri) where T : class;
    System.Threading.Tasks.Task<T> GetAsync<T>(Uri uri) where T : class;
    //...other members as needed : DeleteAsync, PostAsync, PutAsync...etc
}

通过抽象这些依赖项,您可以通过允许使用伪造/模拟服务代理进行单元测试来保持演示者可测试。您可以使用假/模拟HTTP客户端测试服务代理。如果您需要更改/交换/维护应用程序组件,它还允许您注入这些接口的任何具体实现。