3

我正在用EF4構建使用服務層/存儲庫/工作單元模式的MVC應用程序。服務層/存儲庫模式

我對邏輯有些困惑。我知道問題的關鍵是解耦系統,但我有點困惑。

因此,MVC控制器調用服務來填充視圖模型。那麼可以肯定的說MVC應用程序與服務層耦合了嗎?

然後服務層調用存儲庫來獲取和保存對象。那麼說服務層依賴於Repository是安全的嗎?

存儲庫利用EF4獲取並持久數據到SQL服務器,所以我會假設存儲庫依賴於EF4,而EF4依賴於SQL Server。

哪裏工作單位都格格不入。

任何的例子嗎? 謝謝!

回答

4

我開始在較低層的某個地方隱藏工作單元,但這樣做是錯誤的。經過一些經驗,我的意見是:

  • 如果是monolitic應用程序UnitOfWork應該可以由Controller和低層訪問。
  • 如果是分佈式應用程序(UI和BL在不同的服務器上)UnitOfWork應該可以被業務層門面(用於遠程調用的服務層)和較低層訪問。

原因是上述圖層定義什麼是「業務交易」=什麼是當前工作單元。只有該層知道何時將更改提交到數據存儲。這樣做可以實現服務組合(代碼重用)。我討論了類似的問題herehere

3

山姆,

朱莉·勒曼做了DNR電視良好的截屏,談論this,也有另一種屏幕上投9頻道,圍繞創建並在測試庫EF​​。

與這些相關的一般東西是在Nhibernate中創建工作單元的抽象,它將是Session,在EF中將是您的上下文並將該會話或上下文傳遞到您的存儲庫中,作爲測試的一部分,您可以僞造連接使用一個名單的名單。

希望這些幫助。

Iain

1

您在分層上的假設是正確的。你的EF上下文是工作單元。通常你會通過一個接口將它抽象出來,然後構造器將每個Repository注入到CRUD操作中。另一種方法是在UoW界面上公開你的倉庫(我更喜歡前者)。無論哪種方式都可以更輕鬆地對每層進行單元測試。然後,從服務層單次調用UnitOfWork上的Save,將會保留所有存儲庫中的所有更改。

這裏的a nice article on MSDN從單元測試的角度來看待UoW,但也涵蓋了知識庫。從MVC控制器引用存儲庫的位置,您將擁有另一箇中間服務層。