继承与聚合
Inheritance Vs Aggregation
我正在做一个项目,我需要调用 REST API。 API 的端点位于具有三个不同基地址的三个不同服务器上。
我正在使用 System.Net.Http.HttpClient
class 来模拟 HTTP 客户端。
我计划拥有三个不同的 HTTP 客户端,每个服务器一个,因为基址不同。我们将它们命名为 ServerClient1、ServerClient2 和 ServerClient 3.
- 这三个客户端将使用
HttpClient
class 中的方法,但必须实现他们自己的方法来处理来自服务器的 HttpReponse
。
例如:
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
.
我正在做一个项目,我需要调用 REST API。 API 的端点位于具有三个不同基地址的三个不同服务器上。
我正在使用
System.Net.Http.HttpClient
class 来模拟 HTTP 客户端。我计划拥有三个不同的 HTTP 客户端,每个服务器一个,因为基址不同。我们将它们命名为 ServerClient1、ServerClient2 和 ServerClient 3.
- 这三个客户端将使用
HttpClient
class 中的方法,但必须实现他们自己的方法来处理来自服务器的HttpReponse
。
例如:
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
.