我有一个城堡拦截器,我试图通过属性应用。当我在类级别应用我的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
}
}
谢谢,
安迪
答案 0 :(得分:7)
您可以使用自定义属性选择要截取的方法:
[Interceptor(typeof(CacheInterceptor))]
public class Foo : IFoo
{
[Cache]
public int SomeMethod() { }
}
然后在Intercept
方法检查中,如果方法具有自定义属性:
if (invocation.MethodInvocationTarget.IsDefined(typeof(CacheAttribute))) {
// do interception stuff
}
答案 1 :(得分:3)
不幸的是,我认为没有办法在方法上使用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
但是,我认为没有任何方法可以将IInterceptorSelector
与Interceptor
属性结合使用。