Ninject Contextual Binding в RunTime - PullRequest
4 голосов
/ 30 мая 2011

Я пытаюсь понять Ninject Contextual Binding.Я понимаю сценарии, в которых я знаю свой контекст во время разработки.например, я понимаю, что могу использовать именованные атрибуты, чтобы связать объект БД с фиктивной БД, когда я хочу использовать его в тестовом классе, и с БД SQL, когда я использую его из своего реального кода.

Однако я не знаю, как обрабатывать контекстную привязку во время выполнения.Например, допустим, я пишу программное обеспечение для торгового центра.Продавец может использовать клавиатуру для выставления счетов или сканер штрих-кода.Я не знаю, какой он будет использовать заранее.И он может добавить другие способы сканирования, такие как 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<....>();
    }
}

Итак, как я могу сделать это с наименьшим количеством пользовательского кода?Я хотел бы запросить конкретные примеры кода, а не ссылки на статьи / вики / руководства по контекстному связыванию.

1 Ответ

7 голосов
/ 30 мая 2011

Вам понадобятся некоторые критерии, чтобы решить, какой из них будет использоваться.Например, 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
}
...