Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 由另一个方法调用的方法上的castle windsor侦听器 拦截器 业务层 等级_C#_Castle Windsor_Aop_Interceptor_Aspect - Fatal编程技术网

C# 由另一个方法调用的方法上的castle windsor侦听器 拦截器 业务层 等级

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

add方法调用GetAll方法。如果我直接调用GetAll方法,缓存就会工作。若Add方法调用GetAll方法,则缓存不起作用


感谢您的帮助。

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

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


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

这里的问题是

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