c# - 在 .NET Core 的 ConfigureService-Methods(特别是 IApplicationLifetime)中使用 DI

标签 c# asp.net-core .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;
    }

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

我知道我可以在没有 WebHostBuilder 的情况下完成这一切,但我觉得在那里做这件事似乎是合乎逻辑的,我也认为必须有办法。

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

谢谢。

编辑:我在 ConfigureServices 中找到了使用 DI 的方法方法。我相应地编辑了问题。这对我有帮助:How to Resolve Instance Inside ConfigureServices in ASP.NET Core

最佳答案

您无法从 ConfigureServices 方法访问 IApplicationLifetime 实例。这是设计使然。在此处检查“启动时可用的服务”部分: Application Startup in ASP.NET Core .

IWebHostBuilder.Configure方法中解析IApplicationLifetime(如果后面在IWebHostBuilder中用到,则替换Startup.Configure方法 配置管道):

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

    return webHostBuilder;
}

也可以扩展原来的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>();
})

关于c# - 在 .NET Core 的 ConfigureService-Methods(特别是 IApplicationLifetime)中使用 DI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43650240/

相关文章:

c# - 依赖注入(inject)到 {get;设置;} 属性

c# - Cron 表达式验证器

c# - 如何使用 ASP.net Core 在布局 View 中获取 url?

c# - Azure C# - 更新行中的特定条目

c# - 在 C# MonoMac 中动态创建控件/对象(NSButton、NSLabel)

configuration - .net 核心中用户 secret 的工作流程?

asp.net-core - 从 Visual Studio 代码运行 blazor

c# - postman 以 json 和图像发送数据

c# - 如何使用 System.Text.Json 将所有 `Nullable<T>` 值类型的空字符串反序列化为空值?

c# - 使用 Syncfusion.XlsIO 将 .xlsx 文件转换为 .csv - 空引用异常