这是我的程序.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,也找不到好的来源来阅读它。
我不明白什么是 IHostedService,也找不到好的来源来阅读它。
我认为官方的ASP.NET Core 中托管服务的后台任务文档是该主题的很好的知识来源。它还包含一个涵盖
IHostedService
界面的部分。基本上,此接口定义了由主机管理的对象的方法,通常用于与 ASP.NET Core 应用程序一起或在所谓的 worker 服务中执行一些后台活动
如何使用 IHostedService 添加数据种子方法
我认为这不是用于此类任务的正确抽象。通常,您不希望服务在数据种子完成之前启动并运行并服务请求,因为由于显而易见的原因,这可能会导致一些不一致的行为。如果您决定使用
IHostedService
基础设施来执行此类任务,您将需要执行一些自定义同步(可能还需要一些就绪探测)。请参阅文档中更复杂的 Worker Service caching 示例,该示例最初同步错误(请参阅这个答案)。
所以我认为将数据播种留在 Program.cs 中就可以了。