我正在尝试为执行某些代码的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
您无法从IApplicationLifetime
方法访问ConfigureServices
实例。这是设计的。查看“启动时可用的服务”部分:Application Startup in ASP.NET Core。
在IApplicationLifetime
方法中解析IWebHostBuilder.Configure
(如果稍后在Startup.Configure
配置管道中使用它,它将替换IWebHostBuilder
方法):
public static IWebHostBuilder Foo(this IWebHostBuilder webHostBuilder)
{
webHostBuilder.Configure(x =>
{
var service = x.ApplicationServices.GetService<IApplicationLifetime>();
});
return webHostBuilder;
}
也可以扩展原始的Startup.Configure
方法而不是替换(应该添加许多Reflection逻辑以使此解决方案可靠):
.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>();
})