2017-02-16 4 views
0

Виндзорский замок используется в приложении 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, и утечки памяти не происходит.

+0

Что AddControllerLoggingFunctionality делать, вы можете включать в исходный код? –

+0

Извините, я приложил неправильный метод. Теперь я включил правильный. Я не уверен, что это на самом деле - я не знаком с динамическим прокси. На данный момент было бы неплохо, если бы я знал, как я могу распоряжаться контроллером (освободить память). – Simon

ответ

2

Вы не вызываете Release() на контроллере, а вызываете его на прокси, который вы создали вручную, поэтому Release() - это просто не-операция для Виндзора, поскольку он не знает об этом объекте и поэтому отслеживает компонент контроллера.

Если вы используете Windsor's built-in interception support, вам не нужно беспокоиться об этой проблеме, так как Windsor будет знать, как утилизировать компонент при передаче собственного внутреннего прокси-сервера.

Если вы хотите, чтобы проверить это перед изменением встроенной поддержкой Виндзора, отдать свой прокси Castle.DynamicProxy.IProxyTargetAccessor и вызвать DynProxyGetTarget(), чтобы получить экземпляр контроллера, который вам нужно пройти Release().

(Этот ответ копируется от наших discussion на замок Пользователи в списке рассылки)

Смежные вопросы