3

有没有一种设计模式可以帮助我避免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 应用程序运行。
  • MVC 应用程序与 SessionState 紧密耦合。由于各种原因,我无法模拟 SessionState。
    • 所以在DoThisStepFirst()方法内部,我想初始化 SessionState。
    • 在初始化 SessionState 之后,我想继续使用指定的方法(这就是为什么我怀疑我可能正在寻找“责任链”设计模式)。
4

6 回答 6

4

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

对于 NUnit:

[TestFixtureSetUp]
public void Setup()
{

}

对于 MSTest:

[TestInitialize()]
public void Startup()
{
    //Do setup here
}
于 2011-02-26T18:15:31.827 回答
3

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

    private static void DoSomething(Action doSomethingElse)
    {
        DoThisStepFirst();
        doSomethingElse();
    }
于 2011-02-26T17:46:28.730 回答
3
private static void MethodCommon(Func f)
{
    DoThisStepFirst();
    f();
}

private static void Method1()
{
    MethodCommon(() => 
        doSomething();
    );
}
于 2011-02-26T17:49:05.580 回答
1

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

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

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

换个方向,你可以想象程序中你确实必须在每一步之前进行一些初始化,而且它是相同的初始化,在这种情况下你会被卡住。

于 2011-02-26T17:47:39.917 回答
0

将代码放在 DoThisStepFirst() 它的构造函数中怎么样。如果他们所有人都需要它来运行以便在那里进行初始化,那么操作很有可能会进入那里。除非它重置了在您的方法执行任何操作之前需要重置的状态/行为。

于 2011-02-26T17:46:36.213 回答
0

不,一般没有。也许您可以提供一些有关您要完成的工作的详细信息?

于 2011-02-26T17:46:48.257 回答