【问题标题】:castle windsor interceptor on method that is calling by another method由另一个方法调用的方法上的城堡温莎拦截器
【发布时间】:2015-09-24 14:39:15
【问题描述】:

拦截器

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 方法,缓存不起作用。

感谢您的帮助。

【问题讨论】:

  • 您应该从container 中解析Business 实例,而不是自己解决new
  • 谢谢你。其实我做到了。我只是想让代码简单。我使用安装程序来实现。

标签: c# castle-windsor aop interceptor aspect


【解决方案1】:

这里的问题是这条线

var t= GetAll();

Business。可以更清楚地写成

var t = this.GetAll();

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

尝试按照herehere 的建议划分Business 类的职责

【讨论】:

  • 谢谢,我明白你的意思了。我不应该在 Add() 方法中调用 GetAll()。但是我不知道。
  • 我假设GetAll 是一个返回一些数据的查询。如果GetAll 是注入Business 的单独类(查询),那么您将不会遇到您面临的问题。
  • 我会将 GetAll 方法放在单独的类中。谢谢 Jacob 和 Qujck。
  • @MuratCabuk:如果您阅读了建议的文章,您甚至根本不需要拦截。您可以使用装饰器以更干净、更优雅的方式做到这一点。
【解决方案2】:

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

您可以拦截对相同对象的调用,但仅限于类代理(前提是方法是虚拟的)。 查看类似question 的回复。

您还可以尝试以不同的方式构建代码,将需要缓存的逻辑移动到可以在不使用其自己的函数的情况下进行缓存的服务。

【讨论】:

  • 是的,这似乎并不容易,但应该是某种方式。我找不到任何解决方案。大家直接调用方法。 :|
  • 谢谢雅各布。我检查了你的答案。其实我不是城堡的专业人士。可以将我的方法修改为虚拟方法吗?我也阅读了 Krzysztof 的回答,但不清楚。
  • 您可以将方法标记为虚拟方法,但您的客户端需要依赖于具体类型而不是接口。有点丑陋和无法测试。我会尝试改变架构。
猜你喜欢
  • 2015-06-21
  • 1970-01-01
  • 2014-02-04
  • 1970-01-01
  • 1970-01-01
  • 2011-06-22
  • 1970-01-01
  • 1970-01-01
  • 2011-01-04
相关资源
最近更新 更多