Castle Windsor Interceptor不使用Method-Level属性

And*_*ndy 5 c# aop castle-windsor castle-dynamicproxy

我有一个城堡拦截器,我试图通过属性申请.当我在类级别应用我的Interceptor属性时,它工作得很好,但是当我在方法级别应用时,它根本不起作用.我究竟做错了什么?我不想拦截类上的每个方法,而是使用[Interceptor]属性标记某些方法.我已经尝试将我的方法标记为虚拟,但它仍然不起作用.这是我的代码:

这样可以拦截所有方法:

[Interceptor(typeof(CacheInterceptor))]
public class Foo : IFoo
{
   public int SomeMethod() { }
}
Run Code Online (Sandbox Code Playgroud)

这不起作用(属性在方法级别):

public class Foo : IFoo
{
   [Interceptor(typeof(CacheInterceptor))]
   public int SomeMethod() { }
}
Run Code Online (Sandbox Code Playgroud)

安装人员:

public class CacheInterceptorInstaller : IWindsorInstaller
{
    public void Install(IWindsorContainer container, IConfigurationStore store)
    {
        container.Register(Component.For<CacheInterceptor>().LifeStyle.Singleton);

        container.Register(Component
            .For<ICacheProvider>()
            .LifeStyle.Singleton
            .ImplementedBy<CacheProvider>());
    }
}
Run Code Online (Sandbox Code Playgroud)

拦截器:

public class CacheInterceptor : IInterceptor
{
    private readonly ICacheProvider _cacheProvider;

    public CacheInterceptor(ICacheProvider cacheProvider)
    {
        _cacheProvider = cacheProvider;
    }

    public void Intercept(IInvocation invocation)
    {
       // do interception stuff
    }
}
Run Code Online (Sandbox Code Playgroud)

谢谢,

安迪

Ale*_*ček 7

您可以使用自定义属性来选择要截取的方法:

[Interceptor(typeof(CacheInterceptor))]
public class Foo : IFoo
{
   [Cache]
   public int SomeMethod() { }
}
Run Code Online (Sandbox Code Playgroud)

然后在Intercept方法检查中,如果方法具有自定义属性:

if (invocation.MethodInvocationTarget.IsDefined(typeof(CacheAttribute))) {
  // do interception stuff
}
Run Code Online (Sandbox Code Playgroud)


Mat*_*ves 3

不幸的是,我认为没有办法Interceptor仅在方法上使用该属性。来自http://docs.castleproject.org/Windsor.Interceptors.ashx:

InterceptorAttribute 的定义方式允许您不仅将其放在类上,还可以将其放在允许自定义属性的任何其他目标上,例如接口或方法。然而,Windsor 将忽略该属性,除非它位于组件的实现类上。引入这种宽容行为是为了允许人们通过构建自定义扩展来添加对其他目标的支持。

(重点是我的)

我认为在 Castle 中可能有用的是IProxyGenerationHookand/or IInterceptorSelector。有关于此的一些文档:http://docs.castleproject.org/Tools.Use-proxy- Generation-hooks-and-interceptor-selectors-for-fine-grained-control.ashx

但是,我没有看到任何使用该IInterceptorSelector属性的方法Interceptor。