0

可以说我有一个传统的状态机/工厂,如

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。

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

4

2 回答 2

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();

这样可行。

但是我的问题仍然存在,是否有更好的方法呢?

于 2010-01-03T20:11:07.327 回答
0

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

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

在您的工厂代码中:

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

认为上面是伪代码,因为我显然没有你的源代码,我通常使用“ForRequestedType<>().AddInstances()”语法来注册类型。

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

于 2010-01-04T20:34:29.643 回答