在Ninject 3.0中使用默认参数值

问题描述 投票:11回答:2

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

我有一个带有构造函数的类,该构造函数的参数值为默认值。使用Ninject 2.2,它将使用[Optional]属性,并且可以在没有针对构造函数定义的绑定的情况下正常工作...

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

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

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

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

不需要[[Optional]
c# ninject ninject-3
2个回答
16
投票
在这种情况下,可选属性将被忽略,因为始终有默认值可用-但是提供的值为null。默认情况下,Null不是允许的值。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.