2

我有一個看起來像這樣的解決方案:的UnitOfWork作爲存儲庫集裝箱

PROJECT1 < —>共享項目< —> Project2的

共享的項目是不是單機,它暴露它通過服務層對其他項目具有功能,該服務層接受由另外兩個項目注入構造函數的IUnitOfWork:

public SharedService (IUnitOfWork unitOfWork) 
{ 
    ... do stuff ... 
} 

我遇到的問題是,PROJECT1和Project2的具有重疊但不同的一組存儲庫:

PROJECT1: SharedRepository,RepositoryA,RepositoryB ...

Project2的: SharedRepository,RepositoryX,RepositoryY ...

我一直在看到implementations of Unit Of Work它承擔着作爲存儲庫容器的角色 - 您繞過UoW,然後通過公開屬性訪問存儲庫:

unitOfWork.SharedRepository.GetSomething(); 

這種做法的後果是,你最終對你的工作單位一個界面,看起來像這樣:

public interface IUnitOfWork 
{ 
    ISharedRepository SharedRepository(); 
    IRepositoryA RepositoryA(); 
    IRepositoryB RepositoryB(); 
    IRepositoryX RepositoryX(); 
    IRepositoryY RepositoryY(); 

    ... etc ... 
} 

這裏是我遇到麻煩:接口IUnitOfWork現迫使Project1和Project2實施其他存儲庫。 因此,在我看來,將工作單元用作存儲庫的容器可能是一個有缺陷的概念。

我已經想到一些可能的替代品:

1)中斷IUnitOfWork到3份(IProject1UnitOfWork,IProject2UnitOfWork,ISharedUnitOfWork),然後讓該服務層接受ISharedUnitOfWork參數。似乎混亂,但它可能會奏效。

2)將UnitOfWork變成一個類似於服務定位器的地方,它維護一個存儲庫集合,並且註冊你需要的東西。 UoW的使用者然後檢索它需要的任何存儲庫。

3)有工作和庫注入到服務層構造獨立於單位:

public SharedService (IUnitOfWork unitOfWork, ISharedRepository repository) 
{ 
    ... do stuff ... 
} 

如何將你們處理這樣的局面呢?我傾向於選項#3。它需要傳遞更多的東西,但替代品看起來不那麼優雅。

+0

什麼是...做的東西...做的單位工作? – kzhen 2013-03-14 14:21:18

+0

服務層修改存儲庫中的數據。工作單元用於協調並將這些更改提交到數據庫。 – RogerMKE 2013-03-15 01:12:44

回答

1

因此,在我看來,使用工作單元作爲存儲庫的 容器的方法可能是一個有缺陷的概念。

對我來說也是如此。你的例子中的工作單元也是一個僞服務定位器(它通常被認爲是反模式),因此它違反了SRP。 UoW僅僅是一個你想要放置的用例的事務包裝器,它不應該知道任何關於存儲庫或者用例中的任何東西。

見梅德的回答有:How does unit of work class know which repository to call on commit?

所以,對我來說絕對是選項3。