2017-10-18 89 views
0

Ninject構造函數參數我有一個簡單的類我使用的處理通知。的多個綁定

public class ApplePushNotifier : IApplePushNotifier 
{ 
    public ApplePushNotifier(
     ILog log, 
     IMessageRepository messageRepository, 
     IUserRepository userRepository, 
     CloudStorageAccount account, 
     string certPath) 
    { 
     // yadda 
    } 

    // yadda 
} 

和簡單Ninject結合,其中包括字符串參數查找本地證書文件:

kernel.Bind<IApplePushNotifier>().To<ApplePushNotifier>() 
      .WithConstructorArgument("certPath", 
       System.Web.Hosting.HostingEnvironment.MapPath("~/bin/apns_universal.p12")); 

這顯然是非常基本的,並且一切都很好工作。現在,我已經添加了第二個界面的那類:

public class ApplePushNotifier : IApplePushNotifier, IMessageProcessor 

我可以添加這樣的第二結合:

kernel.Bind<IMessageProcessor>().To<ApplePushNotifier>() 
      .WithConstructorArgument("certPath", 
       System.Web.Hosting.HostingEnvironment.MapPath("~/bin/apns_universal.p12")); 

而這也工作,但複製構造函數的參數給我的蕁麻疹。我試圖添加一個明確的自我約束如下:

 kernel.Bind<ApplePushNotifier>().To<ApplePushNotifier>() 
      .WithConstructorArgument("certPath", 
       System.Web.Hosting.HostingEnvironment.MapPath("~/bin/apns_universal.p12")); 
     kernel.Bind<IApplePushNotifier>().To<ApplePushNotifier>(); 
     kernel.Bind<IMessageProcessor>().To<ApplePushNotifier>(); 

但沒有骰子 - 我得到舊的「沒有匹配的綁定可用」錯誤。

有沒有辦法指定一個構造函數的參數像這樣沒有,要麼推動到可綁定類型它自己的,或重複它是類實現的每個接口?

回答

0

只要創建只由一個服務的接口綁定:

kernel.Bind<IApplePushNotifier, IMessageProcessor>().To<ApplePushNotifier>() 
    .WithConstructorArgument(
     "certPath", System.Web.Hosting.HostingEnvironment.MapPath("~/bin/apns_universal.p12")) 
+0

簡直太容易了!我知道必須有一個簡單的方法來處理這個問題,謝謝! – superstator

0

根據ApplePushNotifier的內部工作的性質,然後綁定到一個常數可以幫助,並會防止重複自己。

kernel.Bind<ApplePushNotifier>().ToSelf() 
     .WithConstructorArgument("certPath", System.Web.Hosting.HostingEnvironment.MapPath("~/bin/apns_universal.p12")); 

    var applePushNotifier = Kernel.Get<ApplePushNotifier>(); 

    kernel.Bind<IApplePushNotifier>().ToConstant(applePushNotifier); 
    kernel.Bind<IMessageProcessor>().ToConstant(applePushNotifier); 

希望它能幫助。