如何使用structuremap正确实现statemachine / Factory?

时间:2010-01-03 19:13:05

标签: structuremap factory state-machine

假设我有一个传统的状态机/工厂实现像

public class StateMachine
{
    public void ProcessState(StateEnum CurrentState)
    {
        switch (CurrentState)
        {
            case StateEnum.New:
                ProcessNewState();
                break;
            case StateEnum.Waiting:
                ProcessWaitingState();
                break;
            ++++ More states.....
        }
    }

    void ProcessWaitingState()
    {
        //Do State work
    }

    void ProcessNewState()
    {
        //Do State work
    }
}

但现在我想使用最佳实践(TDD,SOLID ...)和结构图来实现这一点。

要遵循单一责任原则,我想将每个州的处理代码放在不同的类中。此外,每个类都有自己的一组独特的依赖关系,它们可能非常复杂。因此,我认为将它们放在不同的课程中是一个好主意。

那么,我怎样才能在Structuremap中正确执行此操作?

我知道这基本上是一个我要转换为Objectfactory的Factory类。

我正在使用最新的Structuremap版本2.54,在这个版本中,很多东西似乎已经被弃用(或者不再推荐),比如使用ForRequestedType。所以我正在寻找使用新符号的正确方法。

2 个答案:

答案 0 :(得分:0)

我找到了我要找的东西

首先我使用注册:

For<IStateWorker>().Add<WorkerState_NewState>().Named("new");
For<IStateWorker>().Add<WorkerState_WaitingState>().Named("waiting");

然后我用它来调用它:

        Worker = ObjectFactory.GetNamedInstance<IStateWorker>("waiting");
        Worker.Execute();
        Worker = ObjectFactory.GetNamedInstance<IStateWorker>("new");
        Worker.Execute();

有效。

但我的问题仍然是,如果有更好的方法吗?

答案 1 :(得分:0)

根据您的问题和答案,您可以在注册表中使用枚举值的字符串表示形式作为命名实例的名称:

For<IStateWorker>().Add<WorkerState_NewState>().Named(StateEnum.New.ToString()); 

在您的工厂代码中:

public void ProcessState(StateEnum CurrentState)  
{  
   Worker = ObjectFactory.GetNamedInstance<IStateWorker>(CurrentState.ToString());
   Worker.Execute();
}  

考虑上面是伪代码,因为我显然没有你的源代码,我通常使用“ForRequestedType&lt;&gt;()。AddInstances()”语法来注册类型。

由于您的IStateWorkers现在由容器管理,您可以为每个容器添加构造函数依赖项,而不必担心它们如何得到解决(当然,在注册它们之外)。

相关问题