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

2024-05-09

我正在尝试实现一种新的扩展方法IWebHostBuilder执行一些代码,比如在某个地方注册。 重要的是,当应用程序关闭时它也会取消注册。

我添加了一些代码来显示我想要做什么。这里的问题是,实例IApplicationLifetime尚不可用。添加了这个新的扩展方法last在构建 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;
    }

为什么是IApplicationLifetime实例 null,即使我在构建 WebHost 管道的管道中最后添加了此扩展方法?如果有人能为我提供一些有关所有“ConfigureServices”方法的执行顺序以及如何或是否可以使用的信息,那就太好了IApplicationLifetime in a ConfigureServices方法。

我知道我可以做到这一切,无需WebHostBuilder,但对我来说在那里这样做似乎是合乎逻辑的,而且我也认为必须有一种方法。

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

谢谢。

EDIT:我找到了一种使用 DI 的方法ConfigureServices方法。我相应地编辑了问题。这帮助了我:如何在 ASP.NET Core 中解析ConfigureServices内部的实例 https://stackoverflow.com/questions/31863981/how-to-resolve-instance-inside-configureservices-in-asp-net-core


您无法访问IApplicationLifetime实例来自ConfigureServices方法。这是设计使然。在此处检查“启动时可用的服务”部分:ASP.NET Core 中的应用程序启动 https://learn.microsoft.com/en-us/aspnet/core/fundamentals/startup.

Resolve IApplicationLifetime in the IWebHostBuilder.Configure方法(它取代了Startup.Configure方法(如果稍后使用)IWebHostBuilder配置管道):

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

    return webHostBuilder;
}

也可以extend原本的Startup.Configure方法而不是replace(为了使这个解决方案可靠,应该添加大量的反射逻辑):

.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>();
})
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐