ASP.NET Core 啟動時執行一次程式

在 ASP.NET Core 啟動後有些程式需要被執行一次,例如: 環境檢查(資料庫連接、外部 API 測試)、預設資料寫入等等。
實現的方式也有很多種,例如使用 IHostedService 的 StartAsync (最初啟動時)、IHostApplicationLifetime 的 ApplicationStarted (啟動完畢)、IStartupFilter (主要用於修改中介軟體)。不過本篇要介紹的是最簡單的一種方式,直接在 Program.cs 中執行。

EnvironmentService.cs,自建服務,要被執行的程式碼:
    
public class EnvironmentService
{
    public void CheckDatabaseConnection()
    {
        // todo: do something
    }
}
    

Program.cs,註冊並執行服務:
    
builder.Services.AddScoped<EnvironmentService>();

var app = builder.Build();

using (var serviceScope = app.Services.CreateScope())
{
    var serviceProvider = serviceScope.ServiceProvider;
    var sysParamService = serviceProvider.GetRequiredService<EnvironmentService>();
    sysParamService.CheckDatabaseConnection();
}
    

在 Program.cs 中先註冊服務,就可以在程式建立後呼叫服務並執行。

在 Entity Framework 7 中要驗證資料庫是否可以連線可以使用下面的程式碼:
    
public class EnvironmentService
{
    private readonly ILogger<EnvironmentService> _logger;
    private readonly ApplicationDbContext _context;

    public EnvironmentService(ILogger<EnvironmentService> logger, ApplicationDbContext context)
    {
        _logger = logger;
        _context = context;
    }

    public bool CheckDatabaseConnection()
    {
        try
        {
            _logger.LogInformation("CheckDatabaseConnection");
            _context.Database.CanConnect();
            return true;
        }
        catch (Exception e)
        {
            _logger.LogError(e, "CheckDatabaseConnection");
            return false;
        }
    }
}
    


註: 如果是 ASP.NET Core 3.1 的話原先寫在 Program.cs 的部分則是該在 Startup.cs :
	
    public class Startup
    {
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddScoped<EnvironmentService>();
        }
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            using (var serviceScope = app.ApplicationServices.CreateScope())
            {
                var serviceProvider = serviceScope.ServiceProvider;
                var sysParamService = serviceProvider.GetRequiredService<EnvironmentService>();
                sysParamService.CheckDatabaseConnection();
            }
        }
     }
    

留言