Какова роль строки подключения в контроллере?
Что проверяют
Вопрос с подвохом: интервьюер хочет услышать, что строке подключения в контроллере делать нечего. Проверяют понимание конфигурации, DI и безопасности в ASP.NET Core. Следом обычно спрашивают, где хранить пароль к базе на проде и как устроен пул соединений.
Как отвечать
Строка подключения описывает, куда и как подключаться: сервер, база, способ аутентификации, шифрование, таймауты, параметры пула. Её место в конфигурации, а не в коде:
- хранение: секция
ConnectionStringsвappsettings.jsonбез паролей, для разработкиdotnet user-secrets, на сервере переменная окруженияConnectionStrings__DefaultConnectionили хранилище секретов; - чтение: один раз при старте в
Program.csчерезbuilder.Configuration.GetConnectionString("DefaultConnection"); - регистрация:
builder.Services.AddDbContext<AppDbContext>(o => o.UseSqlServer(cs))или фабрика соединений для Dapper; - использование: контроллер получает через конструктор
AppDbContext, репозиторий или сервис и о строке подключения не знает вообще.
Так контроллер остаётся тонким: принимает запрос, валидирует, зовёт сервис, возвращает IActionResult. Его можно тестировать с подменённым сервисом, а смена сервера не требует пересборки.
Стоит упомянуть пул соединений ADO.NET. Он включён по умолчанию, соединения с одинаковой строкой подключения берутся из одного пула. Поэтому SqlConnection открывают ненадолго, в await using, а Dispose возвращает соединение в пул, а не рвёт его. В облаке пароль лучше убрать из строки совсем и входить через управляемую идентичность.
Где спотыкаются
Создают new SqlConnection(...) прямо в экшене и там же читают конфигурацию. Доступ к данным размазывается по контроллерам, и без живой базы его не протестировать.
Коммитят пароль в appsettings.json. Даже если потом его удалить, он навсегда остаётся в истории git, и менять придётся сам пароль.
Не знают, что System.Data.SqlClient устарел и в новых проектах берут Microsoft.Data.SqlClient. В нём шифрование соединения включено по умолчанию, и при переходе ломается подключение к серверу с самоподписанным сертификатом, пока не настроят сертификат или TrustServerCertificate.