在MVCApplication中对IoC容器的静态引用是否会导致内存泄漏?

时间:2012-01-03 13:05:43

标签: c# asp.net-mvc-3 memory-leaks inversion-of-control

我在ASP.Net MVC 3应用程序中遇到内存泄漏,我怀疑它可能是IoC容器的问题。

MvcApplication创建一个WindsorContainer对象,填充它然后将其存储在静态字段中,如下所示:

public class MvcApplication : System.Web.HttpApplication, IContainerAccessor
{
  private static WindsorContainer container;

  protected void Application_Start()
  {
    ControllerBuilder.Current.SetControllerFactory(
      new WindsorControllerFactory(container));
  }
}

在静态区域中握住容器是否正确?据我所知,容器本身只需要与MVCApplication本身一样长。使其静态只是在多个MVCApplication实例之间共享它,所以我想知道它是否被错误地处理了。

2 个答案:

答案 0 :(得分:2)

使用Castle Windsor时,遵循Register Resolve Release模式很重要,因为容器本身可能会跟踪一次性对象(为了能够处理它们)。

对于ASP.NET MVC,这意味着ControllerFactory应该从ReleaseController调用Release。这个答案包含更多解释:Explain the mysterious world of IoC and automatic Dispose

您可能还希望在MvcApplication处理...

时自行处理容器

答案 1 :(得分:1)

可以通过这种方式创建容器,并将其作为静态字段存储在应用程序对象中。您可以控制容器创建的对象的生命周期(请参阅此page)。对于Web应用程序,通常的生命周期是每个请求 - 从上述页面复制的示例:

Kernel.Register(
Component.For<ISession>()
    .UsingFactoryMethod(k => k.Resolve<ISessionFactory>().OpenSession())
    .LifestylePerWebRequest()
);

在这种情况下,您永远不必在MvcApplication类的多个实例之间共享它 - 在Web应用程序中通常有一个HttpApplication类的实现。