本篇部落格簡單描述了repository模式在oea中的應用。
不使用repository時的問題
oea框架中使用了ddd的思想,面向領域物件進行開發。在ddd中,有很多重要的概念,例如:聚合實體物件、值物件、倉儲、工廠、服務等。(不太了解的repository和ddd的朋友,可以看evans寫的《domain driven design》。)
在oea中,實體的實現框架使用了csla分布式框架。原來為了簡單並保持和csla開發模式的相容,一直都把實體的獲取模式直接以靜態方法的方式直接寫在實體的對應列表類中。例如下面這段**:
隨著應用的慢慢深入,出現了一些問題:
不易支援客戶化。oea是基於產品線的開發,如果採用前面的開發模式,當客戶化版本擴充套件了主幹版本中的實體類時,由於主幹版本中的**直接使用靜態方法,所以無法獲取到擴充套件後的新型別的物件。(要了解oea中客戶化的具體方案,見《基於oea框架的客戶化設計(一) 總體設計》)
為了使用csla而寫的這些獲取**,在以後引入非csla實體時,可能都需要重寫。
ddd的思想在**中無法直接體現,使得對系統的理解和學習容易產生二意。
由於使用了靜態方法,所以一些通用的**的重用變得比較過程化,不易讀。
基於以上的原因,團隊決定使用repository模式進行**的重構。
repository如何解決以上問題
如何支援客戶化
當客戶版本以繼承的方式使用子類b擴充套件了主幹版本的實體類a後,主幹版本中原有的**雖然是面向父型別a的,但是此時其操作的物件應該動態地變為擴充套件後的子類b。使用repository模式,我們在主幹版本中通過repository工廠找到需要的型別a的repository,然後通過它獲取具體的物件集合並進行操作。當擴充套件後,主幹版本中同樣的**再次通過repsotoryfactory獲取a的repository時,得到的其實是子類b的repository,這樣,它獲取出來的物件集合都是b的列表。這樣,就實現完全的型別擴充套件,而且主幹中的**不需要任何的改變。
而一旦實體類被動態擴充套件,相應的資料層和介面也就被oea框架自動地進行了調整。
由於repository其實是承擔了原來的靜態方法的職責,也就是實體物件的cduq,這些方法現在都變為元狀態的repository的例項方法。這樣,通過繼承的方式就能很好的實現**的重用。同時,我們可以在repository中管理一些整個實體型別的資訊,例如某個實體類a的所有屬性列表元資料。
由於repository模式比較通用,其它實體框架都能比較容易地實現它,所以這樣也為oea以後替換為其它實體框架提供了可能。
具體的看一下類圖:
可以看出,整個結構比較簡單:
repositoryfactory通過entityconvention來檢測命名約定,並構建需要的entityrepository。
元狀態的entityrepository對entity和entitylist進行管理(cduq)。
實體類不依賴repository,而是依賴ilazyprovider介面來實現引用物件或子物件的懶載入。通過ilazyprovide***ctory來找到想要的懶載入提供器。
entityrepository提供ilazyprovider的實現,repositoryfactory 提供 ilazyprovide***ctory的實現。
具體的repositoryfactory 被依賴注入到 entity 層中,並被dihost儲存起來。
小結
在oea中使用repository模式重構後,到目前為止已經使用了乙個月左右,大家反應比起原來的呼叫模式好多了,同時還支援了客戶化及其它實體框架引入的可能。總體上來說,重構還是比較成功的。
在以前其它的系統的開發中,基本上也都使用到了repository模式,這種模式在資料庫應用程式的開發中,確實十分常用。以後可以考慮對它進行一些通用框架層面的設計。
Repository 設計模式介紹
在ddd設計中大家都會使用repository pattern來獲取domain model所需要的資料。1.什麼事repository?按照最初提出者的介紹,它是銜接資料對映層和域之間的乙個紐帶,作用相當於乙個在記憶體中的域物件集合。客戶端物件把查詢的一些實體進行組合,並把它們提交給reposit...
Repository模式介紹彙總
1 linq to sql中repository模式應用場景 2 分享基於entity framework的repository模式設計 總結一下,repository在實際使用中,有下面三種特點 repository的共同性 有一些公共的方法 增刪改查 這些方法無關於repository操作的是哪...
GitHub的Repository的使用
前不久上課聽講座,才知道,svn已經開始過時,新一代的版本控制系統如github,mercurial已經悄然流行起來。作為乙個剛剛開始用新一代版本控制系統的小白,表示目前還沒有體會到第二代版本控制的優勢,使用步驟要比傳統svn複雜的多。寫個筆記記錄一下。安裝 無論github還是mercurial,...