Настройка строки подключения 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.
Создание проекта общей конфигурации
- Добавьте в ваше решение новую библиотеку классов с именем
Shared.Configurationили аналогичным - Добавьте файл appsettings.json и установите его свойства:
- Копировать в выходной каталог: Копировать, если новее
- Действие при сборке: Содержимое
Настройка общих файлов
В файле .csproj вашего веб-проекта добавьте общие файлы конфигурации:
<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 вашего основного проекта добавьте те же файлы конфигурации:
<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:
{
"ConnectionStrings": {
"DefaultConnection": "Server=ваш_сервер;Database=ваша_бд;User Id=ваш_пользователь;Password=ваш_пароль;"
}
}
Метод внедрения зависимостей
Этот подход включает передачу конфигурации из вашего веб-проекта в основной проект через внедрение зависимостей.
Создание интерфейса конфигурации
В вашем основном проекте определите интерфейс:
public interface IAppConfiguration
{
string GetConnectionString(string name);
T GetSection<T>(string section) where T : new();
}
Реализация службы конфигурации
В вашем основном проекте:
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 вашего веб-проекта:
public void ConfigureServices(IServiceCollection services)
{
// Добавление конфигурации в DI
services.AddSingleton<IAppConfiguration>(provider =>
{
var configuration = provider.GetRequiredService<IConfiguration>();
return new AppConfiguration(configuration);
});
// Регистрация служб вашего основного проекта
services.AddScoped<YourCoreService>();
}
Использование в основном проекте
Внедрите интерфейс конфигурации там, где это необходимо:
public class YourCoreService
{
private readonly IAppConfiguration _appConfig;
public YourCoreService(IAppConfiguration appConfig)
{
_appConfig = appConfig;
}
public void UseDatabase()
{
var connectionString = _appConfig.GetConnectionString("DefaultConnection");
// Использование строки подключения
}
}
Прямой доступ к конфигурации
Для более простых сценариев вы можете напрямую получить доступ к конфигурации в вашем основном проекте, вручную создавая конфигурацию.
Добавление необходимых пакетов NuGet
Убедитесь, что оба проекта имеют:
Microsoft.Extensions.ConfigurationMicrosoft.Extensions.Configuration.Json
Настройка основного проекта для чтения настроек веб-проекта
В вашем основном проекте создайте помощник конфигурации:
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();
}
}
Использование конфигурации в основном проекте
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
Использование пользовательских секретов для разработки
Для разработки используйте инструмент пользовательских секретов:
dotnet user-secrets init
dotnet user-secrets set "ConnectionStrings:DefaultConnection" "Server=.;Database=ваша_бд;Integrated Security=True;"
Переменные среды для производства
Используйте переменные среды для развертывания в производстве:
.AddEnvironmentVariables() // Добавьте это в сборщик конфигурации
Шаги реализации
Пошаговое руководство
- Выберите подход в зависимости от сложности вашего проекта
- Настройте общие файлы конфигурации или реализуйте внедрение зависимостей
- Настройте строки подключения в вашем файле appsettings.json
- Добавьте необходимые пакеты NuGet в оба проекта
- Реализуйте доступ к конфигурации в вашем основном проекте
- Протестируйте конфигурацию в разных средах
Пример структуры конфигурации
ВашеРешение/
├── ВебПроект/
│ ├── appsettings.json
│ └── appsettings.Development.json
├── ОсновнойПроект/
│ └── (реализация доступа к конфигурации)
└── Shared.Configuration/ (опционально)
└── appsettings.json
Тестирование вашей конфигурации
Юнит-тестирование доступа к конфигурации
Создайте юнит-тесты для проверки доступа к конфигурации:
[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="));
}
}
Интеграционное тестирование
Протестируйте фактическое подключение к базе данных с полученной строкой подключения:
[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 вашего веб-проекта, обеспечивая безопасность и гибкость в разных средах.
Источники
- Store and read connection string in appsettings.json - ConnectionStrings.com
- Connection Strings - EF Core | Microsoft Learn
- Read DbConnection Info From AppSettings.json - Microsoft Q&A
- Get ConnectionString from appsettings.json instead of being hardcoded in .NET Core 2.0 App - Stack Overflow
- How to Read Connection Strings in .NET - Code Maze
- How to read Connection string from Appsetting.json in ASP.NET Core - Void Geeks
- Share config files between Web, Console and other types of .NET Core and .NET 6+ projects | Medium
- Sharing appsettings.json configuration files between projects in ASP.NET Core | Andrew Lock