在 Startup 类中获取依赖于 DI 的类的实例

Xze*_*non 8 c# dependency-injection .net-core asp.net-core-2.2

我正在运行 .NET Core 2.2 应用程序,我有一些代码想在 Startup.cs 中的初始设置后立即运行。该类依赖于注册类型,我真的不明白我应该如何创建一个已经注入依赖项的实例。假设我有以下类,我想在设置完成后立即运行。

public class RunAfterStartup
{
    private readonly IInjectedService _injectedService;

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

    public void Foo()
    {
        _injectedService.Bar();
    }
}
Run Code Online (Sandbox Code Playgroud)

有没有办法可以RunAfterStartup().Foo()在 Startup 中运行?

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();
}
Run Code Online (Sandbox Code Playgroud)

我知道在 .NET Framework(不确定 Core)中,您可以使用 SimpleInjector 通过执行类似的操作来完成此操作container.GetInstance<RunAfterStartup>().Foo(),但我不确定这在 .NET Core 中是如何工作的,我只想使用内置 DI。

Dav*_*idG 8

首先RunAfterStartupConfigureServices方法中添加到您的服务中:

services.AddSingleton<RunAfterStartup>();
Run Code Online (Sandbox Code Playgroud)

现在你可以将这个类注入到Configure方法中:

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

    runAfterStartup.Foo();
}
Run Code Online (Sandbox Code Playgroud)