multithreading - 在 Parallel.Foreach 循环(线程)中创建组件时保持组合根

标签 multithreading autofac

我正在尝试在 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然后调用BeginLifetimeScopeResolve在循环。

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/

相关文章:

vb.net - vb.net中使用后台工作程序进行多线程处理的最简单示例是什么

java - 在C++和Java内存模型的上下文中,单线程程序是否存在唯一的合法/有效执行?

c# - 如何确定 Autofac 在解析时使用哪个构造函数

c# - 如何使用 MySQL 配置流畅的 nHibernate

c# - Autofac - 通过工厂方法解析

asp.net-mvc - 使用 ASP.NET MVC 5 配置 Autofac

c# - 当其中一个下载线程终止时解锁 FIleStream

c# - lock(locker) 和 lock(variable_which_I_am_using) 的区别

c# - 在 MVC 中使用 DI 时的大量 Controller 构造函数参数列表

c# - 拥有无限工作线程的正确方法?