Внедрение в конструктор Unity с другим параметром
У меня есть класс с конструктором, который выглядит следующим образом:
public BatchService(IRepository repository, ILogger logger, string user)
В моем классе начальной загрузки DI у меня есть следующая команда RegisterType
:
.RegisterType<BatchService>(
new InjectionConstructor(
new ResolvedParameter<IRepository>("SomeRepository"),
new ResolvedParameter<ILogger>("DatabaseLogger")))
В своем клиентском коде я хочу создать экземпляр BatchService
следующим образом:
BatchService batchService = DIContainer.Resolve<BatchService>()
Как вы можете видеть, у меня есть строковый параметр с именем user
как часть конструктора BatchService
который не является частью логики DI. Как мне лучше всего справиться с этой ситуацией, если мне нужно использовать user
в классе BatchService
?
Ответы
Ответ 1
Пожалуйста, не злоупотреблять Unity как ServiceLocator.
Если вы хотите создавать объекты, для которых требуются параметры времени выполнения, используйте factory. Вы даже можете отказаться от реализации этой factory либо с помощью версии Unity Typed Factory, либо пусть Unity генерирует factory делегаты для вас.
Ответ 2
Вы можете использовать ParameterOverride
:
BatchService batchService =
DIContainer.Resolve<BatchService>(new ParameterOverride("user", valueForUser));
Ответ 3
Прежде всего, это не хорошая идея mix ILogger
с бизнес-логикой. Вы можете создать ILogger непосредственно в атрибуте BatchService
или разрешить thru [Dependency]
. DI это не панацея, создание бизнес-объектов не должно зависеть от ILogger
Используйте new InjectionParameter<string>("user")
Посмотрите, пожалуйста, Регистрация введенных параметров и значений свойств для более подробной информации