另一个方法正在调用的方法上的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方法,则缓存不起作用。

谢谢你的帮助。

另一个方法正在调用的方法上的castle-windsor拦截器

接口代理是通过包装代理目标对象来创建的,因此对于接口来说,这是不可能的。

您可以拦截对相同对象的调用,但仅限于类代理(前提是该方法是虚拟的(。请参阅类似问题的答案。

您还可以尝试以不同的方式构建代码,将需要缓存的逻辑移动到可以缓存的服务中,而无需使用它自己的函数。

这里的问题是行

var t= GetAll();

在类Business内部。它可以更清楚地写为

var t = this.GetAll();

this不是被拦截/被包装的实例。

尝试按照此处和此处的建议划分Business类的职责