MVVMcross широко использует отражение во время построения объектов, особенно благодаря своему контейнеру управления (IOC), который управляется экземпляром `mvx.iocprovider` singleton. Вот подробный обзор того, как MVVMcross обрабатывает отражение во время строительства объекта:
Инъекция конструктора
MVVMcross поддерживает инъекцию конструктора, что позволяет автоматически разрешать параметры во время построения объектов с использованием отражения. При создании объекта MVVMcross выполняет следующие шаги:
1. Отражение, чтобы найти конструктор: MVVMcross использует отражение для определения создания конструктора класса.
2. Разрешение параметров: он рассматривает параметры, требуемые конструктором, и идентифицирует необходимые интерфейсы или необходимые типы.
3. Установите зарегистрированные реализации: для каждого параметра MVVMcross использует `mvx.iocprovider.resolve ()` для получения зарегистрированной реализации для интерфейса или типа.
4. Призыв конструктор: как только все параметры будут разрешены, MVVMcross использует отражение, чтобы вызвать конструктор с разрешенными параметрами.
Этот процесс является рекурсивным, что означает, что если какой -либо из разрешенных объектов также требует других объектов, MVVMcross также разрешает их [1] [4].
Настройка регистрации по конвенции
MVVMcross также поддерживает массовую регистрацию классов с использованием отражения. Обычно это делается в классе `app`, который наследует от` mvxapplication '. Структура использует отражение, чтобы найти все классы в основной сборке, которые заканчиваются «сервисом», и регистрирует их как ленивые синглтоны. Это достигается через следующие шаги:
1. Найти классы, заканчивающиеся «Сервис»: отражение используется для поиска всех классов с именами, заканчивающимися в «Сервисе» в основной сборке.
2. Идентифицируйте интерфейсы: для каждого найденного класса MVVMcross идентифицирует интерфейсы, которые он реализует.
3. Зарегистрируйтесь как ленивые синглтоны: эти классы затем зарегистрированы как ленивые синглтоны против их соответствующих интерфейсов. Это означает, что они не подвергаются экземплярам, пока их не будут запрашиваться [2] [4] [7].
ViewModels и инъекция зависимости
MVVMcross использует тот же механизм впрыска конструктора для ViewModels. При создании ViewModel MVVMcross разрешает любые зависимости, указанные в конструкторе с использованием контейнера IOC. Это позволяет легко настраивать услуги на разных платформах и облегчает модульные тестирование, позволяя использовать макет реализации [1] [4].
Настройка и приложение
Класс App` отвечает за регистрацию пользовательских объектов в контейнере IOC и запуск просмотров приложения. При необходимости вы можете настроить процесс запуска, используя пользовательский класс `appstart`, чтобы решить, какую ViewModel представил первый [2] [7].
Таким образом, MVVMcross использует отражение для автоматизации процесса разрешения зависимостей во время построения объектов, что облегчает управление сложными графами объектов и поддержку кроссплатформенного разработки с минимальным кодом, специфичной для платформы.
Цитаты:[1] https://www.mvvmcross.com/documentation/fundamentals/dependency-nection
[2] https://yanxiaodi.gitbook.io/xamarin-mvvmcross-handbook/using-mvvmcross-to-create-your-first-xamarin-app/creating-to-core-project/adding-an-app-class
[3] http://wojosoftware.com/software/mvvmcross/
[4] https://www.mvvmcross.com/documentation/fundamentals/inversion-of-control-ioc
[5] https://www.codeproject.com/articles/863695/introduction-to-mvvmcross-platform
[6] https://github.com/media-tools/sqlite-net-extensions
[7] https://www.mvvmcross.com/documentation/getting-started/mvvmcross-overview
[8] https://www.mvvmcross.com/documentation/fundamentals/viewmodel-lifecycle
[9] https://learn.microsoft.com/en-us/archive/msdn-magazine/2014/august/windows-phone-build-mvvm-apps-with-xamarin-and-mvvmcross
[10] https://www.mvvmcross.com/documentation/advanced/customizing-using-app-and-setup