Возможно ли с помощью Castle Windsor Interceptor перехватывать только определенный метод в классе и игнорировать другие? - PullRequest
0 голосов
/ 05 марта 2019

Уважаемые, у меня есть интерфейс IJob , который имеет метод с именем ExecuteAsync , и я хочу перехватить этот метод только , но мои производные классы могут иметь много методови я обнаружил, что перехватчик также перехватывает ихМой вопрос: возможно ли это с Виндзорским замком, и это моя регистрация

iocManager.IocContainer.Kernel.ComponentRegistered += (key, handler) =>
        {
            var implementationType = handler.ComponentModel.Implementation.GetTypeInfo();
            if(ShouldIntercept(implementationType))
            {
                handler.ComponentModel.Interceptors.Add(new InterceptorReference(typeof(AuthenticateJobInterceptor)));
            }
        };

private static bool ShouldIntercept(Type type)
    {
        if (typeof(IJob).IsAssignableFrom(type))
        {
            return true;
        }
        return false;
    }

1 Ответ

2 голосов
/ 06 марта 2019

Да, это так.Есть интерфейс IProxyGenerationHook, который вы можете реализовать, чтобы контролировать то, что перехватывается. Учебное пособие, которое я написал десять лет назад все еще (к лучшему или худшему), кажется, лучший ресурс об этом.

Есть несколько способов настроить его в Виндзоре.

В идеале, если это возможно, вы должны сделать это при регистрации, в вашем IWindsorInstaller:

var yourHook = new YourHook();
container.Register(
    Classes.FromThisAssembly()
      .BasedOn<IJob>()
      .LifestyleTransient()
      .WithServiceBase()
      .Configure(c =>
         c.Interceptors<AuthenticateJobInterceptor>()       
          .Proxy.Hook(yourHook)));

В качестве альтернативы, если вы хотите, чтобы ваш код был таким же, как сейчас (я рекомендуюоборачивая в конструктор ComponentModel ), вы можете сделать что-то вроде:

var options = handler.ComponentModel.ObtainProxyOptions();
options.Hook = yourHook; // InstanceReference(yourHook)
...