Получить экземпляр класса, который опирается на DI в классе запуска - PullRequest
4 голосов
/ 09 января 2020

Я запущен. NET Приложение Core 2.2, и у меня есть немного кода, который я хочу запустить сразу после начальной настройки в Startup.cs. Класс опирается на зарегистрированный тип, и я не совсем понимаю, как я должен создать isntance с уже введенными зависимостями. Допустим, у меня есть следующий класс, который я хочу запустить сразу после завершения установки.

public class RunAfterStartup
{
    private readonly IInjectedService _injectedService;

    public RunAfterStartup(IInjectedService injectedService)
    {
        _injectedService = injectedService;
    }

    public void Foo()
    {
        _injectedService.Bar();
    }
}

Есть ли способ запустить RunAfterStartup().Foo() при запуске?

public void ConfigureServices(IServiceCollection services)
{
    services.AddSingleton(typeof(IInjectedService), typeof(InjectedService));
    ...
}

public void Configure(IApplicationBuilder app)
{
    app.UseMvc();

    // I assume this has to go here, but could be anywhere
    var runAfterStartup = MagicallyGetInstance();
    runAfterStartup.Foo();
}

Я знаю, что в. NET Framework (не уверен в Core) вы могли бы сделать это с помощью SimpleInjector, выполнив что-то вроде container.GetInstance<RunAfterStartup>().Foo(), но я не уверен, как это работает. NET Core, и я хотел бы просто используйте встроенный DI.

Ответы [ 2 ]

4 голосов
/ 09 января 2020

Сначала добавьте RunAfterStartup к вашим услугам в методе ConfigureServices:

services.AddSingleton<RunAfterStartup>();

Теперь вы можете добавить этот класс в метод Configure:

public void Configure(IApplicationBuilder app, RunAfterStartup runAfterStartup)
{
    app.UseMvc();

    runAfterStartup.Foo();
}
0 голосов
/ 09 января 2020

Вы можете получить доступ к контейнеру внедрения зависимостей из переданных параметров:

public void Configure(IApplicationBuilder app)
{
    app.UseMvc();

    // I assume this has to go here, but could be anywhere
    var runAfterStartup = app.ApplicationServices.GetService<IInjectedService>();
    runAfterStartup.Foo();
}
...