【发布时间】:2011-06-14 02:55:37
【问题描述】:
Kernel.Get() 线程安全吗?我的目标是在我的所有组件之间共享我的内核实例,并且它们都可以很好地在不同线程上同时调用 Kernel.Get()。
Kernel.Get() 线程安全吗?
在位于不同 dll 中的所有应用程序组件之间共享应用程序内核的最佳模式是什么?如果有意义的话,我不希望将工厂的实例传递给我的应用程序的每个组件。
【问题讨论】:
Kernel.Get() 线程安全吗?我的目标是在我的所有组件之间共享我的内核实例,并且它们都可以很好地在不同线程上同时调用 Kernel.Get()。
Kernel.Get() 线程安全吗?
在位于不同 dll 中的所有应用程序组件之间共享应用程序内核的最佳模式是什么?如果有意义的话,我不希望将工厂的实例传递给我的应用程序的每个组件。
【问题讨论】:
Get 是线程安全的,但创建新的内核实例 (ctor) 目前不是线程安全的。
一般来说,您应该尽量将您对内核的访问降至最低。到处访问内核形式是一个非常糟糕的设计,并且会使您的代码的可重用性大大降低。见Service Locator Antipattern
您访问内核的唯一情况应该是:
在所有情况下,将对内核的访问限制为复合根,并将工厂(类或Func<T>)注入到您需要在运行时创建对象的类。让这些工厂访问内核的最佳方法仍然是构造函数注入,即使您不喜欢这样做。或者使用Func<T> (Does Ninject support Func (auto generated factory)?)。
【讨论】:
kernel如何注入工厂吗?我很困惑,因为我们需要内核来解决依赖关系,但是内核是如何自己注入的呢?
是的,它是线程安全的;我工作的主要应用程序有一个服务于大型 SAAS 应用程序的内核。所以它被捣碎了,它做得很好。我们还有一个多线程页面生成器测试套件,它在去年秋天暴露了 Ninject 中的一个线程问题,但从那时起已经修复并且一直很好。所以我确定没问题。
有很多不同的模式来暴露内核。我们使用 ServiceLocator 模式(基本上是容器的静态容器。)
对于不同的 dll。我们在每个 dll 中都有一个 NinjectModule,它自己绑定,然后应用程序在启动时设置 ServiceLocator 时对 NinjectModules 进行程序集扫描。
【讨论】: