如何使用 IHostedService 添加数据种子方法

问题描述 投票:0回答:1

这是我的程序.cs

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers();
builder.Services.AddTransient<DatabaseSeeder>();
builder.Services.AddScoped<IWeatherForecastService, WeatherForecastService>();
builder.Services.AddDbContext<RestaurantDbContext>();

var app = builder.Build();

using (var scope = app.Services.CreateScope())
{   
    
    var serviceProvider = scope.ServiceProvider;
    var databaseSeeder = serviceProvider.GetRequiredService<DatabaseSeeder>();

    try
    {
        await databaseSeeder.SeedDatabaseAsync();
        Console.WriteLine("Seed is up.");
    }
//...
}

这是DatabaseSeeder.cs

public class DatabaseSeeder
{
    private readonly RestaurantDbContext _context;
    public DatabaseSeeder(RestaurantDbContext context);
    public async Task SeedDatabaseAsync()
    {
         _context.Restaurants.AddRange(GetRestaurants());
        await _context.SaveChangesAsync();
    }
    public IEnumerable<Restaurant> GetRestaurants()
    {
        IEnumerable<Restaurant> restaurants = new List<Restaurant>()
                {
                    //here some samples
                };
        return restaurants;
    }
}

那么我如何更改program.cs中的代码以使用IHostedService来播种数据?

我不明白什么是 IHostedService,也找不到好的来源来阅读它。

c# .net asp.net-core background-service ihostedservice
1个回答
0
投票

我不明白什么是 IHostedService,也找不到好的来源来阅读它。

我认为官方的ASP.NET Core 中托管服务的后台任务文档是该主题的很好的知识来源。它还包含一个涵盖

IHostedService
界面的部分。基本上,此接口定义了由主机管理的对象的方法,通常用于与 ASP.NET Core 应用程序一起或在所谓的 worker 服务

中执行一些后台活动

如何使用 IHostedService 添加数据种子方法

我认为这不是用于此类任务的正确抽象。通常,您不希望服务在数据种子完成之前启动并运行并服务请求,因为由于显而易见的原因,这可能会导致一些不一致的行为。如果您决定使用

IHostedService
基础设施来执行此类任务,您将需要执行一些自定义同步(可能还需要一些就绪探测)。请参阅文档中更复杂的 Worker Service caching 示例,该示例最初同步错误(请参阅这个答案)。

所以我认为将数据播种留在 Program.cs 中就可以了。

© www.soinside.com 2019 - 2024. All rights reserved.