使用Ninject 3.0的默认参数值

12

我有一个类,其中构造函数带有一个默认值的参数。使用 Ninject 2.2,它将遵循 [Optional] 属性并正常工作,即使没有针对这样声明的构造函数定义绑定

public EmployeeValidator([Optional] IValidator<PersonName> personNameValidator = null)
自从升级到 Ninject 3.0 后,构建该对象失败,并出现消息说明提供程序返回了 null 值:

测试方法 ValidatorIsolated.Tests.EmployeeValidatorTest.CreateEmployeeValidatorTest 引发异常:

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

提供程序返回 null 值。

激活路径:

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

1) 请求 IValidator{Employee}

建议:

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

当有参数的默认值时,[Optional] 属性是否仍然有效,并且处理可选参数注入的最佳方式是什么?
2个回答

17

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

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


@The Davester:闻起来像是一个改进错误信息的拉取请求:P - Ruben Bartelink
3
NinjectSettings.AllowNullInjection 通常是 kernel.Settings 属性,对于那些假设它是静态属性的人来说。 - nicodemus13

2
您可以通过像这样配置绑定来仅在存在绑定时注入参数,而无需全局设置AllowNullInjection

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

[Optional]不需要用于此。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接