0

我想要做上下文绑定但不能将具体实现接口绑定为构造函数参数。 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 没有匹配的绑定是可用的,并且类型不可自行绑定。

+0

为什么你传递参数到'获取'? – MaKCbIMKo

+0

@MaKCbIMKo:实现INotifier的类的构造函数期望IPublisher的具体实现。 – AnandSonake

+0

但是您已经在绑定中指定了构造函数参数。你为什么再做一次? – MaKCbIMKo

回答

0

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

发生此错误的原因是When条件在绑定解析时没有匹配。 或者换句话说:当Ninject被要求返回INotifier时,它将评估INotifier绑定的所有When条件,然后解析匹配的条件。

When条件应该只用于运行时有时你想实例化“A”和其他时间“B”。如果内核化期间,它已经知道该做的,那么你应该调整你的代码如下所示:

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