继承与聚合

时间:2016-10-27 15:34:47

标签: c# rest api inheritance aggregation

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

  • 我使用<p style="font-family: Helvetica, Arial, sans-serif; font-size: 12px; line-height: 12px; color: #1f497d; margin-bottom: 10px;">&nbsp;</p> <p style="font-family: Helvectica, Arial, sans-serif; font-size: 12px; line-height: 12px; color: #1f497d; ">Kind regards,&nbsp;</p> <p> <br /> <span style="color: #00b0f0; font-family: Helvetica, Arial, sans-serif; font-size: 14px;"><strong>Full Name</strong></span> <br /> <span style="color: #1f497d; font-family: Helvetica, Arial, sans-serif; font-size: 12px"><strong>Company Name</strong></span></p> <p><span style="color: #1f497d; font-family: Helvetica, Arial, sans-serif; font-size: 12px">Direct: <span style="color: #e36c0a;">0207 201 <strong>1234</strong></span></span> <br /><span style="color: #1f497d; font-family: Helvetica, Arial, sans-serif; font-size: 12px"> Email: <a style="color: #1f497d;" href="mailto:email@email.co.uk">email@email.co.uk</a></span> <br /><span style="color: #1f497d; font-family: Helvetica, Arial, sans-serif; font-size: 12px"> Web: <a style="color: #1f497d;" href="http://www.website.co.uk/">www.website.co.uk</a></span></p> <p style="font-size: 0px; line-height: 0; font-family: Helvetica, Arial, sans-serif;">&nbsp;</p> 类来建模HTTP客户端。

  • 我打算有三个不同的HTTP客户端,每个服务器一个,因为基地址不同。我们将它们命名为 ServerClient1 ServerClient2 ServerClient 3

  • 这三个客户端将使用System.Net.Http.HttpClient类中的方法,但必须实现自己的方法来处理来自服务器的HttpClient

例如:

HttpReponse

在这种情况下,这将是一个很好的设计决策:让 ServerClients 扩展 private async Task<HttpResonseMessage> getPresenceAsync() { string url="/xxx/yyy/zzzz"; HttpResponseMessage httpResponse=await httpClient.GetAsync(url); return httpResponse; } 或让HttpClient作为 ServerClients的成员

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

Inheritance vs. Aggregation

赞赏任何不同的观点/帮助。

谢谢!

1 个答案:

答案 0 :(得分:1)

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

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

另一个好处是,如果你想要装饰你的服务,你可以通过聚合轻松地做到这一点,但继承并不那么容易。

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

相关问题