6

戦略設計パターンを使用する必要があるクラスがあります。実行時に、さまざまなアルゴリズムを切り替えて、アプリケーションのパフォーマンスへの影響を確認する必要があります。

問題のクラスは現在、コンストラクターで 4 つのパラメーターを取り、それぞれがアルゴリズムを表しています。

Ninject (または一般化されたアプローチ) を使用して IOC を使用しながら戦略パターンを使用するにはどうすればよいですか?

現在の制限は、カーネル (コンテナー) が各アルゴリズム インターフェイスを認識していることですが、それは 1 つの具体的なクラスにしかバインドできないということです。現時点でこれを回避する唯一の方法は、構築時に 8 つのアルゴリズムすべてを渡すことですが、異なるインターフェイスを使用しますが、これはまったく必要ないようです。IOC コンテナーを使用していなければ、これを行うことはないので、何らかの方法でこれを回避する必要があります。

コード例:

class MyModule : NinjectModule 
{
    public override void Load() 
    {
        Bind<Person>().ToSelf();
        Bind<IAlgorithm>().To<TestAlgorithm>();
        Bind<IAlgorithm>().To<ProductionAlgorithm>();
    }
}

実行時に切り替えることができるように、人は両方のアルゴリズムを利用する必要があります。ただし、TestAlgorithm はコンテナー内の最初のものであるため、バインドされているのは TestAlgorithm だけです。

4

2 に答える 2

6

一歩下がって、もう少し大きな画像を見てみましょう。実行時にストラテジーを切り替えられるようにする必要があるため、パーソンにストラテジーを切り替えるように指示する何らかのシグナル メカニズムが必要です。アプリケーションが UI 駆動型の場合、ユーザーが使用する戦略を選択できるボタンまたはドロップダウン リストがある可能性がありますが、そうでない場合でも、一部の外部呼び出し元がランタイム データの一部を戦略のインスタンス。

ランタイム インスタンスを依存関係にマップする必要がある場合の標準的な DI ソリューションは、 Abstract Factory を使用することです。

個々の戦略をコンテナに登録する代わりに、ファクトリを登録します。

完全な API を記述してDI に適したものにすることは完全に可能ですが、それでも DI コンテナーに依存しません

于 2010-03-06T14:24:10.660 に答える
3

IAlgorithm実行時に実装を変更する必要がある場合は、実行時の条件に基づいてさまざまな具体的なアルゴリズムを提供Personするアルゴリズムファクトリを要求するように変更できます。

一部の依存性注入コンテナーでは、匿名の作成デリゲートにバインドできます。Ninject がそれをサポートしている場合は、それらの 1 つに決定ロジックを配置できます。

于 2010-03-06T14:20:59.857 に答える