在Ninject 3.0中使用默认参数值

时间:2012-05-09 14:16:28

标签: c# ninject ninject-3

我有一个带有构造函数的类,其参数具有默认值。使用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]属性是否仍然符合,并且使用可选参数处理注入的最佳方法是什么?

2 个答案:

答案 0 :(得分:16)

在这种情况下会忽略Optional属性,因为始终存在默认值 - 但提供的值为null。默认情况下,Null不是允许的值。

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

答案 1 :(得分:0)

通过像这样配置绑定,您可以避免在全局范围内设置AllowNullInjection的同时仍仅在存在绑定时才注入参数

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

[Optional]