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 に変換したい Factory クラスであることを知っています。

私は最新の Structuremap バージョン 2.54 を使用しています。このバージョンでは、ForRequestedType の使用など、多くのことが非推奨 (または推奨されなくなった) ようです。そのため、新しい表記法を使用してこれを行う正しい方法を探しています。

4

2 に答える 2

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()」構文を使用して型を登録します。

IStateWorker はコンテナーによって管理されるようになったので、コンストラクターの依存関係をそれぞれに追加することができます。解決方法を気にする必要はありません (もちろん、登録は別として)。

于 2010-01-04T20:34:29.643 に答える
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 に答える