问题
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?
回答1:
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.
回答2:
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.
来源:https://stackoverflow.com/questions/10517962/using-default-parameter-values-with-ninject-3-0