我正在使用第三方HTTP客户端进行GET,POST调用。我不想将我的代码绑定到这个库。所以我决定创建一个名为HttpClient的接口和一个名为HttpClientImpl的实现。从第三方库解耦
一个在接口中的方法是:
Response get(String url);
从接口返回响应对象是从第三方库中的对象。所以这在技术上不会将我的代码与第三方库解耦。
什么是解耦自己的最佳方法?我应该创建自己的响应对象来包装第三方库的响应吗?
我正在使用第三方HTTP客户端进行GET,POST调用。我不想将我的代码绑定到这个库。所以我决定创建一个名为HttpClient的接口和一个名为HttpClientImpl的实现。从第三方库解耦
一个在接口中的方法是:
Response get(String url);
从接口返回响应对象是从第三方库中的对象。所以这在技术上不会将我的代码与第三方库解耦。
什么是解耦自己的最佳方法?我应该创建自己的响应对象来包装第三方库的响应吗?
这是Mediator设计模式的经典案例: 使用HTTP客户端的类不应该暴露给HTTP客户端实现(您已经封装)或其响应对象。
这里使用泛型不会阻止使用类在这种情况下知道响应类。
正如你所建议的 - 有一个包装响应类/有一个转换器从第三方响应到你自己的。
取代了抽象的http库,你有没有考虑抽象你通过Http访问的存储库?比方说,你有宁静的端点推文:
GET https://someapi.com/Tweets
GET https://someapi.com/Tweets/{id}
POST https://someapi.com/Tweets
PUT https://someapi.com/Tweets/{id}
DELETE https://someapi.com/Tweets/{id}
这将是有意义的有TweetRepository
类,它可以创建,读取,更新和删除鸣叫。这个类的界面看起来可能像下面这样:
public interface TweetRepository {
public List<Tweet> get();
public int add(Tweet tweet);
public void remove(int id);
public Tweet get(int id);
public void update(int id, Tweet tweet);
}
如果你的控制器使用的接口,那么你可以让你想不引入任何连接HTTP库的实现中使用。
这是有效的。但是,如果HTTP库不是抽象的,那么存储库的底层实现仍将紧密结合。 – tattihead
@tattihead如果你想从第三方库中分离出所有代码,生活将会变得很悲惨。安德鲁的建议很好。 (除了编码标准的资本方法名称的伪造)。 – MeBigFatGuy
对不起,我最近一直在使用很多C#。我不得不将它称为“ITweetRepository”。 @tattihead是的,http实现将取决于_some_ http库,如果它不能实现,怎么实现?但是,将实现放置在接口后面时,会阻止使用实现的代码耦合到库。您可以轻松将其替换为连接到数据库的TweetRepository,并使用Sql代替。 –
https://github.com/OpenFeign/feign –
为什么不使用'T get(String)'?然后,您可以在需要时指定'Response'作为类型参数。你也可以创建你自己的包装类型。 –