我有一個看起來像這樣的解決方案:的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。它需要傳遞更多的東西,但替代品看起來不那麼優雅。
什麼是...做的東西...做的單位工作? – kzhen 2013-03-14 14:21:18
服務層修改存儲庫中的數據。工作單元用於協調並將這些更改提交到數據庫。 – RogerMKE 2013-03-15 01:12:44