Dryioc 和多线程

Dryioc and multiple threads

我想使用 dryioc 来管理多线程所需的依赖关系。我想启动线程传递每个需要 ioc 解决依赖关系的作业。不确定理想情况下这应该是什么样子,感谢任何帮助。

如果您需要将服务范围限定为一个线程(每个线程一个实例),则为容器设置 ThreadScopeContext

RootContainer = new Container(scopeContext: new ThreadScopeContext());

RootContainer.Register<IService, MyService>(Reuse.InCurrentScope);

// in your thread
using (RootContainer.OpenScope())
{
    var service = RootContainer.Resolve<IService>();
    // use the service
}

如果您需要服务在新线程中启动,但随后通过 async/await 调用(可能在不同线程上)传播相同的实例,请使用 AsyncExecutionFlowScopeContext.

DryIoc 中的范围上下文是第三方对象,独立于容器,您可以在其中存储开放范围,例如在线程静态或 AsyncLocal 变量中。

另一种方式(默认行为)是将开放范围与新范围容器相关联,但是您需要引用这个新容器才能解析。这里我没有使用任何范围上下文,但需要从 scopedContainer 而不是根目录解析:

RootContainer = new Container(); // without ambient scope context

RootContainer.Register<IService, MyService>(Reuse.InCurrentScope);

// in your thread
using (var scopedContainer = RootContainer.OpenScope())
{
    var service = scopedContainer.Resolve<IService>();
    // use the service
}