【问题标题】:Using default parameter values with Ninject 3.0在 Ninject 3.0 中使用默认参数值
【发布时间】:2012-05-09 14:16:28
【问题描述】:

我有一个类,它的构造函数有一个带默认值的参数。在 Ninject 2.2 中,它会尊重 [Optional] 属性并在没有定义绑定的情况下对这样声明的构造函数正常工作:

public EmployeeValidator([Optional] IValidator<PersonName> personNameValidator = null)

自从升级到 Ninject 3.0 后,此对象的构造失败并显示一条消息,指出提供者返回 null:

测试方法ValidatorIsolated.Tests.EmployeeValidatorTest.CreateEmployeeValidatorTest 抛出异常:

Ninject.ActivationException:使用 IValidator{PersonName} 的条件隐式自绑定激活 IValidator{PersonName} 时出错

提供者返回 null。

激活路径:

2) 将依赖 IValidator{PersonName} 注入到 EmployeeValidator 类型的构造函数的参数 personNameValidator 中

1) 请求 IValidator{Employee}

建议:

1) 确保提供者正确处理创建请求。

当存在参数的默认值时,[Optional] 属性是否仍然有效?使用诸如此类的可选参数处理注入的最佳方法是什么?

【问题讨论】:

    标签: c# ninject ninject-3


    【解决方案1】:

    在这种情况下,可选属性被忽略,因为始终有可用的默认值 - 但提供的值为 null。默认情况下,Null 不是允许的值。

    您可以通过将 NinjectSettings.AllowNullInjection 设置为 true 来覆盖此行为。

    【讨论】:

    • 这是有道理的。谢谢雷莫!
    • @The Davester:闻起来像一个请求改进错误消息的拉取请求:P
    • NinjectSettings.AllowNullInjection 通常是 `kernel.Settings' 属性,对于那些假设它是静态属性的人。
    【解决方案2】:

    您可以避免在全局设置AllowNullInjection,同时仅在存在绑定时才注入参数,方法是像这样配置您的绑定:

    Kernel.Bind<IEmployeeValidator>()
          .To<EmployeeValidator>()
          .WithConstructorArgument(typeof(IValidator<PersonName>), c => c.Kernel.TryGet<IValidator<PersonName>>());
    

    [Optional] 不需要。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-01
      • 2012-09-10
      • 1970-01-01
      • 1970-01-01
      • 2017-10-11
      • 2012-07-05
      • 2011-10-10
      相关资源
      最近更新 更多