我有一个。 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()?
先谢谢您!
答案 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文件)。
- 环境变量配置。
- 命令行参数配置。
- 任何其他必需的配置提供程序。