2010-08-02 108 views
1

是否有拦截方法调用的一个类,所以你可以做AOP?如何拦截一个类的方法调用

例如

我想Teacher.Talk()在两种情况下执行不同:

class School 
{ 
    [Fun] 
    public void Picnic { 
     Teacher t = new Teacher(); 
     t.Talk(); 
    } 

    public void Seminar{ 
     Teacher t = new Teacher(); 
     t.Talk(); 
    } 
} 

在上面的代码中,函数野餐由玩转属性的装饰,所以老师的通话功能要比更有趣研讨会功能中未由属性修饰的功能。

我检查了Castle.DynamicProxy,但它使用代理类并需要一些代码修改。这无助于解决我的问题,因为我想使用该属性来执行配置,因此当决策发生变化时,只需要很少的代码修改。

非常感谢!

回答

1

有两种基本方法:创建一个子类代理或将代码重新编译成“编译时编织”,以便将钩子输入到已编译的程序集中。

子类化只允许您拦截虚拟方法和构造函数,而编译时织入可以在任意位置输入钩子以拦截代码库中的调用。

+0

谢谢,但子类提供了一个解决我的问题。我需要在函数的作用域中配置对象行为,而不是时间范围。 – Roy 2010-08-04 05:59:12

+0

它只提供部分解决方案。您必须: 1)使用TeacherFactory隐藏您可能正在发回代理的事实。 2)在代理中,你将不得不运行调用堆栈并检查堆栈中的方法,以查找您感兴趣的属性FunAttribute 3)祈祷您的Teacher.Talk方法在一次调用中不会被调用100万次内循环某处。 ;-) – SargeATM 2010-08-05 02:17:53

1

几个月前研究过同样的问题后,我发现唯一合适的解决方案就是使用PostSharp。 http://www.sharpcrafters.com/

即使这样也不理想,因为它禁用了使用属性(give或take)的类中的Edit/Continue。

+0

[CodeCop](http://getcodecop.com/)是一个建立在JSON之上的库,为您的.NET应用程序编写方法拦截器提供了一种快速而不显眼的方式。 [Here](https://bitbucket.org/codecop_team/codecop/wiki/Home)是一个wiki。 你可以试试:) – 2015-09-03 14:33:31