ASP.NET Core顶级语句中调用自定义类方法的实现方式
在顶级语句中调用RestaurantSeeder的Seed()方法
1. 完成DI注册
先确认你已经把RestaurantSeeder注册到DI容器里,根据业务需求选择合适的生命周期(瞬态/作用域/单例):
var builder = WebApplication.CreateBuilder(args); // 这里以瞬态为例,可根据实际替换成AddScoped或AddSingleton builder.Services.AddTransient<RestaurantSeeder>(); // 其他常规配置,比如添加Controllers builder.Services.AddControllers();
2. 构建应用后调用Seed方法
在builder.Build()得到WebApplication实例后,通过创建服务作用域来获取RestaurantSeeder实例并执行Seed():
var app = builder.Build(); // 创建服务作用域,用于解析作用域/瞬态服务 using var scope = app.Services.CreateScope(); var serviceProvider = scope.ServiceProvider; try { // 从容器中取出RestaurantSeeder var seeder = serviceProvider.GetRequiredService<RestaurantSeeder>(); // 调用Seed方法,如果是异步方法就用await seeder.SeedAsync() seeder.Seed(); } catch (Exception ex) { // 异常处理,比如打日志 var logger = serviceProvider.GetRequiredService<ILogger<Program>>(); logger.LogError(ex, "执行种子数据时出错"); } // 后续中间件配置 app.UseHttpsRedirection(); app.UseAuthorization(); app.MapControllers(); app.Run();
为什么要用服务作用域?
如果RestaurantSeeder依赖了作用域生命周期的服务(比如EF Core的DbContext),直接从根服务提供者解析会导致服务无法正确释放,用作用域能保证这些依赖服务的生命周期正常管理。
内容的提问来源于stack exchange,提问作者BartTux
相关产品推荐
相关产品推荐

