Українська
Підсумки
Висновки
Впровадження залежностей робить класи незалежними від конкретних реалізацій: клас оголошує потрібні інтерфейси в конструкторі, а об’єкти з’єднуються в корені композиції. Контейнер Microsoft.Extensions.DependencyInjection створює сервіси за реєстраціями, підтримує кілька реалізацій, фабрики й ключові сервіси та керує часами життя Singleton, Scoped і Transient; перевірки ValidateScopes і ValidateOnBuild виявляють захоплені та відсутні залежності. Універсальний хост поєднує DI, конфігурацію, журнал і фонові служби та коректно зупиняється за Ctrl+C. Конфігурація збирається з файлів JSON, секретів користувача, змінних середовища та командного рядка, причому пізніші джерела перекривають попередні. Шаблон параметрів дає типізований і перевірений під час запуску доступ до налаштувань. Журнал ILogger<T> з рівнями, категоріями й шаблонами повідомлень записує структуровані дані в кілька постачальників, а генератор [LoggerMessage] робить його швидким. Ті самі прийоми працюють у Windows Forms і спрощують модульне тестування.
Питання для самоперевірки
- Що таке залежність і сильна зв’язаність? Які проблеми створює
newконкретного класу в сервісі? - Сформулюйте принцип інверсії залежностей. Що таке впровадження через конструктор?
- Що таке корінь композиції? Чому локатор служб вважають антипатерном?
- Яке призначення
IServiceCollectionіIServiceProvider? ЧимGetServiceвідрізняється відGetRequiredService? - Що поверне контейнер, якщо один інтерфейс зареєстровано двічі? Як отримати всі реалізації?
- Для чого потрібні ключові сервіси та атрибут
[FromKeyedServices]? - Чим відрізняються часи життя Singleton, Scoped і Transient? Коли контейнер звільняє об’єкти?
- Що таке захоплена залежність? Як її виявити?
- Що налаштовує
Host.CreateApplicationBuilder? Як працюєBackgroundService? - Які постачальники конфігурації підключає хост і в якому порядку пріоритету?
- Як задати середовище виконання? Для чого файл
launchSettings.json? - Як записати ієрархічний ключ у змінній середовища та в аргументі командного рядка?
- Навіщо потрібні секрети користувача? Де вони зберігаються?
- Чим відрізняються
IOptions<T>,IOptionsSnapshot<T>іIOptionsMonitor<T>? Як перевірити параметри під час запуску? - Які рівні журналювання існують? Що таке категорія журналу?
- Чому в методи
Log…передають шаблон повідомлення, а не інтерпольований рядок? - Які вбудовані постачальники журналу є в .NET? Як налаштувати фільтри в
appsettings.json? - Як підключити хост і впровадження залежностей у застосунку Windows Forms?
Корисні посилання
- Впровадження залежностей у .NET: https://learn.microsoft.com/dotnet/core/extensions/dependency-injection/overview
- Часи життя сервісів: https://learn.microsoft.com/dotnet/core/extensions/dependency-injection/service-lifetimes
- Універсальний хост .NET: https://learn.microsoft.com/dotnet/core/extensions/generic-host
- Конфігурація в .NET: https://learn.microsoft.com/dotnet/core/extensions/configuration
- Постачальники конфігурації: https://learn.microsoft.com/dotnet/core/extensions/configuration-providers
- Шаблон параметрів: https://learn.microsoft.com/dotnet/core/extensions/options
- Журналювання в .NET: https://learn.microsoft.com/dotnet/core/extensions/logging/overview
- Генератор джерел для журналювання: https://learn.microsoft.com/dotnet/core/extensions/logging/source-generation
- Секрети користувача: https://learn.microsoft.com/aspnet/core/security/app-secrets
- Хост у Windows Forms: https://learn.microsoft.com/dotnet/desktop/winforms/advanced/how-to-use-host-builder
- Абстракція часу
TimeProvider: https://learn.microsoft.com/dotnet/standard/datetime/timeprovider-overview