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
}
我想使用 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
}