12

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

4

2 回答 2

17

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

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

于 2012-05-09T15:57:35.817 回答
2

您可以通过如下配置绑定来避免AllowNullInjection全局设置,同时仅在绑定存在时才注入参数:

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

[Optional]不需要这样做。

于 2019-12-03T15:04:27.407 回答