2011-04-18 51 views
7

我正在一个网站上进行代码审查,这个网站会有很多并发用户, 100,000个已认证的用户。Ninject和性能

我发现型的下面的代码:

[Inject] 
    public BusinessLayer.ILoginManager LoginManager { get; set; } 

而在的global.asax.cs:

protected Ninject.IKernel CreateKernel() 
    { 
     return new StandardKernel(new ServiceModule()); 
    } 


    internal class ServiceModule : NinjectModule 
    { 

     public override void Load() 
     { 
      Kernel.Bind<IReportProxy>().To<ReportProxy>().InRequestScope(); 
     } 
    } 

问题是:利用Ninject会影响性能?由于演出情况,您是否有使用Ninject的情况?

回答

7

由于性能问题始终存在,因此仅通过查看代码就无法检测到任何问题。相反,profile你的应用程序,看看问题出在哪里。

从我过去的经验来看,IoC容器只会导致应用程序启动时的性能开销,并且在应用程序运行时其影响几乎可以忽略不计。

+0

确实如此,但都有不同的API和功能集。考虑根据API等多种因素作出决策,支持目标生命周期(例如,每个Web请求在Web应用程序中都很好),针对目标使用的性能,许可等等。 – Philippe 2013-03-07 14:35:16

2

Ninject给我们带来了很多与该项目相关的性能问题。这是最慢的DI的一个在那里,我会强烈建议考虑其他DI发动机(如https://github.com/ninject/ninject/issues/84

其他的事情需要注意Ninject夫妇:

  1. 取消绑定/重新绑定不是线程安全的( AFAIK没有在xmldocs的任何地方指定)。症状:由于Kenrel内部字典中存在重复键,因此间歇性地可能会丢失某些绑定。

  2. 从绑定目标引用自定义作用域对象可能导致内存泄漏(这实际上是合理的,但Ninject无法帮助定位问题)。例如。绑定已在范围持久引用的HttpContext对象HttpContext.Current

还值得铭记的是,根据设置你最终会使用该功能切换到不同的DI也许不可行(例如服务位置,条件绑定,自定义范围,动态绑定等)。即使另一个DI框架具有相似的功能集(例如LightInject)语法也可能太不同。