在Ninject 1.0中,我有以下绑定定义:
Bind<ITarget>().To<Target1>().Only(When.Context.Variable("variable").EqualTo(true));
Bind<ITarget>().To<Target2>();
Run Code Online (Sandbox Code Playgroud)
鉴于我有这样的绑定:
ITarget target = kernel.Get<ITarget>(With.Parameters.ContextVariable("variable", true));
ITarget target = kernel.Get<ITarget>(With.Parameters.ContextVariable("variable", false));
Run Code Online (Sandbox Code Playgroud)
第一个调用被解析为Target1的实例,第二个调用被解析为Target2的实例.
如何将其翻译成Ninject 2.0?
parameters ninject conditional-binding contextual-binding ninject-2
我试图理解Ninject Contextual Binding.我理解在设计时我了解我的背景的场景.例如,当我想在测试类中使用它时,我可以使用命名属性将DB对象绑定到模拟数据库,当我从实际代码中使用它时,可以使用命名属性绑定到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<....>();
}
}
Run Code Online (Sandbox Code Playgroud)
那么,我怎样才能用最少量的自定义代码来实现呢?我想请求特定的代码示例,而不是关于上下文绑定的文章/ wiki /教程的链接.