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"); 
} 
相關問題