我正在寻找有关如何在我的 ASP.NET Core 2.0 应用程序关闭时正确和安全地处理已注册的单例实例的指导。
根据以下文档,如果我注册一个单例实例(通过 IServiceCollection),容器将永远不会尝试创建一个实例(它也不会处理该实例),因此当应用程序关闭时,我只能自己处理这些实例.
https://docs.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection?view=aspnetcore-2.0(2.1有相同的指导)
我附上了一些伪代码来说明我想要实现的目标。
注意我必须维护对 IServiceCollection 的引用,因为提供给 OnShutDown 方法的 IServiceProvider 是一个简单的服务定位器,并且不能执行复杂的查询。
当应用程序关闭时,我想要一种通用的方法来确保所有的单例实例都被处理掉。我可以直接维护对所有这些单例实例的引用,但这不能很好地扩展。
我最初使用工厂方法来确保 DI 管理我的对象的生命周期,但是,工厂方法的执行发生在运行时处理请求的管道中,这意味着如果它抛出异常,则响应为 500 InternalServerError并记录了一个错误。通过直接创建对象,我正在努力获得更快的反馈,以便启动时的错误导致部署期间的自动回滚。这对我来说似乎并不合理,但同时我不会滥用 DI。
有没有人对我如何更优雅地实现这一目标有任何建议?
namespace MyApp
{
public class Program
{
private static readonly CancellationTokenSource cts = new CancellationTokenSource();
protected Program()
{
}
public static int Main(string[] args)
{
Console.CancelKeyPress += OnExit;
return RunHost(configuration).GetAwaiter().GetResult();
}
protected static void OnExit(object sender, ConsoleCancelEventArgs args)
{
cts.Cancel();
}
static async Task<int> RunHost()
{
await new WebHostBuilder()
.UseStartup<Startup>()
.Build()
.RunAsync(cts.Token);
}
}
public class Startup
{
public Startup()
{
}
public void ConfigureServices(IServiceCollection services)
{
// This has been massively simplified, the actual objects I construct on the commercial app I work on are
// lot more complicated to construct and span several lines of code.
services.AddSingleton<IDisposableSingletonInstance>(new DisposableSingletonInstance());
// See the OnShutdown method below
this.serviceCollection = services;
}
慕姐4208626
慕村9548890
相关分类