背景
我正在构建一个双层应用程序:
Winforms客户端将使用HttpClient
使用WebAPI服务。两层都大量使用IoC和依赖注入设计模式
问题
当Winforms应用程序需要来自WebAPI服务的数据时,演示者将协调请求。我的问题是,您是否会直接在演示者内部使用HttpClient
?为了保持演示者的可测试性,您如何确保不必依赖具体的HttpClient
电话?我想以某种方式整合了这个question的最佳答案。
答案 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客户端测试服务代理。如果您需要更改/交换/维护应用程序组件,它还允许您注入这些接口的任何具体实现。