对于如何使用Ninject实现以下内容,我将不胜感激:

我有一个多线程应用程序。它同时运行大约20个非常独立的线程。在应用程序启动时,我使用InThreadScope()通过Ninject将接口(interface)绑定(bind)到对象,并且一切正常。每个线程接收特定于其线程的对象(每个对象的构造函数实例化多个线程特定的标志)。

每个线程所做的大部分工作都在等待数据存储完成过程。因此,为了进一步优化线程,我们在主要的20个线程中实现了Parallel.ForEach逻辑。我希望由Paralell.ForEach生成的线程获得与其父线程相同的绑定(bind)。但是,我不能简单地将接口(interface)重新绑定(bind)到Parallel.ForEach中的适当对象,我只是不知道绑定(bind)的对象是什么-在Paralell.ForEach中,我只能使用该接口(interface)。

在Paralell.ForEach启动之前,在运行时从内核中检索绑定(bind)的正确方法是什么,然后在循环内进行一般的重新绑定(bind)?

编辑:尝试包含详细的逻辑/伪代码:

每个线程一旦启动都会执行以下操作:

Kernel.Bind<ILoggingContext>().To<Application1LoggingContext>().InThreadScope();

但是,当Parallel.ForEach()从各个线程内部插入时,我不再具有对Application1LoggingContext对象的访问权限,并且无法将ILoggingContext重新绑定(bind)到该对象。这是因为Parallel.ForEach()从基类运行,并且不知道需要绑定(bind)到哪个Application LoggingContext。在启动20个大线程时,这在每个应用程序内部完成。

我想修改基类,该基类可以旋转Parallel.ForEach()并确保在Parallel.ForEach线程新创建的每个基类中,ILoggingContext仍绑定(bind)到Application1LoggingContext-通常,这样我可以执行以下操作:
var ctx = Kernel.Get<ILoggingContext>();

最佳答案

看来我已经弄清楚了。这是在Parallel.Foreach内部重新绑定(bind)的通用方法。根据绑定(bind)的复杂性/数量,开箱即用对您来说可能会或可能不会起作用

var logBinding = Kernel.GetBindings(typeof(ILoggingContext)).FirstOrDefault();

Parallel.ForEach(items, n =>
                            {
                                if (Kernel.GetBindings(typeof(ILoggingContext)).Count() == 0 && logBinding != null)
                                    Kernel.AddBinding(logBinding);

                                //do stuff
                                }
                            });

10-07 19:17
查看更多