对于如何使用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
}
});