2013-11-23 41 views
9

我有一个类,看起来像这样:执行方法之后几种方法运行

public class SomeClass 
{ 
    public void SomeMethod1() { ... } 
    public void SomeMethod2() { ... } 
    public void SomeMethod3() { ... } 

    private void SomeSpecialMethod(SomeParameter) { ... } 
} 

就目前而言,我有各自的前3个方法调用SomeSpecialMethod()只是这些方法返回之前。我要添加大约15个方法,最后都需要执行SomeSpecialMethod(),我想知道是否有方法说“当这个类中的任何方法运行,执行SomeSpecialMethod()而不必明确在每种方法结束时重复呼叫,并且当然阻止SomeSpecialMethod()无限地呼叫自己。

感谢您的建议。

回答

4

您在寻找AOP - 面向方面的编程。

C#不遵循这个范例,但你可以模仿它。 PostSharp是一种选择,但我会用城堡拦截器/ DynamicProxy代替:http://docs.castleproject.org/Windsor.Interceptors.ashx

您需要创建一个拦截器来环绕对象并拦截对它的调用。在运行时,Castle会使这个拦截器扩展你的具体类或实现一个通用接口 - 这意味着你可以将拦截器注入到目标为SomeClass的任何代码块中。 您的代码将是这个样子:

public class Interceptor : IInterceptor 
{ 
    public void Intercept(IInvocation invocation) 
    { 
     invocation.Proceed(); 
     //add your "post execution" calls on the invocation's target 
    } 
} 

编辑

介绍与城堡AOP的:http://docs.castleproject.org/Windsor.Introduction-to-AOP-With-Castle.ashx

拦截和AOP在一般情况下,通常使用的东西,如登录的每个方法调用对象的结果,或者记录任何方法抛出的每个异常。

如果SomeSpecialMethod内部的逻辑是抽象的并且与SomeClass没有真正关联(例如记录),将逻辑移至拦截器本身可能是有意义的 - 但这取决于您。

+0

好的,谢谢你的回答;我不知道AOP。我现在要离开我的代码模式,但我会记住你的答案。 – frenchie

1

我也曾经面临这样的问题,解决它像这样:声明的auxuliary嵌套类(比方说,X)没有任何字段/方法,只有一个构造函数的SomeClass对象,并调用其SomeSpecialMethod()。随后进行的所有SomeClass的方法返回X

public X SomeMethod1() { 
    ... 
    return new X(this); 
} 

当然,还有一个开销,并且可以与非void方法做到这一点(当然,你可以,但它会变得丑陋)。

+1

这比通过每种方法调用事件有什么优势?两者都需要一行(只要您在构造函数中添加处理程序)。 –

+0

@JeroenVannevel自我记录,我猜?这个'X'类可以被命名为'GuaranteedToCallSomeSpecialMethodOnReturn'。 –