2014-02-13 35 views
0

我想在进入方法之前和离开方法之后执行常规操作。这个类很庞大,我不想在整个地方重复代码。是否有任何我可以使用的模式或特定的构造可以帮助我。在输入方法的所有方法之前执行常规操作

+1

“*的类是巨大的*“你可能想要重构它。如果你有太多的方法,在每个方法的顶部添加一个方法调用来执行这个常用操作太麻烦了,那么该类可能需要分解。 –

回答

1

你不应该有巨大的类。我会建议重构并将每个方法表示为Command对象。

您还可以使用方面以所需的方式执行任务。看看PostSharp这样的框架。

0

是的,看着面向方面的编程,例如:

从本质上讲,使用AOP框架一样PostSharp在开始注入代码并按照您提到的结束,并且这可以是动态的或静态的,全部通过应用像这样的属性:

[ExceptionHandler] 
    public void CreateError() { 
    . 
    . 
    } 

其中ExceptionHandler是您创建的自定义属性。一些框架拦截方法调用并运行一些代码,like SimpleInjector

1

这是AOP(面向方面​​编程)的经典案例。 AOP用于执行切入方法/类/包的操作。有关更多信息,请参阅Aspect Oriented Programming

1

先前的答案为您提供了很好的建议和实践,但如果您无法完成重构,并且您可以使用反射,那么可以执行以下操作。

创建一个包装你的HugeClass,其中包括两个方法与你需要和之前做后的方法调用共同操作的包装类,以及暴露一个方法调用任何的包装类方法一起与常见的操作:

public static class HugeClassWrapper 
{ 
    private static HugeClass hugeClass = new HugeClass(); 

    public static void Invoke(Expression<Action<HugeClass>> expression) 
    { 
     CommonOperationBefore();  
     expression.Compile().Invoke(hugeClass); 
     CommonOperationAfter(); 
    } 

    public static TResult Invoke<TResult>(Expression<Func<HugeClass, TResult>> expression) 
    { 
     CommonOperationBefore();  
     TResult result = (TResult)expression.Compile().Invoke(hugeClass); 
     CommonOperationAfter(); 
     return result; 
    } 

    private static void CommonOperationBefore() 
    { 
     // your common operations... 
    } 
    private static void CommonOperationAfter() 
    { 
     // your common operations... 
    } 
} 

我已经包括了Invoke方法的两个重载,原因是能够以调用返回的任何值void的方法或方法。

因此,举例来说,如果你的类是:

public class HugeClass 
{ 
    public string Method1(int a, double b) 
    { 
     return (a * b).ToString(); 
    } 
    // ... 
    public void Method1000() 
    { 
    } 
} 

为了调用该方法,你可以这样做:

string result = HugeClassWrapper.Invoke<string>(x => x.Method1(2, 3.14)); 

HugeClassWrapper.Invoke(x => x.Method1000()); 
相关问题