是Kernel.Get <t>()线程安全+良好模式在组件之间共享内核</t>

时间:2011-06-14 02:55:38

标签: ninject ninject-2

Kernel.Get()线程安全吗?我的目标是在我的所有组件中共享我的内核实例,他们可能会在不同的线程上同时调用Kernel.Get()。

Kernel.Get()线程安全吗?

在所有位于不同dll中的应用程序组件之间共享应用程序内核的最佳模式是什么?如果这是有意义的,我不希望将工厂的实例传递给我的应用程序的每个组件。

2 个答案:

答案 0 :(得分:14)

Get is threadsafe但是创建新的内核实例(ctor)目前不是线程安全的。

通常,您应该尽量将对内核的访问权限降至最低。在任何地方访问内核表单是一个非常糟糕的设计,使您的代码更不可重用。见Service Locator Antipattern

访问内核的唯一情况应该是:

  • 进入应用程序的复合根目录(例如Program.Main,App.xaml,MVC Controller创建)
  • 如果您在创建复合根目录时不知道需要多少实例,则在工厂内部
  • 如果您在创建复合根目录时不知道需要哪种实现,则在工厂内部
  • 如果由于内存/资源限制需要延迟创建组件,则在工厂内部。

在所有情况下,将对内核的访问限制为复合根,并将工厂(类或Func<T>)注入需要在运行时创建对象的类。即使您不喜欢这样做,给这些工厂访问内核的最佳方法仍然是构造函数注入。或者使用Func<T>Does Ninject support Func (auto generated factory)?)。

答案 1 :(得分:2)

是的,它是线程安全的;我工作的主要应用程序有一个内核,可以为大型SAAS应用程序提供服务。所以它受到了抨击,它确实很好。我们还有一个多线程页面生成器测试套件,它在去年秋天在Ninject中暴露了一个线程问题,但是已经修复并且从那时起一直很好。所以我肯定知道没关系。

暴露内核有很多不同的模式。我们使用ServiceLocator模式(基本上是容器的静态容器。)

对于不同的dll。我们在每个dll中都有一个NinjectModule来执行它自己的绑定,然后应用程序在设置ServiceLocator时在启动时对NinjectModules进行程序集扫描。