Получение строки подключения к базе данных из 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}");

Другие вопросы по тегам