Del curso: .NET MAUI esencial
Inyección de dependencias en ViewModels y Views - Tutorial de .NET MAUI
Del curso: .NET MAUI esencial
Inyección de dependencias en ViewModels y Views
Ahora nos enfrentamos al reto de cómo instanciar el 'ViewModel', ya que tiene una dependencia en su constructor. Entonces, probablemente hacerlo aquí en XAML no va a ser la respuesta. De hecho, vamos a borrar este elemento que está aquí, lo vamos a guardar y lo que vamos a hacer es en el archivo de "code-behind", en el constructor de la página vamos a solicitar que nos pasen una instancia del 'ViewModel', es decir, de 'Visits ViewModel'. Le voy a poner 'ViewModel' y esto lo voy a poner como valor del 'BindingContext' de esta forma. Pero no he solucionado nada, porque ¿ahora cómo me pasan el 'ViewModel'?, y a su vez el 'ViewModel' requiere el 'INavigationService'. Bueno, la respuesta a esto es el contenedor de inyección de dependencias que tienen las aplicaciones de .NET MAUI. Aquí lo que yo puedo hacer es indicar que quiero registrar tanto la vista como el 'ViewModel' y solicitar y dejar que el contenedor de inyección de dependencias resuelva esto por mí. Esa es la ventaja de usar este tipo de mecanismo. Entonces, ¿cómo es esto? Bueno, 'Builder', este objeto que está acá, en su propiedad 'Services', que es de tipo 'IServiceCollection', aquí yo puedo usar 'AddSingleton' o 'AddTransient' para indicar que quiero registrar un tipo como dependencia dentro de este contenedor. Es decir, cuando alguien pida, digamos, un 'VisitsViewModel', pues simplemente lo estoy aquí indicando que lo regrese como tipo transitorio. Es decir, cada vez que alguien solicite un objeto de tipo 'Visits ViewModel' el contenedor se va a dar cuenta que se requiere esa dependencia, entonces se va a encargar de inyectarla adecuadamente. Por lo tanto, también 'VisitsViewModel', que tiene la dependencia 'INavigationService', también debería registrarla aquí. Entonces, vamos a hacerlo, 'builderServices'. En este caso voy a usar 'Singleton' porque solamente va a haber una instancia del 'Shell'. Por lo tanto, 'INavigationService', que su implementación concreta usa este 'Shell', pues tiene sentido que sea 'Singleton'. Por último, también lo que voy a hacer es registrar la página como un 'Transient', es decir, 'VisitsPage'. ¿Por qué lo estoy haciendo así? Si no tienes esta línea, entonces cuando trate de navegar el 'Shell' a 'VisitsPage' y se dé cuenta que en su constructor, ¿te acuerdas?, está esta parte de pedir un objeto de tipo 'VisitsViewModel', no lo podría hacer. Por eso es necesaria esta línea número 24. Muy bien. Dicho todo esto, parece ser que ya estamos preparados nuevamente para probar la aplicación. Una vez más tenemos la aplicación aquí en el emulador de Android. Y ahora si navego a Visitas, nota que no hay ningún cambio gracias a que el contenedor de inyección de dependencias se da cuenta de que la vista requiere el 'ViewModel', hace la instancia del 'ViewModel', que a su vez requiere el 'INavigationService'. Pero nosotros ya le dijimos que inyectar, le dijimos que inyecte el objeto concreto 'NavigationService'. Pero a lo que al 'ViewModel' respecta ya no tiene una dependencia al 'shell', esto es muy crítico e importante. Gracias a este cambio y a esta refactorización, entonces, nuestro 'ViewModel' sería mucho más fácil probarlo por medio de pruebas unitarias.
Contenido
-
-
-
-
-
-
-
-
-
-
(Bloqueado)
¿Qué es MVVM?4 min 48 s
-
(Bloqueado)
Implementación de un ViewModel4 min 47 s
-
Inyección de dependencias en ViewModels y Views4 min
-
(Bloqueado)
Creando una extensión de ayuda para la clase MauiAppBuilder1 min 41 s
-
(Bloqueado)
Herramientas y extensiones para MVVM del Community Toolkit5 min 7 s
-
(Bloqueado)
Implementando IQueryAttributable en el ViewModel2 min 34 s
-
(Bloqueado)
-
-
-
-