Виндзорский замок используется в приложении MVC, как это описано здесь: Plugging Windsor in MVCВиндзорский замок прокси генерировать утечка памяти
В моем приложении есть одна разница, и это метод AddControllerLoggingFunctionality:
var controller = ((IController)container.Kernel.Resolve(controllerType)).AddControllerLoggingFunctionality();
Этот метод в классе регистратора:
[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()));
}
}
И Может кто-нибудь объяснить это? Почему IController может вызвать AddControllerLoggingFunctionality и что он делает?
Из-за этого изменения эти контроллеры никогда не выпускаются из памяти (когда вызывается container.Kernel.ReleaseComponent (контроллер)), и я получаю утечку памяти. Счетчик «Объект, отслеживаемый политикой выпуска» постоянно увеличивается. Если я удалю AddControllerLoggingFunctionality, тогда счетчик «Объект, отслеживаемый по политике выпуска» уменьшается каждый раз, когда я вызываю ReleaseComponent, и утечки памяти не происходит.
Что AddControllerLoggingFunctionality делать, вы можете включать в исходный код? –
Извините, я приложил неправильный метод. Теперь я включил правильный. Я не уверен, что это на самом деле - я не знаком с динамическим прокси. На данный момент было бы неплохо, если бы я знал, как я могу распоряжаться контроллером (освободить память). – Simon