2011-03-25 64 views
4

我一直在閱讀,現在已經看到工作單元模式的兩種不同的實現。第一種模式是將Repository與工作單元交談到一個域對象。工作單元:由服務層或存儲庫層創建/管理? C#/。NET

Unit of Work Repository called

其他實施具有服務層註冊的域對象的修改:

Unit of Work Service Layer called

我想我的問題是,有什麼好處/缺點每個?我知道,在爲存儲庫/映射器/等提供一些實現代碼的情況下,這很重要,但總的來說,究竟是誰/究竟應該爲UoW「升級」然後使用它負責?

我的想法是,如果你讓庫處理它,應該作爲注射接口庫(一個或多個),因此同樣UOW可以跨越多個存儲庫(也稱爲多域對象)提供...

如果服務層處理它,那麼每個服務層調用(例如,ServiceLayer.AddCustomer(customer))只有一個UoW實現是「卡住」的。

在網絡世界中,我看不到多個服務層被稱爲不同的域對象......但也許我可以在非網絡世界。

我想象最終必須調用「commit()」,所以最好將它綁定到服務層。

謝謝, 邁克

回答

1

由於語義是基於狀態而不是顯式的「加載/保存/刪除」操作,因此向客戶端公開UoW通常比使用存儲庫對存儲實現的抽象更強。另一方面,明確性允許客戶更好地控制通過使用規範等實際發生的事情。

IMO沒有「正確的」方法,選擇最合適的模式實際上取決於應用程序的數據流和持久層約束。

幾個thoughts-

  1. 阿庫典型地管理單個aggreggate根,而UOW可以覆蓋多個。理想情況下,UoW應該是持續不可知的(因爲它主要處理對象狀態,如變更跟蹤)。您的映射器顯然將針對您的存儲實施量身定製。但其他存儲問題/責任在哪裏解決?倉庫通常是答案。

  2. Repository模式可以更容易地(通過添加新的方法)(關於動態代碼例如調用在某些情況下一個存儲過程代替),或調整內部實現

與專門語義保存液延伸對於具有直接和均勻存儲要求的應用,直接揭示UoW可能是一個更簡單的模型。對於更復雜的環境(例如混合使用動態SQL和sprocs,傳統模式等),Repository更易於維護和擴展,代價是使用起來更加嚴格。

這是關閉我的頭頂,希望它可以幫助...

+0

感謝這兩個偉大的答案。我知道它會歸結爲「根據您的應用程序需要」,但我只是想圍繞它開始討論。我經常發現,如果沒有真正意識到爲了獲得具體的工作方式而必須「放棄」的東西,那麼就很容易深入實施這些東西。再次感謝你們! – 2011-03-28 14:41:03

1

即使在一審中,你的UnitOfWork將最有可能是個單(每線程),這樣,即使一個CustomerRepository和OtherBoilerplateExampleRepository之前提交時,一個都訪問的UnitOfWork提交仍將使用所有存儲庫所做的所有更改。

這就是說,我認爲第一種模式是更乾淨的方式。第二種說法是,CustomerService必須同時處理業務對象,並使用UnitOfWork註冊更改。這違反了關注點的分離。此外,這些示例中未顯示,但Repository模式也提供了緩存數據對象的位置。

至於注入依賴關係,我認爲不是讓UoW成爲一個可注入的接口,而是使Mapper模式(在第二個例子中看到的,但大概在第一個例子中暗示)注入是更合適的選擇。無論您使用的是SQL DB,XML文件等,UoW事務管理功能都應該保持不變。