我正在开展一个项目,我需要调用 REST API 。 API的端点位于三个不同的服务器上,具有三个不同的基址。
我使用<p style="font-family: Helvetica, Arial, sans-serif; font-size: 12px; line-height: 12px; color: #1f497d; margin-bottom: 10px;"> </p>
<p style="font-family: Helvectica, Arial, sans-serif; font-size: 12px; line-height: 12px; color: #1f497d; ">Kind regards, </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;"> </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
类中的所有方法。
赞赏任何不同的观点/帮助。
谢谢!
答案 0 :(得分:1)
我建议您使用聚合而不是继承来遵循单一责任原则。此外,我会在构造函数中注入HttpClient
。这样,您的ServiceClient
只会做一件事:撰写并向HttpClient
发送相关请求,而不关心并了解其内部实施。
我自己总是遵循这种模式,更喜欢聚合到继承。值得注意的是,这种结构更容易理解和使用。
另一个好处是,如果你想要装饰你的服务,你可以通过聚合轻松地做到这一点,但继承并不那么容易。
P.S。您获得的另一个好处是可测试性。如果从HttpClient
继承,那么编写不执行实际请求的单元测试会相当困难。另一方面,如果您注入HttpClient
,您将能够在单元测试期间模拟它,但在这种情况下,您需要确保HttpClient具有一些可以使用的抽象基类或接口。否则,您需要自己抽象HttpClient
,即创建MyHttpClient : IHttpClient
并将您需要的所有调用包裹到真实HttpClient
。