我在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实例之间共享它,所以我想知道它是否被错误地处理了。
答案 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
类的实现。