.net 运行时的Ninject上下文绑定

.net 运行时的Ninject上下文绑定,.net,dependency-injection,ninject,contextual-binding,.net,Dependency Injection,Ninject,Contextual Binding,我试图理解Ninject上下文绑定。我了解在设计时了解上下文的场景。e、 g.我知道,当我想在测试类中使用DB对象时,我可以使用命名属性将其绑定到模拟DB,当我从实际代码中使用它时,我可以将其绑定到SQL DB 但是,我不知道如何在运行时处理上下文绑定。e、 假设我正在为一家购物中心编写软件。店主可以使用键盘或条形码扫描仪进行计费。我不知道他会事先用哪一个。他可能会在将来的某个时候添加其他扫描方式,比如RFID 因此,我有以下几点: interface IInputDevice { pu

我试图理解Ninject上下文绑定。我了解在设计时了解上下文的场景。e、 g.我知道,当我想在测试类中使用DB对象时,我可以使用命名属性将其绑定到模拟DB,当我从实际代码中使用它时,我可以将其绑定到SQL DB

但是,我不知道如何在运行时处理上下文绑定。e、 假设我正在为一家购物中心编写软件。店主可以使用键盘或条形码扫描仪进行计费。我不知道他会事先用哪一个。他可能会在将来的某个时候添加其他扫描方式,比如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<....>();
    }
}
接口IIInputDevice
{
公开无效性能put();
}
类键盘输入:IInputDevice
{
公开发售
{
控制台写入线(“键盘”);
}  
}
类别条形码输入:IIInputDevice
{
公开发售
{
控制台写入线(“条形码”);
}
}
班级计划
{
静态void Main()
{
IKernel kernel=新的标准内核(新的TestModule());
var inputDevice=kernel.Get();
inputDevice.PerformInput();
Console.ReadLine();
}
}
公共类TestModule:Ninject.Modules.NinjectModule
{
公共覆盖无效负载()
{
绑定()到();
}
}

那么,我怎样才能用最少的自定义代码来完成呢?我想请求特定的代码示例,而不是指向上下文绑定的文章/维基/教程的链接。

您需要一些标准来决定使用哪一个。例如,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
}
Bind().To().When(键盘配置);
绑定().To().When(条形码阅读器配置);
已配置公用布尔键盘(IContext ctx)
{
//决定是否使用键盘的一些代码
}
已配置公共bool条形码阅读器(IContext ctx)
{
//决定是否使用条形码阅读器的一些代码
}