MVVMCROSS bruger reflektion i vid udstrækning under objektkonstruktion, især gennem dens inversion af kontrol (IOC) container, som administreres af `mvx.iocprovider` singleton -instansen. Her er en detaljeret oversigt over, hvordan MVVMCross håndterer refleksion under objektkonstruktion:
Konstruktørinjektion
MVVMCROSS understøtter konstruktørinjektion, som giver den mulighed for automatisk at løse parametre under objektkonstruktion ved hjælp af reflektion. Når du opretter et objekt, udfører MVVMCROSS følgende trin:
1. refleksion for at finde konstruktøren: MVVMCross bruger refleksion til at identificere konstruktøren af klassen, der er instantieret.
2. Parameteropløsning: Den undersøger de parametre, der kræves af konstruktøren, og identificerer de nødvendige grænseflader eller typer.
3. Løs registrerede implementeringer: For hver parameter bruger MVVMCross `mvx.iocprovider.resolve ()` til at opnå den registrerede implementering til grænsefladen eller typen.
4. påkald konstruktør: Når alle parametre er løst, bruger MVVMCross refleksion til at påkalde konstruktøren med de opløste parametre.
Denne proces er rekursiv, hvilket betyder, at hvis nogen af de opløste objekter også kræver andre objekter, vil MVVMCross også løse dem [1] [4].
Bulk -registrering efter konvention
MVVMCROSS understøtter også bulkregistrering af klasser ved hjælp af refleksion. Dette gøres typisk i klassen `app`, der arver fra` MVXApplication '. Rammerne bruger refleksion for at finde alle klasser i kerneforsamlingen, der ender med "service" og registrerer dem som dovne singletons. Dette opnås gennem følgende trin:
1. Find klasser, der slutter med "service": Refleksion bruges til at finde alle klasser med navne, der slutter på "service" inden for kerneenheden.
2. Identificer grænseflader: For hver fundne klasse identificerer MVVMCROSS de grænseflader, den implementerer.
3. Registrer som dovne singletons: Disse klasser registreres derefter som dovne singletoner mod deres respektive grænseflader. Dette betyder, at de ikke bliver instantieret, før de først anmodes om [2] [4] [7].
ViewModels og afhængighedsinjektion
MVVMCROSS bruger den samme konstruktørinjektionsmekanisme til ViewModels. Når man opretter en ViewModel, løser MVVMCROSS alle afhængigheder, der er specificeret i konstruktøren ved hjælp af IOC -beholderen. Dette muliggør let tilpasning af tjenester på tværs af forskellige platforme og letter enhedstest ved at muliggøre brugen af mockimplementeringer [1] [4].
Tilpasning og AppStart
Klassen `app` er ansvarlig for at registrere brugerdefinerede objekter på IOC -beholderen og starte applikationens ViewModels. Hvis det er nødvendigt, kan du tilpasse opstartprocessen ved at bruge en brugerdefineret `AppStart` -klasse til at beslutte, hvilken ViewModel der skal præsenteres først [2] [7].
Sammenfattende udnytter MVVMCROSS refleksion for at automatisere processen med at løse afhængigheder under objektkonstruktion, hvilket gør det lettere at styre komplekse objektgrafer og understøtte tværplatformudvikling med minimal platformspecifik kode.
Citater:[1] https://www.mvvmcross.com/documentation/fundamentals/dependency-injection
[2] https://yanxiaodi.gitbook.io/xamarin-mvvmcross-handbook/
[3] http://wojosoftware.com/software/mvvmcross/
[4] https://www.mvvmcross.com/documentation/fundamentals/inversion-of-control-ioc
[5] https://www.codeproject.com/articles/863695/introduktion-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-thone-build-mvvm-apps-with-xamarin-and-mvvmcross
[10] https://www.mvvmcross.com/documentation/advanced/customizing-sising-app-and-setup