gpt4 book ai didi

c# - 如果工作单元包含所有存储库,如何从另一个存储库调用存储库?

转载 作者:行者123 更新时间:2023-12-05 07:54:57 25 4
gpt4 key购买 nike

我使用工作单元和 EF 实现了通用存储库。

假设我有一个 CustomerRepository,需要在其主体内使用 ProductRepository。

问题是我使用工作单元实例来调用任何特定的存储库,因此,为了在 CustomerRepository 中调用 ProductRepository,我需要在该存储库中传递工作单元实例,这对我来说看起来像一个很大的代码味道,因为 UOW 最初拥有并首先调用存储库。

如果我需要在另一个存储库中调用存储库,最好的方法是什么? (考虑到 Uow 类都有它们)?

最佳答案

在我的例子中,我实现了我称之为域转换模式的东西。

我的工作单元有一个名为 TransitionTo 的附加方法,其签名如下所示:

IUnitOfWork<TDomainObject> TransitionTo<TDomainObject>()

感谢 控制反转,我使用像 CaSTLe Windsor 这样的容器实现并获得特定于技术的工作单元和存储库。例如, Entity Framework 将有一个 EFUnitOfWorkEFGenericRepository 实现,什么代表 Entity Framework 世界中的事务? DbContext

启动域操作的工作单元是实例化并拥有底层DbContext 的单元。 工作单元中的TransitionTo 方法必须获得技术特定的工作单元实现,并且它还必须注入(inject) (依赖注入(inject)!)前一个工作单元的底层 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% 不受底层数据映射技术( Entity Framework 、NHibernate、Dapper)的影响。

关于c# - 如果工作单元包含所有存储库,如何从另一个存储库调用存储库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30697988/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com