0

我在 SO 上看到很多 Q/As 说使用 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))

或者,还有更好的方法?

4

1 回答 1

1

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

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

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

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

于 2012-06-25T10:05:00.497 回答