1

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?

+0

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? –

Antwort

0

Die Methode RegisterForDispose() existiert nur unter HttpRequestMessage, da sie beliebige Objekte mit der Anforderung für die Dauer der Anforderung über ihre Properties-Sammlung verknüpfen kann. Sogar das Framework selbst verwendet es (z. B. in GetOwinContext()).

Auf der anderen Seite stellt das traditionelle HttpRequest (das für MVC-Controller verfügbar ist) diese Fähigkeit nicht zur Verfügung * daher wird RegisterForDispose() nicht zur Verfügung gestellt.

* (Sie können der HttpContext.Items beliebige Elemente zuordnen, die normalerweise zum Übergeben von Daten zwischen Modulen verwendet werden. Wenn Sie Objekte zur aktuellen Anforderung zuordnen möchten, müssen Sie sie manuell als löschen gut

+0

Sie meinen, wenn ich hinzufügen Controller zu Items Sammlungen wie: requestContext.HttpContext.Items ["x"] = controller; Ich kann später darauf zugreifen, um es zu entsorgen? Aber iController hat keine dispose-Methode? Tut "container.K ernel.ReleaseComponent (Controller); "Controller wirklich freigeben und Speicher freigeben, da die Container-Eigenschaft:" Object tracked by release policy "ständig wächst? – Simon

Verwandte Themen