Ninject多个绑定的构造函数参数

时间:2017-10-18 22:16:57

标签: c# 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>();

但没有骰子 - 我得到旧的#34;没有匹配的绑定可用&#34;错误。

有没有办法指定这样的构造函数参数,而不是将它提升为它自己的可绑定类型,或者为类实现的每个接口重复它?

2 个答案:

答案 0 :(得分: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);

希望它有所帮助。

答案 1 :(得分:0)

只为两个服务接口创建一个绑定:

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