继承Vs聚合



我正在做一个项目,我需要调用一个REST API。API的端点位于三个不同的服务器上,具有三个不同的基址。

  • 我正在使用System.Net.Http.HttpClient类来建模HTTP客户端。

  • 我计划有三个不同的HTTP客户端,每个服务器一个作为基址是不同的。我们将它们命名为ServerClient1ServerClient2ServerClient 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的调用。

最新更新