Castle Windsor Interceptor 是否有可能只拦截 class 中的特定方法而忽略其他方法?

Is possible with Castle Windsor Interceptor to intercept only a specific method in a class and ignore the other ones?

亲爱的, 我有一个接口 IJob,它有一个名为 ExecuteAsync 的方法,我想拦截此方法 only 但是我派生的 类 可能有很多方法,我发现拦截器也拦截了它们。 我的问题是, 温莎城堡有可能吗 这是我的注册

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;
    }

是的。您可以实现一个 IProxyGenerationHook 接口来控制拦截的内容。 The tutorial I wrote a decade ago 仍然(无论好坏)似乎是最好的资源。

在 Windsor 中有几种设置方法。

理想情况下,如果可能的话,您会在注册时在 IWindsorInstaller:

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

或者,如果您想让您的代码与现在的代码相似(我建议用 ComponentModel construction contributor 包装起来),您可以这样做:

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