1

У меня есть замок Windsor Ioc в моем приложении MVC. Я заметил, что объекты, отслеживаемые по счету политики выпуска, постоянно растут, и, как кажется, эти объекты никогда не выпускаются (память растет).MVC с замком Windsor RegisterForDispose

Код:

public class ControllersInstaller : IWindsorInstaller 
{ 
    public void Install(IWindsorContainer container, IConfigurationStore store) 
    { 
     container.Register(Classes.FromThisAssembly() 
      .BasedOn<IController>() 
      .LifestyleTransient()); 
    } 
} 

В global.asax я есть:

controllerFactory = new WindsorControllerFactory(); 
ControllerBuilder.Current.SetControllerFactory(controllerFactory); 
controllerFactory.ValidateControllersResolution(); 

И класс:

public class WindsorControllerFactory: DefaultControllerFactory{ 
    private readonly IWindsorContainer container; 

    public WindsorControllerFactory() 
    { 
     container = new WindsorContainer() 
      .Install(FromAssembly.This()) 
      .AddFacility<WcfFacility>(); 
     default policy is: LifecycledComponentsReleasePolicy 
     //container.Kernel.ReleasePolicy; 
    } 

    public override void ReleaseController(IController controller) 
    { 
     //this is called after each view return 
     container.Kernel.ReleaseComponent(controller); 
    } 

    protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType) 
    { 
     if (controllerType == null) 
     { 
      throw new HttpException(404, 
       $"The controller for path '{requestContext.HttpContext.Request.Path}' could not be found."); 
     } 

     var controller= ((IController)container.Kernel.Resolve(controllerType)).AddControllerLoggingFunctionality(); 
     return controller; 
    } 

    public void DisposeContainer() 
    {//this is never executed 
     container.Dispose(); 
    } 

В WEB версии API: Web API with Castle Windsor есть регистр для утилизации перед возвратом контроллера:

request.RegisterForDispose(
     new Release(
      () => this.container.Release(controller))); 

Но в моем случае есть RequestContext вместо HttpRequestMessage, который не имеет метода RegisterForDispose. Есть ли другой способ регистрации для удаления или какой-либо другой способ утилизации контроллера после просмотра?

Или я не на правильном пути?

+0

Я смущен. Название вопроса относится к MVC, но в MVC, освобождение полностью обрабатывается ControllerFactory в MVC. Вы говорите, что метод ReleaseController в вашем ControllerFactory не называется? –

ответ

0

Метод RegisterForDispose() существует только для HttpRequestMessage, поскольку он способен связывать произвольные объекты с запросом на длительность запроса через его коллекцию Properties. Даже сама структура использует его (например, в GetOwinContext()).

С другой стороны, традиционный HttpRequest (который доступен для контроллеров MVC) не предоставляет этой возможности *, следовательно, нет RegisterForDispose().

* (Хотя вы можете связать произвольные элементы с HttpContext.Items, которые обычно используются для передачи данных между модулями. Если вы должны были использовать его для связывания элементов с текущим запросом, вам придется вручную их вручную well

+0

Вы имеете в виду, если я добавляю контроллер для коллекций элементов, таких как: requestContext.HttpContext.Items ["x"] = контроллер, я могу получить к нему доступ позже, чтобы утилизировать его? Но у iController нет метода удаления? Делает ли "container.K ernel.ReleaseComponent (controller); «действительно удаляет контроллер и освобождает память со своего свойства контейнера:« Объект, отслеживаемый политикой выпуска », постоянно растет? – Simon

Смежные вопросы