Repository模式

最近開發的MVC項目使用了Repository模式。

啥是Repository模式?

這裏寫圖片描述

從圖看,有一個倉庫接口,一個實現了這個倉庫接口的基類;然後在使用方,一方面,要聲明一個繼承於倉庫接口的子接口,另一方面,編寫一個數據庫操作類,繼承倉庫基類,並實現這個子接口。

繼承倉庫基類容易理解,爲啥還要搞一個子接口呢?直接實現倉庫接口不就完啦?思考其中原因,應該是爲了控制反轉,依賴注入,總之一個類對應一個接口就是了。

Repository模式意義何在呢?

Repository模式是一箇中間層,位於 數據庫映射層 和 領域層(業務邏輯層)之間。本來嘛,ORM或者DAL已經爲我們隔離了數據庫,BLL並沒有直接訪問數據庫,如果數據庫更換,那改寫ORM或DAL即可。那麼現在又增加一層Repository,目的何在呢?

摘錄一些話,姑妄聽之。反正他們牛逼,怎麼說都行:

Repository 是一個獨立的層,介於領域層與數據映射層 (數據訪問層) 之間。它的存在讓領域層感覺不到數據訪問層的存在,它提供一個類似集合的接口提供給領域層進行領域對象的訪問。Repository 是倉庫管理員,領域層需要什麼東西只需告訴倉庫管理員,由倉庫管理員把東西拿給它,並不需要知道東西實際放在哪。(咦,難道DAL\ORM不是這樣的嗎?) 
Repository 模式是架構模式,在設計架構時,纔有參考價值; 
Repository 模式主要是封裝數據查詢和存儲邏輯; 
Repository 模式實際用途:更換、升級 ORM 引擎,不影響業務邏輯; 
Repository 模式能提高測試效率,單元測試時,用 Mock 對象代替實際的數據庫存取,可以成倍地提高測試用例運行速度。

這幾句話中,好像亮點在於換ORM,比如將NHibernate換成EF,BLL也不受影響。呵呵。

也有一些鑽研者自我安慰: 
使用Repository,隱含着一種意圖傾向,就是 Domain需要什麼我才提供什麼,不該提供的功能就不要提供,一切都是以Domain的需求爲核心;而使用Dal,其意圖傾向在於我Dal層能使用的數 據庫訪問操作提供給Business層,你Business要用哪個自己選。換一個Business也可以用我這個Dal,一切是以我Dal能提供什麼操 作爲核心。

也有後起之秀頓悟: 
倉儲模式最大的優點就是所有的數據訪問首先是通過倉庫的,對倉庫的增刪改都不會立即提交到數據庫,而只有當調用了倉庫包裹器,這些增刪改的操作纔會一次提交到數據庫。

但我怎麼看,都看不出這個批量提交、倉庫包裹器與Repository有什麼關係。


今天看到一種隱隱約約的說法,說資源庫(大概就是Repository模式吧)有個好處,就是可以兼容緩存。BLL通過資源庫來存取數據,而不必知道這些數據是來自於數據庫還是緩存。

發佈了40 篇原創文章 · 獲贊 16 · 訪問量 36萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章