设计模式:许多方法共享相同的第一步

时间:2011-02-26 17:38:27

标签: c# unit-testing asp.net-mvc-2 design-patterns chain-of-responsibility

是否有一种设计模式可以帮助我避免在许多方法中重复DoThisStepFirst()

class Program
{
    static void Main(string[] args)
    {
        Method1();
        Method2();
        MethodN();
    }

    private static void DoThisStepFirst()
    {
        // Implementation
    }

    private static void Method1()
    {
        DoThisStepFirst();
        // Implementation
    }

    private static void Method2()
    {
        DoThisStepFirst();
        // Implementation
    }

    // {...}

    private static void MethodN()
    {
        DoThisStepFirst();
        // Implementation
    }
}

编辑1:我只想说,这是一个人为的例子 我的实际实现包括带参数的方法签名和每种方法中的非平凡操作。

编辑2:

  • @Marc Gravell建议使用面向方面编程。是的,这可能对我有帮助。
  • 我也在想,责任链模式也可以帮助我。

@Charlie Martin希望了解更多有关该计划的信息。 所以这就是我实际上要做的事情。

  • 我正在尝试设置一个测试工具来针对' m '控制器和' n '控制器方法的ASP.NET MVC 2应用程序运行。< / LI>
  • MVC应用程序与SessionState紧密结合。由于种种原因,我无法模拟SessionState。
    • 所以在DoThisStepFirst()方法的内部,我想初始化SessionState。
    • 在初始化SessionState之后,我想继续使用指定的方法(这就是为什么我怀疑我可能会寻求'责任链'设计模式)。

6 个答案:

答案 0 :(得分:4)

如果它是一个测试工具,那么你的单元测试框架应该有一个TestFixtureSetup方法,它将在你的测试运行之前先运行:

对于NUnit:

[TestFixtureSetUp]
public void Setup()
{

}

对于MSTest:

[TestInitialize()]
public void Startup()
{
    //Do setup here
}

答案 1 :(得分:3)

我猜你可以有一个方法总是调用DoThisStepFirst()然后执行传递的操作:

    private static void DoSomething(Action doSomethingElse)
    {
        DoThisStepFirst();
        doSomethingElse();
    }

答案 2 :(得分:3)

private static void MethodCommon(Func f)
{
    DoThisStepFirst();
    f();
}

private static void Method1()
{
    MethodCommon(() => 
        doSomething();
    );
}

答案 3 :(得分:1)

老实说,如果不了解更多关于pgram的内容,就无法回答这个问题。看起来“DoThisStepFirst”是某种初始化;这很容易想到

  DoThisStepFirst();
  Method1(); // and so on

等等,但似乎每个方法都需要初始化。那么接下来的问题是“为什么每个方法都在状态中徘徊,所以你需要继续重新初始化?”

走另一个方向,你可以想象你必须在每个步骤中进行一些初始化的程序,并且它是相同的初始化,在这种情况下你很好地卡住了。

答案 4 :(得分:0)

如何在构造函数中将代码放入DoThisStepFirst()中。如果所有人都需要它来运行才能在那里进行操作,那么操作就很有可能进入那里。除非它重置在方法执行任何操作之前需要重置的状态/行为。

答案 5 :(得分:0)

不,通常没有。也许你可以提供一些关于你想要完成什么的细节?