I have a class with a constructor having a parameter with a default value. With Ninject 2.2, it would honor the [Optional]
attribute and work fine with no binding defined against a constructor declared like so:
public EmployeeValidator([Optional] IValidator<PersonName> personNameValidator = null)
Since upgrading to Ninject 3.0, construction of this object fails with a message stating that the provider returned null:
Test method ValidatorIsolated.Tests.EmployeeValidatorTest.CreateEmployeeValidatorTest threw exception:
Ninject.ActivationException: Error activating IValidator{PersonName} using conditional implicit self-binding of IValidator{PersonName}
Provider returned null.
Activation path:
2) Injection of dependency IValidator{PersonName} into parameter personNameValidator of constructor of type EmployeeValidator
1) Request for IValidator{Employee}
Suggestions:
1) Ensure that the provider handles creation requests properly.
Is the [Optional]
attribute still honored when a default value for a parameter is present and what is the best way to handle injection with optional parameters such as this?
You can avoid setting AllowNullInjection
globally while still injecting a parameter only when a binding exists by configuring your binding like this:
Kernel.Bind<IEmployeeValidator>()
.To<EmployeeValidator>()
.WithConstructorArgument(typeof(IValidator<PersonName>), c => c.Kernel.TryGet<IValidator<PersonName>>());
[Optional]
is not needed for that.
The Optional Attribute is ignored in this situation because there is always the default value available- But the provided value is null. Null is not an allowed value by default.
You can override this behavior by setting NinjectSettings.AllowNullInjection to true.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With