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

iCo*_*ode 9 ninject ninject-2

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

Kernel.Get()线程安全吗?

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

Rem*_*oor 14

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

通常,您应该尽量将对内核的访问权限降至最低.在任何地方访问内核表单是一个非常糟糕的设计,使您的代码更不可重用.请参阅服务定位器反模式

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

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

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