继承与聚合

Inheritance Vs Aggregation

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

例如:

    private async Task<HttpResonseMessage> getPresenceAsync() {
          string url="/xxx/yyy/zzzz";
          HttpResponseMessage httpResponse=await httpClient.GetAsync(url);
          return httpResponse;
    }

在这种情况下,这将是一个好的设计决策:让 ServerClients 扩展 HttpClient 或让 HttpClient 作为 服务器客户端?

我指的是下面的 link,我个人认为聚合会是更好的选择,因为我不会使用 HttpClient Class 中的所有方法。

Inheritance vs. Aggregation

任何不同的 perspective/help 表示赞赏。

谢谢!

我建议您使用聚合而不是继承来遵循单一职责原则。此外,我会在构造函数中注入 HttpClient 。这样你的 ServiceClient 只会做一件事:编写相关请求并将其发送到 HttpClient 而不会关心和了解它的内部实现。

我自己总是遵循这种模式,更喜欢聚合而不是继承。还值得注意的是,这种结构更易于理解和使用。

另一个好处是,如果您想装饰您的服务,可以通过聚合轻松实现,但通过继承就没那么容易了。

P.S。您获得的另一个好处是可测试性。如果您继承自 HttpClient,那么编写不执行实际请求的单元测试将相当困难。另一方面,如果你注入 HttpClient,你将能够在单元测试期间模拟它,但在这种情况下你需要确保 HttpClient 有一些抽象基础 class 或你可以使用的接口.否则,您需要自己抽象 HttpClient,即创建 MyHttpClient : IHttpClient 并包装您需要的所有调用以实现 HttpClient.