我正在尝试为 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/