使用构造函数参数

时间:2016-06-27 08:59:49

标签: c# ninject ioc-container ninject-extensions contextual-binding

我正在尝试进行上下文绑定,但无法将具体的实现接口绑定为构造函数参数。 Ninject版本:3.2.0.0

我的结构如下:

INotifier 1. XNotifier 2. YNotifier

IPublisher 1. APublisher 2. BPublisher

其中XNotifier和YNotifier采用IPublisher类型的构造函数参数。

这是我的绑定:

Bind<INotifier>()
          .To<XNotifier>()
          .When(x => notifictionControl.ToLower() == "xnotification" )
          .WithConstructorArgument("Publisher",ctx=>Kernel.Get<IPublisher>());


        Bind<INotifier>()
        .To<YNotifier>()
        .When(x => notifictionControl.ToLower() == "ynotification" )
        .WithConstructorArgument("Publisher", ctx => Kernel.Get<IPublisher>());

用法:

 IParameter parameter = new ConstructorArgument("Publisher", publisher);
        var notifier = kernel.Get<INotifier>(parameter);

但是收到以下错误

激活INotifier时出错 没有匹配的绑定可用,并且该类型不可自我绑定。

1 个答案:

答案 0 :(得分:0)

您的示例代码使用了绑定完成位置的本地值。我推测这是错误的=不是你想要的。

发生错误是因为在解析绑定时没有When条件匹配。 换句话说:当Ninject被要求返回INotifier时,它将评估When绑定的所有INotifier条件,然后解析匹配的那个。{ / p>

When条件只应在运行时使用时有时想要实例化&#34; A&#34;和其他时间&#34; B&#34;。如果在内核实例化过程中它已经知道要做什么,那么你应该调整你的代码:

if(notifictionControl.ToLower() == "xnotification")
{
    Bind<INotifier>()...
}
else if(notifictionControl.ToLower() == "ynotification")
{
    Bind<INotifier>()...
}
else
{ 
    throw new Exception("invalid config");
}