Внедрение в конструктор 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") Посмотрите, пожалуйста, Регистрация введенных параметров и значений свойств для более подробной информации