Вопрос проверяет понимание проблем управления жизненным циклом объектов и утечек памяти при создании сервисов внутри методов без сохранения ссылки на них.
Создание экземпляров сервисов напрямую внутри метода, без сохранения ссылки на них в переменной класса или без использования контейнера внедрения зависимостей (DI), является антипаттерном в современной разработке. Основная проблема заключается в потере контроля над жизненным циклом объекта.
IDisposable (например, содержит открытые соединения с базой данных, файловые потоки, сетевые сокеты), и вы не вызываете для него метод Dispose(), ресурсы не будут освобождены до сборки мусора. Сборщик мусора (GC) в .NET не вызывает Dispose автоматически. Объект, на который нет ссылок, будет удалён, но его неуправляемые ресурсы могут остаться висеть.public class OrderProcessor
{
public void ProcessOrder(Order order)
{
// ПЛОХО: Создание сервиса внутри метода без ссылки.
var emailService = new SmtpEmailService();
emailService.SendConfirmation(order);
// После выхода из метода ссылка 'emailService' теряется.
// Если SmtpEmailService использует неуправляемые ресурсы,
// они не будут корректно освобождены.
}
}
public class SmtpEmailService : IDisposable
{
private SmtpClient _client;
public SmtpEmailService()
{
_client = new SmtpClient("smtp.server.com"); // Открывает соединение
}
public void SendConfirmation(Order order) { /* ... */ }
public void Dispose()
{
_client?.Dispose(); // Dispose не будет вызван автоматически!
}
}Внедряйте зависимости через конструктор. Контейнер DI (например, встроенный в ASP.NET Core) возьмёт на себя управление жизненным циклом.
public class OrderProcessor
{
private readonly IEmailService _emailService;
// ХОРОШО: Сервис внедрён и его жизненный циклом управляет контейнер.
public OrderProcessor(IEmailService emailService)
{
_emailService = emailService;
}
public void ProcessOrder(Order order)
{
_emailService.SendConfirmation(order);
}
}
// Регистрация в Startup.cs / Program.cs
services.AddScoped<IEmailService, SmtpEmailService>();Вывод: Избегайте создания сервисов внутри методов без сохранения ссылки. Всегда используйте внедрение зависимостей для управления созданием и временем жизни объектов. Это предотвращает утечки памяти, делает код тестируемым, слабосвязанным и соответствующим современным архитектурным практикам.