Repository儲存庫模式 – Abhishek Chaudhary
Repository模式又稱為倉儲模式或儲存庫模式,替代以前的DAO模式:
儲存庫模式限制我們在應用程式直接使用資料庫的資料,併為資料庫操作,業務邏輯和應用程式的UI建立新層。
它是軟體設計模式的一部分。但是,當我們可以直接編寫程式碼時,為什麼這些模式如此重要?好吧,作為開發人員,當我們開始學習編碼時,我們單獨處理專案或大約2人,並且通常不打算在將來擁有更多功能/服務。
但是暫時認為你正在組建一個團隊來開發軟體,可能超過10-20個開發人員需要實現客戶端提供的一些功能。你開發軟體,測試並運送它,但,哦現在,客戶還有一些新的創新功能請求。但是應用程式程式碼是基於之前指定的某些資料/網路請求,那麼如何在不破壞舊功能的情況下新增新功能並確保團隊中的開發人員不會搞砸事情呢?
嗯,這就是事情,真的很難做到這一點,並且從新來源新增新服務非常普遍。
因此,我們需要開發能夠承受任何型別的新功能和資料來源的程式碼,並確保沒有開發人員打破流程。這就是使軟體健壯的原因,事實上,它可以實現可擴充套件性和可管理性,在組織中以前所未有的數量為您節省寶貴的資金。您可能已經聽過很多這樣的一個例子是MVP或MVVM模式,它確保每個開發人員遵循指定的模式並且不能破壞任何東西,因此是可擴充套件的。
它是如何工作的?
什麼儲存庫模式呢?正如我所提到的,我們從網路,資料庫等來源收集資料,或者事實上我們可以使用使用者裝置內的資料。您可能擁有一個具有良好API的網路服務,但如果您需要像Live Feed或Google Analytics一樣新增新API,該怎麼辦?
有一個新的資料來源,我們需要使它與舊的資料來源一起使用。如果網路不可靠並且您無法向用戶顯示該怎麼辦?
嗯,這就是儲存庫實現的目的,它將資料層與實現層或UI層分開。
資料層本身被劃分為不同資料來源的抽象節點,最重要的是在儲存庫模式資料庫中被視為單一的事實來源。
這意味著無論資料來自何處(如網路),它總是先新增到資料庫然後用於任何其他目的,因為資料庫在提供資料方面是安全可靠的(即 I / O) 。
因此,我們可以提出我們想要的任何網路請求,將其儲存在資料庫中,然後在我們的軟體中使用該資料。
現在已經足夠了,但讓我們關注如何。因此,我將向您展示我在我自己的Android應用程式中使用的Google文件中使用的儲存庫模式示例,該應用程式稱為新聞應用程式。
如上所示,資料來自使用Retrofit的API ,也來自使用Room的本地資料庫。我正在使用 NewsAPI 獲取新聞資料並將其儲存在本地資料庫中,包括使用者儲存的故事。
儲存庫根據需要提供來自適當源的資料,在我的情況下,我總是呼叫網路API,在此之前我顯示先前儲存在資料庫中的資料,因此如果請求失敗,資料仍然存在,並且一旦網路請求是成功更新資料庫,UI也是如此。
在這裡,我使用了 LiveData 作為返回型別,這樣無論何時資料庫更新,返回的物件都會收到更改通知。在getHeadlines()方法中,我檢查來自API的資料並顯示資料庫中的資料(如果存在)。當網路請求完成時,資料將新增到資料庫並通知LiveData。通過這樣做,我們確保不傳送任何不必要的網路請求,或者即使網路請求失敗也會向用戶顯示資料。
現在,如果我們想新增一個新的API,我們只需要向它新增網路呼叫,並且UI仍然不知道更改,因為儲存庫提供的資料與資料的來源無關,並始終確保返回型別。
好處:
如何在不更改方法簽名或傳遞到儲存庫的變數的情況下請求特定型別的資料。最好的方法是建立一個具有資料請求可能具有的所有相關規範的Specification類。在新聞應用程式中,它是新聞的類別,新聞來源國和文章的語言。因此,我將所有規範包裝在一個類中,並將其作為引數傳遞給儲存庫中的每個方法,從而確保固定的方法簽名。
可以在我的 Github 頁面上找到該應用程式的程式碼。如果您喜歡它,請檢視參考資料併為回購郵件加註星標。