在.NET Core中的ConfigureService-Methods(尤其是IApplicationLifetime)中使用DI

tim*_*001 3 c# .net-core asp.net-core

我正在尝试为IWebHostBuilder执行一些代码的新扩展方法,例如在某处注册。重要的是,它在应用程序关闭时也会注销。

我添加了一些代码来显示我想做什么。这里的问题是,的实例IApplicationLifetime尚不可用。这种新的扩展方法是在构建WebHost的管道中最后添加的。

public static IWebHostBuilder UseHttpGatewayappRegistration(this IWebHostBuilder webHostBuilder)
    {
        webHostBuilder.ConfigureServices(services =>
        {
            var sp = services.BuildServiceProvider();

            // This instance is not available
            IApplicationLifetime applicationLifetime = sp.GetService<IApplicationLifetime>();

            // These instances are ok
            AppSettings appSettings = sp.GetService<AppSettings>();
            ILoggerFactory loggerFactory = sp.GetService<ILoggerFactory>();

            var registration = new Registration(loggerFactory.CreateLogger<Registration>());

            applicationLifetime.ApplicationStopping.Register(() =>
            {
                registration.Unregister();
            });
        });

        return webHostBuilder;
    }
Run Code Online (Sandbox Code Playgroud)

IApplicationLifetime即使在构建WebHost管道的管道中最后添加了此扩展方法,实例为何也为null?这将是巨大的,如果有人向我提供有关的所有“ConfigureServices”方法的执行顺序和如何或者如果它是在所有可能使用一些信息IApplicationLifetimeConfigureServices方法。

我知道无需使用即可完成所有操作WebHostBuilder,但在我看来这样做很合乎逻辑,而且我也认为必须有一种方法。

不幸的是,我在网上找不到太多信息...

谢谢。

编辑:我找到了一种在ConfigureServices方法中使用DI的方法。我相应地编辑了问题。这对我帮助:如何在ASP.NET Core中的ConfigureServices中解析实例

Ily*_*kov 5

您无法IApplicationLifetimeConfigureServices方法访问实例。这是设计使然。在此处检查“启动时可用的服务”部分: ASP.NET Core中的应用程序启动

解决方法(如果以后在配置管道中使用IApplicationLifetimeIWebHostBuilder.Configure方法,它将替换该Startup.Configure方法IWebHostBuilder):

public static IWebHostBuilder Foo(this IWebHostBuilder webHostBuilder)
{
    webHostBuilder.Configure(x =>
    {
        var service = x.ApplicationServices.GetService<IApplicationLifetime>();
    });

    return webHostBuilder;
}
Run Code Online (Sandbox Code Playgroud)

也可以扩展原始Startup.Configure方法而不是替换(应添加很多反射逻辑以使该解决方案可靠):

.Configure(app =>
{
    var env = app.ApplicationServices.GetService<IHostingEnvironment>();
    dynamic startup = Activator.CreateInstance(typeof(TStartup), env);

    //Carefully resolve all input parameters.
    //Make sure all required services are registered in DI.
    startup.Configure(app, env);

    var lifetime = app.ApplicationServices.GetService<IApplicationLifetime>();
})
Run Code Online (Sandbox Code Playgroud)