在启动完成后将代码放在何处运行

时间:2018-06-08 15:09:17

标签: asp.net-core

我有一个aspnetcore应用程序。

在启动期间,它执行常规的启动操作。

完成这些操作后,我需要进行一些验证以确保其设置正确。特别是,我需要使用默认连接字符串在数据库中调用存储过程。换句话说,我需要创建一个使用依赖注入的类,以便在调用它之前完成它。

只是不确定在StartUp中放置此类代码的位置。

3 个答案:

答案 0 :(得分:9)

Configure电话之后,UseMvc()方法可能是最佳位置。这也是您经常应用迁移的地方。您可以添加DI知道的任何类作为参数 例如:

public void Configure(IApplicationBuilder app)

public void Configure(IApplicationBuilder app, AppUserManager userManager, IServiceProvider serviceProvider)

public void Configure(IApplicationBuilder app, MyDbContext context)

如果您想在后台进行检查(仅当您不关心结果时 - 如果验证失败也应运行应用程序),请检查my answer here
this answer也可以帮助你。

答案 1 :(得分:2)

或使用public Class BookFromDB { private List<Map<String, Object>> bookInfo; }

这主要是用于配置中间件,但是应该允许您在配置结束后执行操作。

https://docs.microsoft.com/en-us/aspnet/core/fundamentals/startup?view=aspnetcore-2.1#extend-startup-with-startup-filters

答案 2 :(得分:1)

从.net core 2.0开始,您可能应该实现自己的IHostedService。每个注册的IHostedService将按照其注册顺序开始。如果它们失败,则可能导致主机无法启动。

由于您希望执行数据库操作,因此还应该创建一个新的服务范围来控制数据库连接的生存期。

public class StartupService : IHostedService{
    private IServiceProvider services;
    public StartupService(IServiceProvider services){
        this.services = services;
    }
    
    public async Task StartAsync(CancellationToken cancellationToken)
    {
        using var scope = serviceProvider.CreateScope();
        using var context = scope.ServiceProvider.GetRequiredService<...>();
        ... do work here
    }
}

// then in configure services
services.AddHostedService<StartupService>();

请注意,EF Core 5引入了IDbContextFactory,可用于在任何DI服务范围之外创建上下文。

此问题的其他每个答案都将在配置Web服务器时运行,该服务器也在IHostedService中执行。