05. Avalonia UI Real World (Dependency Injection Factory Pattern)
00:00 Начало создания приложения • Проверка основ приложения перед переходом к полноценному проекту. • Создание пользовательского интерфейса с поддержкой MVVM. • Планирование добавления внедрения зависимостей для разделения классов и повышения гибкости. 00:56 Добавление внедрения зависимостей • Установка пакета Microsoft Dependency Injection. • Перенос модели основного представления в внедрение зависимостей. 01:37 Концепция внедрения зависимостей • Объяснение важности указания всех зависимостей в одном месте. • Преимущества упрощения модульного тестирования и замены частей приложения. 02:14 Работа с коллекцией сервисов • Добавление одноэлементного объекта в коллекцию сервисов. • Создание поставщика услуг для предоставления сервисов. 03:07 Получение сервисов через внедрение зависимостей • Использование методов getService и getRequiredService для получения сервисов. • Проверка работы основной модели представления после внедрения зависимостей. 04:09 Внедрение дополнительных сервисов • Внедрение модели просмотра домашней страницы в качестве синглтона. • Разделение обязанностей между классами для повышения гибкости приложения. 05:44 Удаление ответственности из основной модели представления • Удаление создания страниц из основной модели представления. • Внедрение моделей просмотра страниц через внедрение зависимостей. 08:22 Проблемы с внедрением зависимостей • Обсуждение проблемы использования анти-шаблонов при внедрении поставщика услуг. • Необходимость создания временных объектов для оптимизации использования памяти. 09:24 Решение проблемы с временными объектами • Создание временных объектов при каждом вызове сервиса. • Избегание постоянного хранения экземпляров моделей просмотра. 10:15 Определение страниц другим способом • Перечисление страниц для оптимизации использования памяти. • Создание моделей просмотра только при необходимости. 10:45 Создание каталога и класса • Создаём новый каталог data. • Внутри каталога добавляем класс application page names в виде перечисления. • Перечисление представляет собой список с целыми числами и текстовыми значениями. 11:09 Модель просмотра страниц • Текущая страница представлена viewmodel, которая не хранит информацию о странице. • Добавляем класс page viewmodel, наследующий от base viewmodel. • В page viewmodel добавляем свойство page name для связи с названием страницы. 12:27 Настройка моделей просмотра • Изменяем все viewmodel на page viewmodel. • Создаём конструкторы для каждой страницы, задавая название страницы. • Проверяем название страницы в главной модели просмотра. 13:57 Генерация новых страниц • Обсуждается необходимость генерации viewmodel при переходе на страницу. • Рассматривается использование поставщика услуг для генерации моделей просмотра. • Подчёркивается проблема статического использования поставщика услуг. 16:09 Фабричный шаблон • Внедряем фабричный шаблон для генерации моделей просмотра страниц. • Создаём папку factories и класс factory pages. • Фабрика страниц создаёт модели просмотра на основе названия страницы. 18:17 Реализация фабрики страниц • Внедряем фабрику страниц в модель основного представления. • Привязываемся к функции, которая генерирует модели просмотра при вызове. • Функция получает доступ к поставщику услуг для генерации моделей. 20:44 Создание новых экземпляров • Используем переключатель для создания новых экземпляров моделей просмотра. • Каждый раз при вызове службы генерируется новый экземпляр модели. • Удаляем старые экземпляры при изменении страниц. 21:19 Перехват по умолчанию • Добавляем функцию перехвата по умолчанию для новых страниц. • Функция перехвата удаляет старые модели при появлении новых страниц. • Обеспечиваем доступ к зависимости для вызова функции генерации моделей. 22:23 Внедрение зависимостей в конструкторе • В конструкторе используется внедрение зависимостей через коллекцию. • Создаётся функция-фабрика PageViewModelFactory, которая возвращает PageViewModel. • Фабрика сохраняется как частная функция, доступная только для чтения. 22:56 Работа с фабрикой страниц • Фабрика страниц представлена как функция-делегат, которую можно вызывать через invoke. • При вызове invoke выполняется метод, который создаёт PageViewModel на основе имени страницы. 24:11 Упрощение кода с помощью нового синтаксиса C# • В новом синтаксисе C# упрощается передача свойств в конструктор. • Создаётся закрытый элемент factory для фабрики страниц. • Функция getPageView используется для получения PageViewModel по имени страницы. 26:57 Преимущества внедрения зависимостей • Внедрение зависимостей усложняет работу, но обеспечивает чистоту классов. • Модель основного представления чётко определена и легко тестируется. • Фабрика страниц должна знать имена всех страниц приложения. 27:54 Анализ работы кода с точками останова 29:47 Принципы внедрения зависимостей 30:45 Заключение и планы на будущее
00:00 Начало создания приложения • Проверка основ приложения перед переходом к полноценному проекту. • Создание пользовательского интерфейса с поддержкой MVVM. • Планирование добавления внедрения зависимостей для разделения классов и повышения гибкости. 00:56 Добавление внедрения зависимостей • Установка пакета Microsoft Dependency Injection. • Перенос модели основного представления в внедрение зависимостей. 01:37 Концепция внедрения зависимостей • Объяснение важности указания всех зависимостей в одном месте. • Преимущества упрощения модульного тестирования и замены частей приложения. 02:14 Работа с коллекцией сервисов • Добавление одноэлементного объекта в коллекцию сервисов. • Создание поставщика услуг для предоставления сервисов. 03:07 Получение сервисов через внедрение зависимостей • Использование методов getService и getRequiredService для получения сервисов. • Проверка работы основной модели представления после внедрения зависимостей. 04:09 Внедрение дополнительных сервисов • Внедрение модели просмотра домашней страницы в качестве синглтона. • Разделение обязанностей между классами для повышения гибкости приложения. 05:44 Удаление ответственности из основной модели представления • Удаление создания страниц из основной модели представления. • Внедрение моделей просмотра страниц через внедрение зависимостей. 08:22 Проблемы с внедрением зависимостей • Обсуждение проблемы использования анти-шаблонов при внедрении поставщика услуг. • Необходимость создания временных объектов для оптимизации использования памяти. 09:24 Решение проблемы с временными объектами • Создание временных объектов при каждом вызове сервиса. • Избегание постоянного хранения экземпляров моделей просмотра. 10:15 Определение страниц другим способом • Перечисление страниц для оптимизации использования памяти. • Создание моделей просмотра только при необходимости. 10:45 Создание каталога и класса • Создаём новый каталог data. • Внутри каталога добавляем класс application page names в виде перечисления. • Перечисление представляет собой список с целыми числами и текстовыми значениями. 11:09 Модель просмотра страниц • Текущая страница представлена viewmodel, которая не хранит информацию о странице. • Добавляем класс page viewmodel, наследующий от base viewmodel. • В page viewmodel добавляем свойство page name для связи с названием страницы. 12:27 Настройка моделей просмотра • Изменяем все viewmodel на page viewmodel. • Создаём конструкторы для каждой страницы, задавая название страницы. • Проверяем название страницы в главной модели просмотра. 13:57 Генерация новых страниц • Обсуждается необходимость генерации viewmodel при переходе на страницу. • Рассматривается использование поставщика услуг для генерации моделей просмотра. • Подчёркивается проблема статического использования поставщика услуг. 16:09 Фабричный шаблон • Внедряем фабричный шаблон для генерации моделей просмотра страниц. • Создаём папку factories и класс factory pages. • Фабрика страниц создаёт модели просмотра на основе названия страницы. 18:17 Реализация фабрики страниц • Внедряем фабрику страниц в модель основного представления. • Привязываемся к функции, которая генерирует модели просмотра при вызове. • Функция получает доступ к поставщику услуг для генерации моделей. 20:44 Создание новых экземпляров • Используем переключатель для создания новых экземпляров моделей просмотра. • Каждый раз при вызове службы генерируется новый экземпляр модели. • Удаляем старые экземпляры при изменении страниц. 21:19 Перехват по умолчанию • Добавляем функцию перехвата по умолчанию для новых страниц. • Функция перехвата удаляет старые модели при появлении новых страниц. • Обеспечиваем доступ к зависимости для вызова функции генерации моделей. 22:23 Внедрение зависимостей в конструкторе • В конструкторе используется внедрение зависимостей через коллекцию. • Создаётся функция-фабрика PageViewModelFactory, которая возвращает PageViewModel. • Фабрика сохраняется как частная функция, доступная только для чтения. 22:56 Работа с фабрикой страниц • Фабрика страниц представлена как функция-делегат, которую можно вызывать через invoke. • При вызове invoke выполняется метод, который создаёт PageViewModel на основе имени страницы. 24:11 Упрощение кода с помощью нового синтаксиса C# • В новом синтаксисе C# упрощается передача свойств в конструктор. • Создаётся закрытый элемент factory для фабрики страниц. • Функция getPageView используется для получения PageViewModel по имени страницы. 26:57 Преимущества внедрения зависимостей • Внедрение зависимостей усложняет работу, но обеспечивает чистоту классов. • Модель основного представления чётко определена и легко тестируется. • Фабрика страниц должна знать имена всех страниц приложения. 27:54 Анализ работы кода с точками останова 29:47 Принципы внедрения зависимостей 30:45 Заключение и планы на будущее
