【问题标题】:Castle Windsor Interceptor not working with Method-Level attribute温莎城堡拦截器不适用于方法级属性
【发布时间】:2014-02-04 13:31:01
【问题描述】:

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

这行得通,所有方法都被拦截:

[Interceptor(typeof(CacheInterceptor))]
public class Foo : IFoo
{
   public int SomeMethod() { }
}

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

public class Foo : IFoo
{
   [Interceptor(typeof(CacheInterceptor))]
   public int SomeMethod() { }
}

安装程序:

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

拦截器:

public class CacheInterceptor : IInterceptor
{
    private readonly ICacheProvider _cacheProvider;

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

    public void Intercept(IInvocation invocation)
    {
       // do interception stuff
    }
}

谢谢,

安迪

【问题讨论】:

    标签: c# castle-windsor aop castle-dynamicproxy


    【解决方案1】:

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

    [Interceptor(typeof(CacheInterceptor))]
    public class Foo : IFoo
    {
       [Cache]
       public int SomeMethod() { }
    }
    

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

    if (invocation.MethodInvocationTarget.IsDefined(typeof(CacheAttribute))) {
      // do interception stuff
    }
    

    【讨论】:

    • 谢谢 - 这是一个很好的解决方法。希望有一种更简洁的方法可以做到这一点,但不必拦截所有类的方法。
    【解决方案2】:

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

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

    (重点是我的)

    我认为在 Castle 中可能有用的东西是 IProxyGenerationHook 和/或 IInterceptorSelector。这方面的一些文档:http://docs.castleproject.org/Tools.Use-proxy-generation-hooks-and-interceptor-selectors-for-fine-grained-control.ashx

    但是,我看不到任何将 IInterceptorSelectorInterceptor 属性结合使用的方法。

    【讨论】:

    • 这让我很难过。我对 AOP 很陌生,但似乎方法级拦截器将是一个不错的功能。感谢您的帮助!
    • 请注意,使用 PostSharp,做你想做的事情会容易得多:)
    猜你喜欢
    • 2015-06-21
    • 1970-01-01
    • 2011-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-23
    相关资源
    最近更新 更多