在 ASP.NET Core 中放置应用程序启动逻辑的位置

Dan*_*ter 4 c# startup .net-core asp.net-core

我想用 ASP.NET Core 2.1 创建一个 Web 服务,它检查应用程序启动时与数据库的连接是否正常,然后在数据库中准备一些数据。

检查循环运行,直到连接成功或用户按下 Ctrl + C ( IApplicationLifetime)。在数据库初始化之前不处理任何 HTTP 调用是很重要的。我的问题是:把这段代码放在哪里?

我需要一个完全初始化的依赖注入系统,所以我能想到的最早是在我的Startup.Configure方法结束时,但是取消令牌IApplicationLifetime似乎在那里不起作用(正确的是因为asp没有完全启动)

有没有官方的地方可以放这个启动逻辑?

Tra*_*man 10

您可以构建一个扩展方法IWebHost,允许您在Startup.cs. 此外,您可以使用ServiceScopeFactory来初始化您拥有的任何服务(例如DbContext)。

public static IWebHost CheckDatabase(this IWebHost webHost)
{
    var serviceScopeFactory = (IServiceScopeFactory)webHost.Services.GetService(typeof(IServiceScopeFactory));

    using (var scope = serviceScopeFactory.CreateScope())
    {
        var services = scope.ServiceProvider;
        var dbContext = services.GetRequiredService<YourDbContext>();

        while(true)
        {
            if(dbContext.Database.Exists())
            {
                break;
            }
        }
    }

    return webHost;
}
Run Code Online (Sandbox Code Playgroud)

然后您可以使用该方法。

public static void Main(string[] args)
{
    BuildWebHost(args)
        .CheckDatabase()
        .Run();
}
Run Code Online (Sandbox Code Playgroud)