我正在尝试在 Parallel ForEach 循环中学习不引用组合根但基于组合根中引用的组件创建线程组件的正确方法。
这是组合根代码:
var builder = new ContainerBuilder();
builder.RegisterType<OperationFiscalCalendarSql>().As<IOperationCloser>().InstancePerDependency();
builder.RegisterType<SQLMessagePoller>().As<IMessagePoller>().SingleInstance();
...
var container = builder.Build();
using (var scope = container.BeginLifetimeScope())
{
...
}
这是在具有 foreach 循环的轮询器对象中引用的代码:
Parallel.ForEach(messageHeaders, new ParallelOptions { MaxDegreeOfParallelism = _maxDegreeOfParallelism }, messageHeader => {
...
var sapCloser = new OperationFiscalCalendarSql(closeObj, repostiory);
...
});
注意我想要一个 IOperationCloser 的实例,而不是硬编码一个"new"的 OperationFiscalCalendarSql 对象。
我了解构造函数注入(inject)我只是不知道在任何类型的循环中如何注入(inject) IOperationCloser。
最佳答案
您可以在 Poller
中注入(inject)工厂带有 Func<IOperationCloser>
的对象然后在 ForEach
中获取一个新实例环形。
在您的情况下,创建自己的 ILifetimeScope
可能会更好。 .你可以通过注入(inject) ILieetimeScope
来做到这一点。在 Poller
然后调用BeginLifetimeScope
和 Resolve
在循环。
Parallel.ForEach(messageHeaders, ..., m => {
using(ILifetimeScope childScope = scope.BeginLifetimeScope()){
var param1 = new TypedParameter(m);
var closer = childScope.Resolve<IOperationCloser>(param1);
});
});
关于multithreading - 在 Parallel.Foreach 循环(线程)中创建组件时保持组合根,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55692701/