C# 由另一个方法调用的方法上的castle windsor侦听器 拦截器 业务层 等级
add方法调用GetAll方法。如果我直接调用GetAll方法,缓存就会工作。若Add方法调用GetAll方法,则缓存不起作用C# 由另一个方法调用的方法上的castle windsor侦听器 拦截器 业务层 等级,c#,castle-windsor,aop,interceptor,aspect,C#,Castle Windsor,Aop,Interceptor,Aspect,add方法调用GetAll方法。如果我直接调用GetAll方法,缓存就会工作。若Add方法调用GetAll方法,则缓存不起作用 感谢您的帮助。接口代理是通过包装代理目标对象创建的,因此对于接口,这是不可能的 您可以拦截对相同对象的调用,但仅限于类代理(前提是该方法是虚拟的)。 见类似问题的答案 您还可以尝试以不同的方式构建代码,将需要缓存的逻辑移动到可以缓存的服务中,而不必使用它自己的函数。这里的问题是 var t= GetAll(); 在类业务中。它可以更清楚地写为 var t = this
感谢您的帮助。接口代理是通过包装代理目标对象创建的,因此对于接口,这是不可能的 您可以拦截对相同对象的调用,但仅限于类代理(前提是该方法是虚拟的)。 见类似问题的答案
您还可以尝试以不同的方式构建代码,将需要缓存的逻辑移动到可以缓存的服务中,而不必使用它自己的函数。这里的问题是
var t= GetAll();
在类业务中。它可以更清楚地写为
var t = this.GetAll();
此
不是拦截/包装的实例
尝试按照建议划分业务
类的职责,并且您应该从容器
中解析业务
实例,而不是自己创建新的
实例。事实上我做到了。我只是想让代码变得简单。我使用安装程序来实现。是的,这似乎不容易,但它应该是某种方式。我找不到任何解决办法。每个人都直接调用该方法:|谢谢你,雅各布。我检查了你的答案。事实上,我在城堡里并不专业。把我的方法修改成虚拟的可以吗。我也读了Krzysztof的答案,但不清楚。你可以将方法标记为虚拟的,但是你的客户需要依赖于具体的类型,而不是接口。有点难看和不稳定。我会尝试改变架构。谢谢,我明白你的意思。我不应该在Add()方法中调用GetAll()。但是我不知道。我假设GetAll
是一个返回一些数据的查询。如果GetAll
是注入Business
的一个单独的类(查询),那么您就不会遇到所面临的问题。我将把GetAll方法放在单独的类中。谢谢Jacob和Qujck。@MuratCabuk:如果你读了这些文章,你甚至不需要截取。您可以使用装饰器以更干净、更优雅的方式来完成这项工作。
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();
}
}
var t= GetAll();
var t = this.GetAll();