Ich habe Schloss Windsor Ioc in meiner MVC-Anwendung. Ich habe bemerkt, dass Objekte, die nach der Anzahl der Freigaberegeln verfolgt werden, immer größer werden und es scheint, dass diese Objekte niemals freigegeben werden (Speicher wird größer).MVC mit Schloss Windsor RegisterForDispose
Der Code ist:
public class ControllersInstaller : IWindsorInstaller
{
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.Register(Classes.FromThisAssembly()
.BasedOn<IController>()
.LifestyleTransient());
}
}
In global.asax ich habe:
controllerFactory = new WindsorControllerFactory();
ControllerBuilder.Current.SetControllerFactory(controllerFactory);
controllerFactory.ValidateControllersResolution();
und Klasse ist:
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();
}
In WEB-API-Version: Web API with Castle Windsor gibt es Register zur Entsorgung vor der Rückgabe des Controllers:
request.RegisterForDispose(
new Release(
() => this.container.Release(controller)));
Aber in meinem Fall ist RequestContext anstelle von HttpRequestMessage, die nicht RegisterForDispose-Methode hat. Gibt es eine andere Möglichkeit, sich für die Entsorgung zu registrieren oder einen anderen Weg zu finden, den Controller nach der Rücksendung der Ansicht zu entsorgen?
Oder bin ich nicht auf dem richtigen Weg?
Ich bin verwirrt.The Frage Titel bezieht sich auf MVC, aber in MVC, Freigabe wird vollständig von der ControllerFactory in MVC behandelt.Sie sagen, die ReleaseController-Methode in Ihrer ControllerFactory wird nicht aufgerufen? –