Может ли статическая ссылка на контейнер IoC в приложении MVCA вызвать утечки памяти? - PullRequest
2 голосов
/ 03 января 2012

У меня возникают утечки памяти в приложении 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));
  }
}

Правильно ли здесь удерживать контейнер в статическом поле? Насколько я понимаю, сам контейнер должен жить так же долго, как и само приложение MVCA. Если сделать его статичным, это просто разделит его между несколькими экземплярами MVCApplication, поэтому мне интересно, неправильно ли он расположен.

Ответы [ 2 ]

2 голосов
/ 04 января 2012

При использовании Castle Windsor важно следовать шаблону Register Resolve Release , поскольку сам контейнер может отслеживать одноразовые объекты (чтобы иметь возможность их утилизировать).

Для ASP.NET MVC это означает, что ControllerFactory должен вызывать Release из ReleaseController. Этот ответ содержит больше объяснений: Объясните загадочный мир IoC и автоматическое удаление

Вы также можете захотеть утилизировать сам контейнер, когда MvcApplication удалит ...

1 голос
/ 03 января 2012

Контейнер может быть создан таким образом и сохранен в объекте приложения в виде статического поля.Вы можете управлять временем жизни объектов, создаваемых контейнером (см. Эту страницу ).Для веб-приложения обычное время жизни - на запрос - пример скопирован с вышеупомянутой страницы:

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

И в этом случае вам никогда не придется делить его между несколькими экземплярами класса MvcApplication - обычноодна реализация класса HttpApplication в веб-приложении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...