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

标签 ninject ninject-2

Kernel.Get() 线程安全吗?我的目标是在我的所有组件之间共享我的内核实例,并且它们都可以很好地在不同线程上同时调用 Kernel.Get()。

Kernel.Get() 线程安全吗?

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

最佳答案

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

通常,您应该尝试将您对内核的访问降至最低。到处访问内核形式是一个非常糟糕的设计,并且会使您的代码的可重用性大大降低。见 Service Locator Antipattern

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

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

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

    关于ninject - 是 Kernel.Get<T>() 线程安全 + 在组件之间共享内核的良好模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6338603/

    相关文章:

    asp.net-mvc-4 - 获取 'Context is not constructible. Add a default constructor or provide an implementation of IDbContextFactory."

    c# - 无法让 Ninject 在请求范围内处理对象

    ioc-container - Ninject.Mvc 和 Ninject.Wcf 扩展的稳定性

    与 OnePerRequestModule 相关的 Ninject 间歇性异常抛出

    c# - 根据其他值获取对象实例,而不使用服务位置

    c# - 带有构造函数参数的最小起订量

    .net - 使用 Ninject,如果我创建自定义提供程序,我必须确保单个实例还是可以使用 SingleInstance 属性?

    dependency-injection - 在 NInject 中绑定(bind) MembershipProvider 时应该使用 InSingletonScope 吗?

    c# - MVC3 Controller 构造函数 + Ninject

    c# - 如何配置 Ninject 以便它根据先前注入(inject)的实例注入(inject)正确的实例