这是我的Program.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,也找不到好的来源来阅读它.

我会争辩说,官方的Background tasks with hosted services in ASP.NET Core份文件是关于这个主题的很好的知识来源.它还包含一个涵盖the IHostedService interface的部分.基本上,此接口定义由宿主管理的对象的方法,通常用于与ASP.NET Core应用程序一起或在所谓的worker service中执行一些后台活动

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

我会争辩说,这不是用于此类任务的正确抽象.通常,您不希望您的服务在数据种子完成之前启动并运行并为请求提供服务,因为由于显而易见的原因,这可能导致一些不一致的行为.如果您决定使用IHostedService基础设施来执行这样的任务,您将需要执行一些定制的同步(可能还有一些就绪探测).文档中有一个更复杂的Worker Service caching示例,它最初导致同步错误(请参见this answer).

因此,我认为将数据种子放在Program.cs中是很好的.

Csharp相关问答推荐

C#将参数传递给具有变化引用的变量

LINQ无法翻译SQLFunctions方法

REST API端点中异步后台代码执行的类型

WPF DataGrid中的三维数据

如何使用C#Interop EXCEL创建度量衡

如何定义EFCore中的多个穿透

.NET HttpClient、JsonSerializer或误用的Stream中的内存泄漏?

C#XmlSerializer-输出控制新行的多个XML片段

在.NET核心项目中创建Startup.cs比在Program.cs中注册服务好吗?

WinForms在Linux上的JetBrains Rider中的应用

Blazor Web App WASM的两个独立项目令人困惑

有空容错运算符的对立面吗?

正在寻找新的.NET8 Blazor Web应用程序.如何将.js添加到.razor页面?

如何防止Visual Studio断点以红色突出显示到整行?

CRL已过期,但ChainStatus告诉我RevocationStatus未知

单元测试类型为HttpClient with Microsoft.Extensions.Http.Resilience

WPF动态设置弹出窗口水平偏移

如何强制新设置在Unity中工作?

在Visual Studio 2022中查找Xamarin模板时遇到问题

这是T自身的布尔表达式是什么意思?