У меня есть замок 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. Есть ли другой способ регистрации для удаления или какой-либо другой способ утилизации контроллера после просмотра?
Или я не на правильном пути?
Я смущен. Название вопроса относится к MVC, но в MVC, освобождение полностью обрабатывается ControllerFactory в MVC. Вы говорите, что метод ReleaseController в вашем ControllerFactory не называется? –