Использование значений параметров по умолчанию в Ninject 3.0
У меня есть класс с конструктором, имеющим параметр со значением по умолчанию. С 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}
Поставщик возвратил ноль.
Путь активации:
2) Внедрение зависимости IValidator{PersonName} в параметр personNameValidator конструктора типа EmployeeValidator
1) Запрос на IValidator {Сотрудник}
Предложения:
1) Убедитесь, что поставщик правильно обрабатывает запросы на создание.
Это [Optional]
Атрибут все еще учитывается, когда присутствует значение по умолчанию для параметра, и каков наилучший способ обработки инъекций с такими необязательными параметрами, как этот?
1 ответ
Необязательный атрибут игнорируется в этой ситуации, потому что всегда есть доступное значение по умолчанию - но предоставленное значение равно нулю. Ноль не является допустимым значением по умолчанию.
Вы можете переопределить это поведение, установив для NinjectSettings.AllowNullInjection значение true.
Вы можете избежать установки AllowNullInjection
глобально, по-прежнему вводя параметр только при наличии привязки, настроив привязку следующим образом:
Kernel.Bind<IEmployeeValidator>()
.To<EmployeeValidator>()
.WithConstructorArgument(typeof(IValidator<PersonName>), c => c.Kernel.TryGet<IValidator<PersonName>>());
[Optional]
для этого не нужен.