我正在做一个项目,我需要调用一个REST API。API的端点位于三个不同的服务器上,具有三个不同的基址。
-
我正在使用
System.Net.Http.HttpClient
类来建模HTTP客户端。 -
我计划有三个不同的HTTP客户端,每个服务器一个作为基址是不同的。我们将它们命名为ServerClient1, ServerClient2和ServerClient 3。
- 这三个客户端将使用
HttpClient
类中的方法,但必须实现自己的方法来处理来自服务器的HttpReponse
。
:
private async Task<HttpResonseMessage> getPresenceAsync() {
string url="/xxx/yyy/zzzz";
HttpResponseMessage httpResponse=await httpClient.GetAsync(url);
return httpResponse;
}
在这种情况下,这将是一个很好的设计决策:让ServerClients扩展HttpClient
或让HttpClient
作为ServerClients的成员?
我指的是下面的链接,我个人认为聚合将是一个更好的选择,因为我不会使用HttpClient
类中的所有方法。
继承与聚合
任何不同的观点/帮助都是感激的。
谢谢!
我建议您使用聚合而不是继承来遵循单一职责原则。此外,我将在构造函数中注入HttpClient
。这样你的ServiceClient
只会做一件事:撰写和发送相关的请求给HttpClient
,而不关心和知道它的内部实现。
我自己总是遵循这种模式,并且更喜欢聚合而不是继承。同样值得注意的是,这种结构更容易理解和使用。
另一个好处是,如果你想装饰你的服务,你可以很容易地用聚合来做,但是用继承就不那么容易了。
注:另一个好处是可测试性。如果您继承HttpClient
,那么编写不执行实际请求的单元测试将相当困难。另一方面,如果您注入HttpClient
,您将能够在单元测试期间模拟它,尽管在这种情况下,您需要确保HttpClient具有一些可以使用的抽象基类或接口。否则,你需要自己抽象HttpClient
,即创建MyHttpClient : IHttpClient
并包装所有需要真正的HttpClient
的调用。