另一个方法正在调用的方法上的castle-windsor拦截器
本文关键字:方法 castle-windsor 调用 另一个 | 更新日期: 2023-09-27 18:01:16
拦截器
public class CachingInterceptor : IInterceptor
{
public void Intercept(IInvocation invocation)
{
// code comes here....
}
}
业务层
public class Business : IBusiness
{
public void Add(string a)
{
var t= GetAll();
// code comes here....
}
[CacheAttribute]
public string GetAll()
{
// code comes here....
}
}
类别
public class JustForTest
{
public JustForTest(IBusiness business)
{
//if GetAll is invoked directly caching works fine.
business.GetAll();
//if GetAll is invoked over Add method caching doesn't work.
business.Add();
}
}
add方法调用GetAll方法。如果我直接调用GetAll方法,缓存就可以工作。如果Add方法调用GetAll方法,则缓存不起作用。
谢谢你的帮助。
接口代理是通过包装代理目标对象来创建的,因此对于接口来说,这是不可能的。
您可以拦截对相同对象的调用,但仅限于类代理(前提是该方法是虚拟的(。请参阅类似问题的答案。
您还可以尝试以不同的方式构建代码,将需要缓存的逻辑移动到可以缓存的服务中,而无需使用它自己的函数。
这里的问题是行
var t= GetAll();
在类Business
内部。它可以更清楚地写为
var t = this.GetAll();
this
不是被拦截/被包装的实例。
尝试按照此处和此处的建议划分Business
类的职责