Какие примеры паттерна «Фасад» можно привести в контексте платформы .NET?

«Какие примеры паттерна «Фасад» можно привести в контексте платформы .NET?» — вопрос из категории Паттерны, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Паттерн Фасад предоставляет простой интерфейс к сложной подсистеме. В .NET его примеры часто встречаются в стандартных библиотеках и популярных пакетах.

Классические примеры в .NET:

  1. HttpClient — это фасад для сложных низкоуровневых операций HTTP (HttpWebRequest, управление соединениями, пулинг).

    // Простой интерфейс скрывает сложность
    using var client = new HttpClient();
    var response = await client.GetStringAsync("https://api.example.com/data");
  2. Task.WhenAll / Task.WhenAny — фасады для управления группой асинхронных операций, скрывающие ручное создание и ожидание задач.

    var tasks = new List<Task<string>> { DownloadPageAsync(url1), DownloadPageAsync(url2) };
    string[] pages = await Task.WhenAll(tasks); // Единая точка управления
  3. Environment класс — предоставляет простой доступ к системным параметрам, скрывая вызовы WinAPI или переменные окружения.

    string user = Environment.UserName;
    string path = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
  4. ORM-фреймворки (например, Entity Framework Core DbContext): Класс DbContext выступает фасадом для работы с базой данных, инкапсулируя подключение, отслеживание объектов, построение SQL-запросов и транзакции.

    using var db = new AppDbContext();
    var customers = await db.Customers
                            .Where(c => c.IsActive)
                            .ToListAsync(); // Сложность работы с ADO.NET скрыта

Зачем это нужно? Фасад уменьшает связанность клиентского кода с внутренними классами подсистемы, упрощает её использование и делает код более поддерживаемым.