在我的应用程序中,我有一个Mediator处理程序,它通过DI注入了DBContext
和2个服务。这些服务中的每一个都有自己的DBContext
,也通过DI注入。
我有没有办法在单个EF Core事务中执行处理程序和服务中执行的所有工作?
我能想到的唯一方法是处理程序新建每个服务,并将其DBContext
的实例传递给每个服务,然后在处理程序结束时调用SaveChanges
。这是可行的,但我想知道是否有更好的方法可以让我不必自己实例化每个服务。
我认为您正在寻找工作单元模式。在本例中,您将创建一个工作单元对象,该对象具有对DbContext的引用。在任何地方,您都可以注入您的工作单元,而不是DbContext。由于这是同一范围内的同一对象,因此您的所有服务也将使用相同的DbContext引用。对SaveChanges()
的调用也会同时影响多个表。
这似乎是一个很好的链接:https://cpratt.co/repository-and-unit-of-work-patterns-with-entity-framework/
您可以通过制作注入到服务中的单例处理程序来实现这一点。
你想做的是你不能做的事情!首先,跨多个服务的操作往往需要时间,这意味着您的交易将打开一段时间。第二,如果客户中断并且没有完成操作链,您的交易将保持开放状态。第三,您将很难处理并发操作。
一种更好的方法是通过将数据存储在一个临时标志中来模拟事务,该标志在最后被清除,或者在需要回滚时用于删除记录。