Использование значений параметров по умолчанию в 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] для этого не нужен.

Другие вопросы по тегам