我正在使用第三方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'作爲類型參數。你也可以創建你自己的包裝類型。 –