带有任务范围的ninject(或其他IoC)?

时间:2012-05-18 16:41:41

标签: c# design-patterns inversion-of-control ninject task-parallel-library

我不确定TPL表面是否足够可行,因此,请随意指出替代的替代模式。 :)

我正在试图弄清楚我是否可以将Ninject用于ctor注入的依赖项,理想情况下应将其作用域限定为特定的根/父Task实例。

它有点类似于asp.net请求范围,但在这种情况下,它是一个控制台应用程序,它创建N个并行运行的不同任务。我想知道是否有能力让Ninject根据每个根任务实例执行运行时依赖注入,这样作为每个任务的一部分创建的对象图共享给定接口的相同实例,但不同的任务全部有单独的实例。

谢谢!

[EDIT] 继续搜索,根据“定义对象是其依赖项的范围”的描述,看起来InNamedScope 可能是正确的答案

1 个答案:

答案 0 :(得分:4)

如果我理解你的问题,InNamedScope是个不错的选择。另一种选择是InCallScope。这个blog post对差异进行了很好的讨论:

  

命名范围允许您在对象创建的绑定上定义   通过绑定是其他对象的范围   注入到创建对象中的对象树。

     

让我们看看它如何在一个例子中起作用。想象一下,你正在创造   一个类似Excel的应用程序,它有多个工作表....

const string ScopeName = "ExcelSheet";
Bind<ExcelSheet>().ToSelf().DefinesNamedScope(ScopeName);
Bind<SheetPresenter>().ToSelf();
Bind<SheetCalculator>().ToSelf();
Bind<SheetDataRepository>().ToSelf().InNamedScope(ScopeName);

此处,SheetDataRepository使用范围内的ExcelSheet。这篇文章更详细地解释了。