6

我正在構建一個MVC3應用程序,試圖使用IoC和構造函數注入。我的數據庫(目前爲止)大約有50個表。我使用EF4(w/POCO T4模板)作爲我的DAC代碼。我正在使用存儲庫模式,每個表都有自己的存儲庫。我的服務層中的服務類被注入到這些存儲庫中。爲服務層設計DI(構造函數注入)庫

問題:我的服務類越來越多,他們需要的存儲庫。在某些情況下,我正在接近10個儲存庫,並開始聞起來。

是否有一種常見的方法來設計存儲庫和服務類,使服務不需要這麼多的存儲庫?

這裏有我的想法,我只是不知道哪一個是正確的:

1)這是一個跡象,我應該考慮合併/編組我的倉庫到表中的相關部分,減少的數量或依賴庫每服務類別。但是,這種方法的問題在於它會使我的存儲庫膨脹並使其複雜化,並使我無法爲所有存儲庫(數據檢索/更新的標準方法)使用通用接口。

2)這是一個標誌,我應該考慮根據我的存儲庫(表格)將我的服務分成組。問題在於我的一些服務方法共享通用實現,並且在類之間打破這些方法可能會使我的依賴關係複雜化。

3)這是一個跡象,我不知道我在做什麼,並有一些根本錯誤,我甚至無法看到。

UPDATE:對於我如何實現EF4和資料庫的想法,請在CodePlex上this sample app(我用version 1)。然而,看看那裏(和這裏)的一些評論,看起來像我需要做更多的閱讀,以確保這是我想要採取的路線 - 聽起來可能不是。

+0

EF4或4.1?存儲庫模式和工作單元在4.1中的'DbContext'模板的上下文中構建(也許,可以對模板進行單線調整...) –

+0

EF4(不是4.1)。我應該考慮轉向4.1嗎?遷移有多難? –

+0

您需要拋棄舊的模板/模型代碼生成,並生成一個新模板,但類名相同。只需點擊幾下即可。你的上下文(也可能是數據集)上的一些基本方法將會中斷,這取決於你使用多少種方法來影響它們的影響程度。我相信這些將主要是文本上的變化,而不是交換出很多邏輯。 –

回答

6

Chandermani is right你的一些表可能不是核心領域類。這意味着除了單一類型的父實體之外,您不會搜索該數據。在這些情況下,您可以將它們視爲「複雜類型」而不是全面實體,而EF仍將照顧您。

我使用存儲庫模式,每個表都有自己的倉庫

我希望你沒有這些你自己從頭開始編寫。

EF 4.1已經實施the Repository PatternDbSet)和the Unit of Work patternDbContext)。舊版本也是如此,儘管通過將這些屬性更改爲IDbSet,可以輕鬆調整DbContext模板以提供乾淨的可模仿實現。

雖然我看過幾篇教程文章,但人們仍然在寫自己的文章。這對我來說很奇怪,因爲他們通常不提供理由,除了他們「實施存儲庫模式」這一事實。

爲訪問方法(如FindById)爲這些存儲庫編寫包裝會使訪問變得稍微容易一些,但正如您所看到的,付出的努力可能很少,可能回報很少。就個人而言,除非我發現有一些有趣的領域邏輯或複雜的查詢需要封裝,否則我甚至不會直接對IDbSet使用Linq

我的服務層中的服務類被注入到這些存儲庫中。

即使您選擇使用自定義查詢包裝,你可以選擇簡單地注入DbContext,並讓服務代碼實例,它需要的包裝。你仍然能夠嘲笑你的數據訪問層,你將無法模擬包裝代碼。儘管如此,我仍然建議你注入一些不太通用的東西,因爲複雜的實現正是你希望能夠在維護中進行分解的類型,或者用模擬代替。

+0

謝謝@Merlyn。我沒有使用4.1,所以我會考慮轉向它。現有的4.0實現不會太難嗎?即使是這樣,如果權衡是值得的,我仍然可能會這樣做。我的存儲庫目前使用模型的泛型繼承自基類:'UserRepository:Repository '。所以這只是對每個模型(表格)重複的單行聲明。我實際上使用SQL來編寫腳本,並將其複製/粘貼到文件中。但我沒有爲任何存儲庫做任何特定的事情。我會用更多的細節更新我的答案。 –

+0

那麼,我會試着解釋我的設計,但是意識到這對於我現在所需要的時間來說太複雜了(需要去工作)。我通過鏈接到我建模的應用程序來更新我的OP,但看起來我需要重新考慮這一點,因爲它現在正在得到一些負面報道。真棒。我希望我能找到一篇好文章,介紹使用EF4(.1)建立一個好的可測試MVC應用程序的基礎知識。這就是我在查看那篇文章時最初尋找的內容,但不幸的是,這看起來像是讓我走錯了路。 –

6

如果你看DDD Aggregate Root模式,並嘗試在這個角度看你的數據,你會意識到,許多表沒有獨立的存在。他們的數據僅在父母的情況下有效。他們的大部分操作都需要您獲取父項。如果可以將這些表分組並找到父實體\存儲庫,則可以刪除所有其他子存儲庫。將父母孩子關聯起來的複雜性直到現在您將在業務層中進行(假設您正在使用獨立回購檢索父母和孩子)不會轉移到DAL

重構服務界面也是一個可行的選擇,和任何常見的功能可以被移動到一個基類和/或可以被定義爲一種服務,它是由您所有的現有服務(是A和有A)

1

@Chandermani有一個關於聚合根的好點。存儲庫不應該需要與表格進行1:1映射。

獲取大量的依賴注入是一個很好的跡象,你的服務做得太多。遵循單一職責原則,並將其重構爲更易於管理的部分。

0

是您的服務寫入所有的存儲庫?我發現我的服務與存儲庫非常接近,它們提供了存儲庫公開的CRUD操作的業務邏輯。

+0

在大多數情況下,是的,但我的服務跨越國界的確有更復雜的情況。但是我這樣做是爲了讓我的控制器不那麼複雜,使一些更復雜的邏輯遠離控制器和服務。在某些情況下,我甚至會注入其他服務。例如,我的Discussion服務將Permission服務注入到它中,以便這些服務可以在提交討論前確保適當的授權。但也許這不是要走的路? –