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.
Was macht AddControllerLoggingFunctionality tun können Sie den Quellcode enthalten? –
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