如何在Main方法中获取IConfiguration实例?
如何在Main方法中获取IConfiguration实例?
嘿,我来帮你搞定这个问题!你已经把种子数据的逻辑搭得差不多了,就差在Main方法里拿到IConfiguration实例来读取secrets.json里的配置对吧?其实有几种简单又靠谱的方式:
方法一:直接从WebHost的服务容器里取
你的BuildWebHost方法已经帮你加载好所有配置了(包括secrets.json),所以直接从IWebHost实例的服务容器里提取就行,这是最省事的方式:
public static void Main(string[] args) { IWebHost iwh = BuildWebHost(args); using (IServiceScope iss = iwh.Services.CreateScope()) { IServiceProvider isp = iss.ServiceProvider; try { // 直接从WebHost的服务中获取IConfiguration IConfiguration c = iwh.Services.GetRequiredService<IConfiguration>(); SeedData.Initialize(isp, c); } catch (Exception ex) { ILogger<Program> logger = isp.GetRequiredService<ILogger<Program>>(); logger.LogError(ex, "An error occurred seeding the DB."); } } iwh.Run(); }
方法二:手动构建配置对象(适合WebHost启动前需要用配置的场景)
如果你需要在启动WebHost之前就用到配置,也可以手动构建IConfiguration实例,把需要的配置源都加上:
public static void Main(string[] args) { // 手动构建配置,包含appsettings、环境配置、用户密钥和环境变量 var config = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) .AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "Production"}.json", optional: true) .AddUserSecrets<Program>() // 这一步会加载你的secrets.json .AddEnvironmentVariables() .Build(); IWebHost iwh = BuildWebHost(args); using (IServiceScope iss = iwh.Services.CreateScope()) { IServiceProvider isp = iss.ServiceProvider; try { SeedData.Initialize(isp, config); } catch (Exception ex) { ILogger<Program> logger = isp.GetRequiredService<ILogger<Program>>(); logger.LogError(ex, "An error occurred seeding the DB."); } } iwh.Run(); }
不过这种方式需要你重复配置加载逻辑,除非有特殊需求,不然还是方法一更简洁。
额外优化:让SeedData自己从服务容器拿配置
其实你还能进一步简化代码,不用把IConfiguration当参数传进去,直接让SeedData从IServiceProvider里获取就行,更符合依赖注入的思路:
修改你的SeedData类:
public static class SeedData { public static void Initialize(IServiceProvider isp) { using (var context = isp.GetRequiredService<MyContext>()) { if (context.Members.Any()) return; // 直接从服务容器获取IConfiguration var config = isp.GetRequiredService<IConfiguration>(); context.Members.AddRange( new Member { Message= config["Message"] } ); context.SaveChanges(); } } }
然后Main方法里调用的时候就不用传config了:
SeedData.Initialize(isp);
这样代码更干净,也少了参数传递的麻烦。
内容的提问来源于stack exchange,提问作者Display Name
相关产品推荐
相关产品推荐

