Другое

Настройка строки подключения SQL Server в .NET Core

Узнайте, как настроить ваш проект .NET Core для доступа к строкам подключения SQL Server из web appsettings.json. Полное руководство с внедрением зависимостей и лучшими практиками безопасности.

Как настроить мой проект ядра приложения для доступа к строке подключения SQL Server, определенной в файле appsettings.json веб-проекта?

Я создал API, веб-проект и проект ядра приложения. Я хочу настроить мое ядро приложения на использование строки подключения, которую я установил в appsettings.json моего веб-приложения. Я использую SQL Server.

Как получить строку подключения SQL Server из appsettings.json в вашем проекте

Для доступа к строке подключения SQL Server из файла appsettings.json вашего веб-проекта в вашем основном проекте можно использовать несколько подходов в зависимости от предпочтений вашей архитектуры. Наиболее распространенные методы включают общие файлы конфигурации, внедрение зависимостей или прямой доступ к конфигурации.

Содержание

Подход с использованием общего файла конфигурации

Наиболее надежное решение включает создание общей конфигурации, к которой могут получить доступ оба проекта. Этот подход обеспечивает согласованность во всем решении и соответствует лучшим практикам конфигурации .NET.

Создание проекта общей конфигурации

  1. Добавьте в ваше решение новую библиотеку классов с именем Shared.Configuration или аналогичным
  2. Добавьте файл appsettings.json и установите его свойства:
    • Копировать в выходной каталог: Копировать, если новее
    • Действие при сборке: Содержимое

Настройка общих файлов

В файле .csproj вашего веб-проекта добавьте общие файлы конфигурации:

xml
<Project>
  <ItemGroup>
    <Content Include="..\Shared\Configuration\appsettings.json" Link="appsettings.json">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
    <Content Include="..\Shared\Configuration\appsettings.Development.json" Link="appsettings.Development.json">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
  </ItemGroup>
</Project>

В файле .csproj вашего основного проекта добавьте те же файлы конфигурации:

xml
<Project>
  <ItemGroup>
    <Content Include="..\Shared\Configuration\appsettings.json" Link="appsettings.json">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
    <Content Include="..\Shared\Configuration\appsettings.Development.json" Link="appsettings.Development.json">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
  </ItemGroup>
</Project>

Настройка строк подключения

В вашем общем файле appsettings.json:

json
{
  "ConnectionStrings": {
    "DefaultConnection": "Server=ваш_сервер;Database=ваша_бд;User Id=ваш_пользователь;Password=ваш_пароль;"
  }
}

Метод внедрения зависимостей

Этот подход включает передачу конфигурации из вашего веб-проекта в основной проект через внедрение зависимостей.

Создание интерфейса конфигурации

В вашем основном проекте определите интерфейс:

csharp
public interface IAppConfiguration
{
    string GetConnectionString(string name);
    T GetSection<T>(string section) where T : new();
}

Реализация службы конфигурации

В вашем основном проекте:

csharp
public class AppConfiguration : IAppConfiguration
{
    private readonly IConfiguration _configuration;

    public AppConfiguration(IConfiguration configuration)
    {
        _configuration = configuration;
    }

    public string GetConnectionString(string name)
    {
        return _configuration.GetConnectionString(name);
    }

    public T GetSection<T>(string section) where T : new()
    {
        return _configuration.GetSection(section).Get<T>();
    }
}

Настройка служб в веб-проекте

В файле Startup.cs или Program.cs вашего веб-проекта:

csharp
public void ConfigureServices(IServiceCollection services)
{
    // Добавление конфигурации в DI
    services.AddSingleton<IAppConfiguration>(provider =>
    {
        var configuration = provider.GetRequiredService<IConfiguration>();
        return new AppConfiguration(configuration);
    });

    // Регистрация служб вашего основного проекта
    services.AddScoped<YourCoreService>();
}

Использование в основном проекте

Внедрите интерфейс конфигурации там, где это необходимо:

csharp
public class YourCoreService
{
    private readonly IAppConfiguration _appConfig;

    public YourCoreService(IAppConfiguration appConfig)
    {
        _appConfig = appConfig;
    }

    public void UseDatabase()
    {
        var connectionString = _appConfig.GetConnectionString("DefaultConnection");
        // Использование строки подключения
    }
}

Прямой доступ к конфигурации

Для более простых сценариев вы можете напрямую получить доступ к конфигурации в вашем основном проекте, вручную создавая конфигурацию.

Добавление необходимых пакетов NuGet

Убедитесь, что оба проекта имеют:

  • Microsoft.Extensions.Configuration
  • Microsoft.Extensions.Configuration.Json

Настройка основного проекта для чтения настроек веб-проекта

В вашем основном проекте создайте помощник конфигурации:

csharp
public static class ConfigurationHelper
{
    public static IConfiguration GetConfiguration(string basePath)
    {
        var builder = new ConfigurationBuilder()
            .SetBasePath(basePath)
            .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
            .AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "Production"}.json", optional: true)
            .AddEnvironmentVariables();

        return builder.Build();
    }
}

Использование конфигурации в основном проекте

csharp
public class YourCoreService
{
    private readonly IConfiguration _configuration;

    public YourCoreService()
    {
        // Путь к конфигурации веб-проекта
        var webProjectPath = Path.Combine(AppContext.BaseDirectory, "..", "..", "..", "WebProject");
        _configuration = ConfigurationHelper.GetConfiguration(webProjectPath);
    }

    public string GetConnectionString()
    {
        return _configuration.GetConnectionString("DefaultConnection");
    }
}

Лучшие практики и соображения по безопасности

Конфигурация, зависящая от среды

Используйте отдельные файлы конфигурации для разных сред:

  • appsettings.json - настройки по умолчанию
  • appsettings.Development.json - настройки для разработки
  • appsettings.Production.json - настройки для производства

Безопасное хранение строк подключения

Согласно результатам исследований, избегайте хранения чувствительных строк подключения в системе контроля версий:

“Вы действительно не должны использовать строки подключения в вашем appsettings.json, так как это небезопасно (например, случайный коммит в репозитории). Вы либо используете для этого пользовательские секреты” - Stack Overflow

Использование пользовательских секретов для разработки

Для разработки используйте инструмент пользовательских секретов:

bash
dotnet user-secrets init
dotnet user-secrets set "ConnectionStrings:DefaultConnection" "Server=.;Database=ваша_бд;Integrated Security=True;"

Переменные среды для производства

Используйте переменные среды для развертывания в производстве:

csharp
.AddEnvironmentVariables() // Добавьте это в сборщик конфигурации

Шаги реализации

Пошаговое руководство

  1. Выберите подход в зависимости от сложности вашего проекта
  2. Настройте общие файлы конфигурации или реализуйте внедрение зависимостей
  3. Настройте строки подключения в вашем файле appsettings.json
  4. Добавьте необходимые пакеты NuGet в оба проекта
  5. Реализуйте доступ к конфигурации в вашем основном проекте
  6. Протестируйте конфигурацию в разных средах

Пример структуры конфигурации

ВашеРешение/
├── ВебПроект/
│   ├── appsettings.json
│   └── appsettings.Development.json
├── ОсновнойПроект/
│   └── (реализация доступа к конфигурации)
└── Shared.Configuration/ (опционально)
    └── appsettings.json

Тестирование вашей конфигурации

Юнит-тестирование доступа к конфигурации

Создайте юнит-тесты для проверки доступа к конфигурации:

csharp
[TestClass]
public class ConfigurationTests
{
    [TestMethod]
    public void GetConnectionString_ReturnsCorrectConnectionString()
    {
        // Arrange
        var config = ConfigurationHelper.GetConfiguration("путь/к/конфигурации");
        
        // Act
        var connectionString = config.GetConnectionString("DefaultConnection");
        
        // Assert
        Assert.IsNotNull(connectionString);
        Assert.IsTrue(connectionString.Contains("Server="));
    }
}

Интеграционное тестирование

Протестируйте фактическое подключение к базе данных с полученной строкой подключения:

csharp
[TestMethod]
public async Task DatabaseConnection_Test()
{
    // Arrange
    var connectionString = _appConfig.GetConnectionString("DefaultConnection");
    using var connection = new SqlConnection(connectionString);
    
    // Act
    await connection.OpenAsync();
    
    // Assert
    Assert.AreEqual(System.Data.ConnectionState.Open, connection.State);
}

Следуя этим подходам, вы можете успешно настроить свой основной проект для доступа к строке подключения SQL Server из файла appsettings.json вашего веб-проекта, обеспечивая безопасность и гибкость в разных средах.

Источники

  1. Store and read connection string in appsettings.json - ConnectionStrings.com
  2. Connection Strings - EF Core | Microsoft Learn
  3. Read DbConnection Info From AppSettings.json - Microsoft Q&A
  4. Get ConnectionString from appsettings.json instead of being hardcoded in .NET Core 2.0 App - Stack Overflow
  5. How to Read Connection Strings in .NET - Code Maze
  6. How to read Connection string from Appsetting.json in ASP.NET Core - Void Geeks
  7. Share config files between Web, Console and other types of .NET Core and .NET 6+ projects | Medium
  8. Sharing appsettings.json configuration files between projects in ASP.NET Core | Andrew Lock
Авторы
Проверено модерацией
Модерация