2017-08-06 132 views
0

我正在使用第三方HTTP客户端进行GET,POST调用。我不想将我的代码绑定到这个库。所以我决定创建一个名为HttpClient的接口和一个名为HttpClientImpl的实现。从第三方库解耦

一个在接口中的方法是:

Response get(String url); 

从接口返回响应对象是从第三方库中的对象。所以这在技术上不会将我的代码与第三方库解耦。

什么是解耦自己的最佳方法?我应该创建自己的响应对象来包装第三方库的响应吗?

+0

https://github.com/OpenFeign/feign –

+1

为什么不使用'T get(String)'?然后,您可以在需要时指定'Response'作为类型参数。你也可以创建你自己的包装类型。 –

回答

1

这是Mediator设计模式的经典案例: 使用HTTP客户端的类不应该暴露给HTTP客户端实现(您已经封装)或其响应对象。

这里使用泛型不会阻止使用类在这种情况下知道响应类。

正如你所建议的 - 有一个包装响应类/有一个转换器从第三方响应到你自己的。

1

取代了抽象的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库的实现中使用。

+0

这是有效的。但是,如果HTTP库不是抽象的,那么存储库的底层实现仍将紧密结合。 – tattihead

+0

@tattihead如果你想从第三方库中分离出所有代码,生活将会变得很悲惨。安德鲁的建议很好。 (除了编码标准的资本方法名称的伪造)。 – MeBigFatGuy

+0

对不起,我最近一直在使用很多C#。我不得不将它称为“ITweetRepository”。 @tattihead是的,http实现将取决于_some_ http库,如果它不能实现,怎么实现?但是,将实现放置在接口后面时,会阻止使用实现的代码耦合到库。您可以轻松将其替换为连接到数据库的TweetRepository,并使用Sql代替。 –