Можно ли создать зарегистрированный класс для внедрения без ссылки в конструкторе? - PullRequest
0 голосов
/ 09 апреля 2019

Я внедряю объект в ConfigureServices(), и я надеялся создать экземпляр объекта без ссылки в конструкторе. Есть ли способ сделать это?

Например, мне позвонили в службу поддержки вот так:

services.CreateObjectBus<RecordingChunk>(p =>
    p.Configure(Configuration["AzureServiceBus:ConnectionString"], Queues.Editor,
        ObjectBus.BusType.Sender));

Я бы хотел, чтобы это работало в основном как фоновый работник. У меня есть ощущение, что это должно быть в отдельном проекте или в случайном вызове конструктора, хотя это было бы не идеально. Есть ли для меня способ сделать это?

Редактировать

Чтобы уточнить, я внедряю объект, как показано выше, который вызывает следующее, чтобы зарегистрировать его в DI.

serviceCollection.AddScoped<IObjectBus<T>, ObjectBus<T>>();

Я бы хотел, чтобы этот объект существовал в фоновом режиме, а не запрашивал его в конструкторе следующим образом:

public EditorRepository(IObjectBus<Vocalia.ServiceBus.Types.Podcast> podcastBus)
{
    //podcastBus object isn't interacted with, but it needs to be instantiated.
}

Мне не нужно взаимодействовать с этим объектом, скажем так, он просто должен существовать для установления соединений с базой данных и служебной шиной.

1 Ответ

1 голос
/ 09 апреля 2019

Если я правильно понял, вы хотите вручную запустить внедрение зависимостей.Ты можешь это сделать.Просто введите IServiceProvider в ваш конструктор и сохраните его.Затем, когда вам это нужно, просто создайте область и затем разрешите службы в соответствии с вашими потребностями:

using (var serviceScope = m_ServiceProvider.CreateScope())
{
    var service = serviceScope.ServiceProvider.GetService<IMyService>());
    ...
}

Обновление Имейте в виду, что указание того, что вам нужно в конструкторе, действительноправильный путь, поскольку вы четко определяете, какие вещи вам нужно высмеивать во время тестирования.

Этот подход может использоваться в определенных конкретных (и экстремальных) сценариях, но его следует избегать, поскольку вы скрываете истинные зависимости.

...