2017-08-06 117 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代替。 –