2015-06-07 84 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'关联起来工作等等。 –

相关问题