dbContext连接字符串和托管服务

时间:2019-02-05 15:54:00

标签: c# .net-core

我有一个。 NET核心控制台应用程序,该应用程序实现IHostedService以及对具有DbContext定义的另一个项目的引用。 这是控制台应用程序中DbContext的配置:

IHost host = new HostBuilder()
    .ConfigureHostConfiguration(configHost =>
    {
        configHost.SetBasePath(Directory.GetCurrentDirectory());
        configHost.AddEnvironmentVariables(prefix: "ASPNETCORE_");
        configHost.AddCommandLine(args);
    })
.ConfigureAppConfiguration((hostContext, configApp) =>
{
    configApp.SetBasePath(Directory.GetCurrentDirectory());
    configApp.AddEnvironmentVariables(prefix: "ASPNETCORE_");
    configApp.AddJsonFile($"appsettings.json", true);
    configApp.AddJsonFile($"appsettings.{hostContext.HostingEnvironment.EnvironmentName}.json", true);
    configApp.AddCommandLine(args);
}) 
.ConfigureServices((hostContext, services) =>
{
    services.AddDbContext<MyAppDbContext>(options => options.UseNpgsql(hostContext.Configuration.GetConnectionString("DefaultConnection")));

    services.AddHostedService<ApplicationLifetimeHostedService>();
})
.Build();

现在,在ApplicationLifetimeHostedService的OnStarted()方法中,我有:

using (var _context = new MyAppDbContext())
{
    ...
    _context.SaveChanges();
}

为什么MyAppDbContext从dbcontext定义类的OnConfiguring方法(硬编码,通过脚手架生成)而不是从appsettings中获取连接字符串值?{ASPNETCORE_ENVIROMENT} .json()?

先谢谢您!

1 个答案:

答案 0 :(得分:0)

根据您的配置,当前IHostBuilder适用于非Web应用程序,并模拟通用配置,最终它将代替IWebHostBuilder。但是,您不需要这些...在您的实例中,使用CreateDefaultBuilder会更好。

  • 主机配置
  • 应用配置

默认情况下均提供了两者,并提供了更精细的控制。主要项目是构建器提供的默认服务及其编译或构建的内容。

不过,要直接回答您的问题,您在首页中缺少以下内容:

 var host = new HostBuilder()
     .ConfigureHostConfiguration(configuration => 
     {
         // For brevity, removed some.
         configuration.AddJsonFile("appsettings.json", false, true);
     }

这就是为什么您的appsettings.json无法正常工作的原因。 ConfigureHostConfiguration将一直延续到ConfigureAppConfiguration

  

主机配置自动流向应用程序配置   (ConfigureAppConfiguration和应用程序的其余部分)。

     

默认不包含任何提供程序。您必须明确指定   应用程序需要的任何配置提供程序   ConfigureHostConfiguration,包括:

     
      
  • 文件配置(例如,来自hostsettings.json文件)。
  •   
  • 环境变量配置。
  •   
  • 命令行参数配置。
  •   
  • 任何其他必需的配置提供程序。
  •