2017-02-16 3 views
0

Castle windsor in MVC-Anwendung verwendet wird, wie es hier beschrieben wird: Plugging Windsor in MVCCastle windsor Proxy erzeugen Leck Speicher

In meiner Anwendung einen Unterschied gibt es, und das ist AddControllerLoggingFunctionality Methode:

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

Diese Methode Logger-Klasse ist in:

[DebuggerStepThrough] 
public static class Logger 
{ 
    private static readonly Castle.DynamicProxy.ProxyGenerator proxyGenerator; 
    static Logger() 
    { 
     proxyGenerator = new Castle.DynamicProxy.ProxyGenerator(); 
     Castle.DynamicProxy.Generators.AttributesToAvoidReplicating.Add(
      typeof(ServiceContractAttribute)); 
    } 

    public static TInterface AddControllerLoggingFunctionality<TInterface>(this TInterface implementation) 
     where TInterface : class 
    { 
     if (implementation == null) 
     { 
      throw new ArgumentNullException("implementation"); 
     } 

     if (!typeof(TInterface).IsInterface) 
     { 
      throw new Exception("Type of 'TInterface' must be interface."); 
     } 

     Castle.DynamicProxy.ProxyGenerationOptions options = 
      new Castle.DynamicProxy.ProxyGenerationOptions(); 

     var origAttribs = implementation.GetType().GetCustomAttributesData(); 
     if (origAttribs != null) 
     { 
      foreach (var origAttrib in origAttribs) 
      { 
       options.AdditionalAttributes.Add(
        AttributeUtil.CreateBuilder(origAttrib)); 
      } 
     } 

     return (TInterface)proxyGenerator.CreateInterfaceProxyWithTarget<TInterface>(
      implementation, 
      options, 
      new ControllerLoggingInterceptor(implementation.GetType())); 
    } 
} 

Und jemand das erklären kann? Warum kann IController AddControllerLoggingFunctionality aufrufen und was macht das?

Aufgrund dieser Änderung werden diese Controller nie aus dem Speicher freigegeben (wenn container.Kernel.ReleaseComponent (Controller); aufgerufen wird) und ich bekomme Speicherverlust. Der Zähler "Object tracked by release policy" erhöht sich ständig. Wenn ich AddControllerLoggingFunctionality entferne, dann sinkt der Zähler "Object tracked by release policy" jedes Mal, wenn ich ReleaseComponent aufrufen und ein Speicherleck nicht auftritt.

+0

Was macht AddControllerLoggingFunctionality tun können Sie den Quellcode enthalten? –

+0

Entschuldigung, ich habe die falsche Methode angehängt. Jetzt habe ich die richtige aufgenommen. Ich bin mir nicht sicher, was es tatsächlich macht - ich bin nicht vertraut mit dynamischen Proxy. Für jetzt wäre es zumindest nett wenn ich weiß wie ich den Controller entsorgen kann (release memory). – Simon

Antwort

2

Sie sind nicht Anruf Release() auf dem Controller, aber rufen es auf dem Proxy, den Sie manuell erstellt, so Release() ist nur ein No-Op zu Windsor, da es nicht über das Objekt weiß und so verfolgt die Controller-Komponente.

Wenn Sie Windsor built-in interception support verwenden, müssen Sie sich nicht um dieses Problem kümmern, da Windsor weiß, wie die Komponente zu entsorgen ist, wenn sie ihren eigenen intern verwalteten Proxy erhält.

Wenn Sie dies testen wollen, bevor sie Windsors integrierte Unterstützung zu ändern, werfen Sie Ihre Proxy Castle.DynamicProxy.IProxyTargetAccessor und rufen DynProxyGetTarget() Ihre Controller-Instanz zu erhalten, die Sie Release() passieren benötigen.

(Diese Antwort unserer discussion auf der Burg Benutzer-Mailingliste kopiert)

Verwandte Themen