MVVMCross använder reflektion i stor utsträckning under objektkonstruktion, särskilt genom dess inversion av kontroll (IOC) behållare, som hanteras av instansen "Mvx.iocprovider` Singleton. Här är en detaljerad översikt över hur MVVMCross hanterar reflektion under objektkonstruktion:
Konstruktörinjektion
MVVMCross stöder konstruktörinjektion, vilket gör att den automatiskt kan lösa parametrar under objektkonstruktion med reflektion. När du skapar ett objekt utför MVVMCross följande steg:
1. Reflektion för att hitta konstruktören: MVVMCross använder reflektion för att identifiera konstruktören i klassen som instanseras.
2. Parameterupplösning: Den undersöker de parametrar som krävs av konstruktören och identifierar gränssnitten eller typerna som behövs.
3. Lös registrerade implementeringar: För varje parameter använder MVVMCross `mvx.iocprovider.resolve ()` för att få den registrerade implementeringen för gränssnittet eller typen.
4. Åkalla konstruktör: När alla parametrar har lösts använder MVVMCross reflektion för att åberopa konstruktören med de upplösta parametrarna.
Denna process är rekursiv, vilket innebär att någon av de upplösta objekten också kräver andra objekt, MVVMCross kommer också att lösa dem [1] [4].
Bulkregistrering efter konvention
MVVMCross stöder också bulkregistrering av klasser med reflektion. Detta görs vanligtvis i klassen "App", som ärver från "mvxApplication". Ramverket använder reflektion för att hitta alla klasser i kärnmonteringen som slutar med "service" och registrerar dem som lata singletoner. Detta uppnås genom följande steg:
1. Hitta klasser som slutar med "Service": Reflektion används för att hitta alla klasser med namn som slutar på "Service" inom kärnmonteringen.
2. Identifiera gränssnitt: För varje klass som hittas identifierar MVVMCross de gränssnitt som den implementerar.
3. Registrera dig som lata singletoner: Dessa klasser registreras sedan som lata singletoner mot deras respektive gränssnitt. Detta innebär att de inte är instanserade förrän de först begärs [2] [4] [7].
Viewmodels och beroendeinjektion
MVVMCross använder samma konstruktörinjektionsmekanism för ViewModels. När du skapar en ViewModel löser MVVMCross alla beroenden som anges i konstruktören med IOC -behållaren. Detta möjliggör enkel anpassning av tjänster på olika plattformar och underlättar enhetstestning genom att möjliggöra användning av håliga implementeringar [1] [4].
Anpassning och appstart
Klassen "App" ansvarar för att registrera anpassade objekt på IOC -behållaren och starta applikationens ViewModels. Om det behövs kan du anpassa startprocessen genom att använda en anpassad klass klass för att bestämma vilken ViewModel som ska presenteras först [2] [7].
Sammanfattningsvis utnyttjar MVVMCross reflektion för att automatisera processen för att lösa beroenden under objektkonstruktion, vilket gör det enklare att hantera komplexa objektgrafer och stödja utveckling av plattformar med minimal plattformsspecifik kod.
Citeringar:[1] https://www.mvvmcross.com/documentation/fundamentals/dependency-injection
]
[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/geting-started/mvvmcross-overview
[8] https://www.mvvmcross.com/documentation/fundamentals/viewmodel-lifecycle
]
[10] https://www.mvvmcross.com/documentation/advanced/customizing-using-app-and-setup