Получение строки подключения к базе данных из appsettings.{Environement}.json в .Net Core 7 внутри Program.cs?
В более старых версиях ядра ASP.Net у вас был файл startup.cs, в котором вы выполняли большую часть работы, включая чтение и настройку среды приложения, а затем на основе этого вы могли читать другую версию файла appsettings.json. В новом ASP.Net Core 7 они избавились от Startup.cs и значительно упростили файлы program.cs. Теперь я не могу понять, как прочитать среду, а затем передать Entity Framework 7 мою строку подключения. Просматривая все ответы, которые я нахожу, они не относятся к версии 7 или говорят вам отменить всю работу в 7, переделав весь файл Startup.cs. Как мы должны вводить строку подключения на основе среды в .Net 7?
У меня есть код для чтения из базового файла appsettings.json, и он работает, также есть раздел для чтения среды, но он настраивается ПОСЛЕ внедрения DbContext. Вот мой файл program.cs, и я просто теряюсь в том, что нужно обновить. Я просмотрел документы Microsoft, но не увидел ничего, относящегося к средам и внедрению строки.
var builder = WebApplication.CreateBuilder(args);
//Add Services (builder.Services.AddScoped<IService, Service>();
builder.Services.AddScoped<INavigationHelper, NavigationHelper>();
builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme).AddMicrosoftIdentityWebApp(builder.Configuration.GetSection("AzureAd"));
builder.Services.AddAuthorization(options =>
{
options.FallbackPolicy = options.DefaultPolicy;
});
builder.Services.AddControllersWithViews(options =>
{
var policy = new AuthorizationPolicyBuilder().RequireAuthenticatedUser().Build();
options.Filters.Add(new AuthorizeFilter(policy));
});
builder.Services.AddRazorPages().AddMicrosoftIdentityUI();
builder.Services.AddDbContext<SiteDbContext>(options => options.UseSqlServer(builder.Configuration.GetConnectionString("Database")));
var app = builder.Build();
if (!app.Environment.IsDevelopment()) { app.UseHsts(); }
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.MapRazorPages();
app.MapControllers();
app.Run();
appsettings.json:
{
"AzureAd":
{
"Instance": "https://login.microsoftonline.com/",
"Domain": "",
"TenantId": "",
"ClientId": "",
"CallbackPath": "",
"ClientSecret": "Client secret from app-registration. Check user secrets/azure portal.",
"ClientCertificates":
[
]
},
"Logging":
{
"LogLevel":
{
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*",
"ConnectionStrings":
{
"Database": ""
}
}
appsettings.development.json
{
"Logging":
{
"LogLevel":
{
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
},
"ConnectionStrings":
{
"Database": ""
}
}
}
2 ответа
builder.Configuration.GetConnectionString("Database")
будет использовать соответствующий файл appsettings.json в зависимости от выбранной среды. Если вы заглянете в папку «Свойства» в своем проекте и изучите файл launchsettings.json, вы должны увидеть что-то вроде этого:
{
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:30787",
"sslPort": 44345
}
},
"profiles": {
"Cosmos.Application.Server": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": false,
"inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}",
"applicationUrl": "https://localhost:7138;http://localhost:5138",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
}
}
В приведенном выше примере это означает, что для ASPNETCORE_ENVIRONMENT установлено значение «Разработка», и это будет определять, какой файл appsettings используется в вашей программе.cs при вызове:
builder.Configuration ...
Мы можем читать конфиги из сред, как показано ниже. Ключи в последнем добавленном файле получат приоритет при чтении значений.
Например, если строка подключения «По умолчанию» присутствует как в appsettings.json, так и в appsettings.Development.json, то результирующим значением будет значение в последнем файле.
using Microsoft.Extensions.Configuration;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
var config = new ConfigurationBuilder()
.AddJsonFile("appsettings.json")
.AddJsonFile($"appsettings.{builder.Environment.EnvironmentName}.json", optional: true)
.Build();
var defaultConnectionString = config.GetConnectionString("Default");
Console.WriteLine($"Default ConnectionString: {defaultConnectionString}");