MVVMCross gebruikt reflectie uitgebreid tijdens objectconstructie, met name door zijn inversie van controle (IOC) container, die wordt beheerd door de `mvx.iocprovider` singleton -instantie. Hier is een gedetailleerd overzicht van hoe MVVMCross omgaat met reflectie tijdens objectconstructie:
Constructor -injectie
MVVMCross ondersteunt de constructorinjectie, waardoor het automatisch parameters kan oplossen tijdens objectconstructie met behulp van reflectie. Bij het maken van een object voert MVVMCross de volgende stappen uit:
1. Reflectie om de constructor te vinden: MVVMCross gebruikt reflectie om de constructor van de geïnstantieerde klasse te identificeren.
2. Parameterresolutie: het onderzoekt de parameters die door de constructor zijn vereist en identificeert de benodigde interfaces of typen.
3. Registreerde implementaties oplossen: voor elke parameter gebruikt MVVMCross `mvx.iocprovider.resolve ()` om de geregistreerde implementatie voor de interface of het type te verkrijgen.
4. Constructor oproepen: Zodra alle parameters zijn opgelost, gebruikt MVVMCross reflectie om de constructor op te roepen met de opgeloste parameters.
Dit proces is recursief, wat betekent dat als een van de opgeloste objecten ook andere objecten vereist, MVVMCross deze ook zal oplossen [1] [4].
Bulk -registratie volgens conventie
MVVMCross ondersteunt ook bulkregistratie van klassen met behulp van reflectie. Dit wordt meestal gedaan in de klasse `app`, die erft van` mvxapplication`. Het framework maakt gebruik van reflectie om alle klassen in de kernassemblage te vinden die eindigen met "Service" en registreert ze als luie singletons. Dit wordt bereikt door de volgende stappen:
1. Vind klassen die eindigen met "Service": reflectie wordt gebruikt om alle klassen te vinden met namen die eindigen in "Service" in de kernassemblage.
2. Identificeer interfaces: voor elke gevonden klasse identificeert MVVMCross de interfaces die het implementeert.
3. Registreer als luie singletons: deze klassen worden vervolgens geregistreerd als luie singletons tegen hun respectieve interfaces. Dit betekent dat ze niet worden geïnstantieerd totdat ze voor het eerst worden gevraagd [2] [4] [7].
ViewModels en afhankelijkheidsinjectie
MVVMCross gebruikt hetzelfde constructorinjectiemechanisme voor weergavemodellen. Bij het maken van een ViewModel lost MVVMCross alle afhankelijkheden op die in de constructor zijn opgegeven met behulp van de IOC -container. Dit zorgt voor eenvoudige aanpassing van services op verschillende platforms en vergemakkelijkt het testen van eenheid door het gebruik van mock -implementaties [1] [4] mogelijk te maken.
Customization and AppStart
De klasse `App` is verantwoordelijk voor het registreren van aangepaste objecten op de IOC -container en het starten van de weergavemodellen van de applicatie. Indien nodig kunt u het opstartproces aanpassen door een aangepaste `AppStart` -klasse te gebruiken om te beslissen welk viewModel moet worden gepresenteerd [2] [7].
Samenvattend, MVVMCross maakt gebruik van reflectie om het proces van het oplossen van afhankelijkheden tijdens het constructie van object te automatiseren, waardoor het gemakkelijker is om complexe objectgrafieken te beheren en cross-platform-ontwikkeling te ondersteunen met minimale platformspecifieke code.
Citaten:[1] https://www.mvvmcross.com/documentation/fundamentals/dependency-injectie
[2] https://yanxiaodi.gitbook.io/xamarin-mvvmcross-handbook/using-mvvmcross-to-create-your-first-xamarin-app/creating-the-core-project/adding-an-app-clas
[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/window-phone-build-mvvm-apps-with-xamarin-and-mvvmcross
[10] https://www.mvvmcross.com/documentation/advanced/customizing-using-app-and-setup