适用于 EF5 的 Unity 生存期管理器,具有多线程和存储库模式



我在SO上看到了很多问/答,说使用EF进行线程处理可能很困难。

我遇到的场景是 Web API 将数据库中的作业排队。Windows 服务(目前实际上是控制台应用)选取这些作业,在多个线程上运行它们并将结果存储在数据库中。

我目前正在使用存储库模式,最初尝试仅使用主线程来更新数据库。这是行不通的,因为工作比主线程更新数据库的速度快得多 - 特别是如果有很多结果(数万个)。

下一个方法是转到每个线程的上下文,我可以通过更改容器上的生命周期管理器来轻松做到这一点,但这(大概)会导致并发问题,其中工作线程将作业状态更新为"完成"但主线程不知道,因为它的缓存副本仍在"进行中"。

我想下一个方法是每个请求都有上下文,但我担心会有很多设置/拆卸 - 尤其是有很多线程并排运行。无论如何,我会试一试,看看它有多好/多坏。

假设最后一个选项是要走的路,我如何让 Unity 解决每个逻辑请求的相同上下文?也就是说,如果我这样做...

Dim UnitOfWork = Container.Resolve(Of IUnitOfWork)
Dim UserRepo = Container.Resolve(Of IUserRepository)
Dim RoleRepo = Container.Resolve(Of IRoleRepository)
''Do Stuff
UnitOfWork.Commit

我需要所有对象使用相同的上下文。我是否需要滚动自己的终身管理器并为每个组使用独特的内容(例如新的 Guid)

Dim Key = Guid.NewGuid
Dim UnitOfWork = Container.Resolve(Of IUnitOfWork)(New MyLifetimeManager(Key))
Dim UserRepo = Container.Resolve(Of IUserRepository)(New MyLifetimeManager(Key))

还是有更好的方法?

不,您只需要一个顶级对象即可解析,该对象将成为其他对象的提供者。例如:

public interface IDalProvider
{
    IUnitOfWork { get; }
    IUserReposiotry { get; }
    ...
}

此接口的实现将由 Unity 解决。是让实现实际创建实现,还是通过依赖注入传递它们,这取决于您。

在前一种情况下,您将上下文实例注入提供程序实现,并在构造工作单元和存储库实例时在内部使用它。在后一种情况下,您将上下文实例直接注入工作单元和存储库实现,并且您将对上下文、uow 和存储库使用每解析生存期(同一实例将在单个解析中注入到所有依赖对象)。

最新更新