MVVMcross utilizează reflecție pe scară largă în timpul construcției obiectelor, în special prin inversarea containerului său de control (IOC), care este gestionat de instanța Singleton `MVX.IOCPROVIDER`. Iată o imagine de ansamblu detaliată a modului în care MVVMcross gestionează reflectarea în timpul construcției obiectelor:
Injecție de constructor
MVVMcross acceptă injecția constructorului, ceea ce îi permite să rezolve automat parametrii în timpul construcției obiectelor folosind reflecție. La crearea unui obiect, MVVMCross efectuează următorii pași:
1. Reflecție Pentru a găsi constructorul: MVVMcross folosește reflectarea pentru a identifica constructorul clasei instantanee.
2. Rezoluția parametrilor: examinează parametrii ceruți de constructor și identifică interfețele sau tipurile necesare.
3. Rezolva implementările înregistrate: Pentru fiecare parametru, MVVMcross folosește `mvx.iocprovider.resolve ()` pentru a obține implementarea înregistrată pentru interfață sau tip.
4. Invocați constructorul: Odată ce toți parametrii sunt rezolvați, MVVMCross folosește reflectarea pentru a invoca constructorul cu parametrii rezolvați.
Acest proces este recursiv, ceea ce înseamnă că dacă oricare dintre obiectele rezolvate necesită și alte obiecte, MVVMcross îi va rezolva și pe acestea [1] [4].
Înregistrare în vrac prin convenție
MVVMcross acceptă, de asemenea, înregistrarea în vrac a claselor folosind reflecție. Acest lucru se face de obicei în clasa „App”, care moștenește de la `mvxapplication`. Cadrul folosește reflecția pentru a găsi toate clasele din asamblarea de bază care se termină cu „serviciu” și le înregistrează ca singletoni leneși. Acest lucru se realizează prin următorii pași:
1. Găsiți clase care se termină cu „serviciu”: reflecția este folosită pentru a găsi toate clasele cu nume care se termină în „serviciu” în cadrul ansamblului de bază.
2. Identificați interfețele: pentru fiecare clasă găsită, MVVMCross identifică interfețele pe care le implementează.
3. Înregistrați -vă ca singletoni leneși: aceste clase sunt apoi înregistrate ca singletoni leneși împotriva interfețelor respective. Aceasta înseamnă că nu sunt instantanee până când nu sunt solicitate pentru prima dată [2] [4] [7].
ViewModels și Injecția de dependență
MVVMcross folosește același mecanism de injecție a constructorului pentru ViewModels. Când creați un ViewModel, MVVMCross rezolvă orice dependențe specificate în constructor folosind containerul IOC. Aceasta permite personalizarea ușoară a serviciilor pe diferite platforme și facilitează testarea unității, permițând utilizarea implementărilor batjocoritoare [1] [4].
personalizare și AppStart
Clasa „App” este responsabilă de înregistrarea obiectelor personalizate pe containerul IOC și de a începe ViewModels al aplicației. Dacă este necesar, puteți personaliza procesul de pornire folosind o clasă „AppStart” personalizată pentru a decide ce ViewModel trebuie să prezinte primul [2] [7].
În rezumat, MVVMcross folosește reflecția pentru a automatiza procesul de rezolvare a dependențelor în timpul construcției obiectelor, ceea ce face mai ușor gestionarea graficelor de obiecte complexe și susține dezvoltarea multiplă platformă cu cod minim specific platformei.
Citări:[1] https://www.mvvmcross.com/documentation/fundamentals/dependency-injection
[2] https://yanxiaodi.gitbook.io/xamarin-mvvmcross-handbook/using-mvvmcross-to-create-your-first-xamarin-app/creating-the-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