4

NinjectContextualBindingを理解しようとしています。設計時に自分のコンテキストを知っているシナリオを理解しています。たとえば、名前付き属性を使用して、テストクラスで使用する場合はDBオブジェクトをモックDBにバインドし、実際のコードから使用する場合はSQLDBにバインドできることを理解しています。

ただし、実行時にコンテキストバインディングを処理する方法がわかりません。たとえば、私がショッピングセンター用のソフトウェアを書いているとしましょう。店主は、請求にキーボードまたはバーコードスキャナーを使用できます。事前にどちらを使うのかわかりません。そして彼は将来、RFIDのような他のスキャン方法を追加するかもしれません。

だから私は次のことをしています:

interface IInputDevice
{
    public void PerformInput();
}

class KeyboardInput : IInputDevice
{
    public void PerformInput()
    {
        Console.Writeline("Keyboard");      
    }  
}

class BarcodeInput : IInputDevice
{
    public void PerformInput()
    {
        Console.Writeline("Barcode");             
    }
}

class Program
{
    static void Main()
    {
        IKernel kernel = new StandardKernel(new TestModule());

        var inputDevice = kernel.Get<IInputDevice>();

        inputDevice.PerformInput();

        Console.ReadLine();
    }
}

public class TestModule : Ninject.Modules.NinjectModule
{
    public override void Load()
    {
        Bind<IInputDevice>().To<....>();
    }
}

では、どうすれば最小限のカスタムコードでそれを実行できますか?コンテキストバインディングに関する記事/ウィキ/チュートリアルへのリンクではなく、特定のコード例をリクエストしたいと思います。

4

1 に答える 1

7

どちらを使用するかを決定するには、いくつかの基準が必要になります。例:App.configまたはデバイス検出。次に、条件付きバインディングを使用します。

Bind<IInputDevice>().To<KeyboardInput>().When(KeyboardIsConfigured);
Bind<IInputDevice>().To<BarcodeInput>().When(BarcodeReaderIsConfigured);

public bool KeyboardIsConfigured(IContext ctx)
{
    // Some code to decide if the keyboard shall be used
}

public bool BarcodeReaderIsConfigured(IContext ctx)
{
    // Some code to decide if the barcode reader shall be used
}
于 2011-05-29T23:48:34.957 に答える