2015-06-07 169 views
1

我使用工作單元和EF實現了通用存儲庫。如果工作單元包含所有存儲庫,您如何從另一個存儲庫調用存儲庫?

可以說我有需要使用ProductRepository其體內的CustomerRepository。

問題是我使用Unit of Work實例來調用任何特定的存儲庫, 所以爲了在CustomerRepository中調用ProductRepository,我需要將存儲庫中的Unit of Work實例傳遞給我,這看起來像一個大代碼味道給我,因爲UOW原本就是這樣,並且首先調用存儲庫。

什麼是最好的辦法,如果我需要調用另一個倉庫內存儲庫? (考慮Uow類有他們兩個)?

+1

我不認爲,理想情況下,你應該回購的UOW內瞭解海誓山盟。也許重構到一個存儲庫,或將該調用拉入它自己的存儲庫? – Jonesopolis

+0

同意@Jonesy,使用IoC很容易解決,但根本問題是另一回事。 –

+0

你如何用IoC解決它? – Tanuki

回答

0

就我而言,我實現我所說的域轉換模式

我工作的單位叫做01​​一個額外的方法和它的簽名是這樣的:

IUnitOfWork<TDomainObject> TransitionTo<TDomainObject>() 

由於控制的反轉,我實現和獲得工作的具體技術單位和使用信息庫容器像溫莎城堡。例如,實體框架將具有EFUnitOfWorkEFGenericRepository實現,以及什麼表示實體框架世界內的事務?The DbContext

工作單元啓動域操作是實例化並擁有基礎DbContext的單元。在單位工作TransitionTo方法必須得到落實工作的一個特定的技術單位,也必須注入(依賴注入!)工作的基本DbContext幕後以前的單元。 也就是說,下一個工作單元可以積累新操作,作爲高級域名交易的一部分!

整個模式的僞代碼看起來像下面的代碼:

// Unit of work also implements IDisposable so "using" blocks can be used 
// to discard changes if code doesn't commit changes 
using(IUnitOfWork<T> uow1 = ...) 
{ 
    // Some stuff like accessing unit of work's repository... 

    // Then, here's the domain transition to other unit of work: 
    using(IUnitOfWork<T2> uow2 = uow1.TransitionTo<T2>()) 
    { 
      // Some other stuff using uow2 

      using(IUnitOfWork<TN> uow3 = uow2.TransitionTo<TN>() 
      { 

      } 

    } 

    await uow1.CommitAsync(); 
} 

通過這種方式,可以實現高層次的域名交易,讓你的代碼是從基礎數據映射技術100%不可知(實體框架,NHibernate,Dapper)。

+0

一個非常有趣的方法。我沒有想到實例化其他UOW。然而,你究竟怎麼注入從uow1到uow2的DbContext?你能否提供TransitionTo的實現? – Tanuki

+0

@Tanuki SO不是一個編碼服務....順便說一句,我可以給你一個提示:你的工作單元應該有一個關聯的'DbContext',因此,當你使用'TransitionTo'方法創建一個新的工作單元時,你只需將前一個單元的'DbContext'關聯起來工作等等。 –

相關問題