Introducción a .NET MAUI
Sugerencia
Este contenido es un extracto del libro electrónico "Patrones de aplicaciones empresariales con .NET MAUI", disponible en Documentación de .NET o como un PDF descargable y gratuito que se puede leer sin conexión.
Sea cual sea la plataforma que usen, los desarrolladores de aplicaciones empresariales deben enfrentarse a diversas dificultades:
- Requisitos de aplicación que pueden cambiar con el tiempo
- Nuevas adversidades y oportunidades de negocio
- Comentarios constantes durante el desarrollo que pueden afectar significativamente al ámbito y los requisitos de la aplicación
Teniendo esto en cuenta, es importante crear aplicaciones que se puedan modificar o extender fácilmente con el tiempo. Diseñar esta capacidad de adaptación puede ser complicado, ya que requiere una arquitectura que permita desarrollar y probar partes concretas de la aplicación de manera independiente y aislada, sin que ello afecte al resto de la aplicación.
Muchas aplicaciones empresariales son lo suficientemente complejas como para requerir más de un desarrollador. Puede ser realmente arduo decidir cómo diseñar una aplicación para que varios desarrolladores puedan trabajar eficazmente en diferentes partes de ella de manera independiente y, al mismo tiempo, garantizar que las partes encajan sin problemas al integrarse en la aplicación.
El enfoque tradicional para diseñar y crear una aplicación da como resultado lo que se conoce como una aplicación monolítica, donde los componentes están estrechamente acoplados, sin una clara distinción entre ellos. Normalmente, este enfoque monolítico da como resultado aplicaciones difíciles de mantener de forma eficaz, ya que puede ser difícil resolver errores sin interrumpir otros componentes de la aplicación, así como agregar nuevas características o reemplazar las ya existentes.
Una solución eficaz en estos casos consiste en dividir una aplicación en componentes discretos y acoplados de manera imprecisa que puedan integrarse fácilmente en una aplicación. Este enfoque ofrece varias ventajas:
- Permite que diferentes individuos o equipos desarrollen, prueben, amplíen y mantengan funcionalidades individuales.
- Fomenta la reutilización y establece una clara distinción de los problemas entre las funcionalidades horizontales de la aplicación (como la autenticación y el acceso a datos) y las funcionalidades verticales (como la funcionalidad empresarial específica de la aplicación). Esto permite que las dependencias y las interacciones entre los componentes de la aplicación sean más fáciles de administrar.
- Ayuda a mantener una separación de los roles, al permitir que diferentes individuos, o equipos, se centren en una tarea o parte específica de la funcionalidad según su experiencia. En concreto, proporciona una distinción más clara entre la interfaz de usuario y la lógica de negocios de la aplicación.
Sin embargo, existen muchos problemas que se deben resolver al crear particiones de una aplicación para dividirla en componentes discretos y acoplados de manera imprecisa. Entre ellas se incluyen las siguientes:
- Decidir cómo proporcionar una clara distinción de los problemas entre los controles de la interfaz de usuario y su lógica. Una de las decisiones más importantes al crear una aplicación empresarial .NET MAUI es si colocar la lógica de negocios en archivos de código subyacente o si establecer una clara distinción de los problemas entre los controles de la interfaz de usuario y su lógica, a fin de que la aplicación sea más fácil de mantener y probar. Para obtener más información, vea Modelo-Vista-Modelo de vista.
- Decidir si se va a usar un contenedor de inserción de dependencias. Los contenedores de inserción de dependencias reducen el acoplamiento de dependencias entre objetos, proporcionando para ello una instalación donde crear instancias de clases con sus dependencias insertadas y administrar su duración en función de la configuración del contenedor. Para obtener más información, consulte Inserción de dependencias.
- Elegir entre eventos proporcionados por la plataforma o la comunicación mediante mensajes entre componentes de acoplamiento impreciso que no conviene vincular por referencias de objeto y de tipo. Para obtener más información, vea Comunicación entre componentes de acoplamiento impreciso.
- Decidir cómo navegar entre las páginas, incluido cómo invocar la navegación y dónde debe residir la lógica de navegación. Para obtener más información, consulte Navigation (Navegación).
- Decidir cómo validar las entradas de usuario para comprobar su exactitud. La decisión debe englobar cómo validar las entradas de usuario y cómo informar a los usuarios de los errores de validación. Para obtener más información, vea Validación.
- Decidir cómo realizar la autenticación y cómo proteger los recursos mediante autorización. Para obtener más información, vea Autenticación y autorización.
- Decidir cómo acceder a datos remotos desde servicios web, incluido cómo recuperar datos de forma confiable y cómo almacenarlos en caché. Para obtener más información, vea Acceso a datos remotos.
- Decidir cómo probar la aplicación. Para más información, consulte Prueba unitaria.
Esta guía incluye instrucciones sobre estos problemas y se centra en los patrones y la arquitectura principales para crear una aplicación empresarial multiplataforma mediante .NET MAUI. El objetivo es ayudar a generar un código adaptable y fácil de mantener y de probar, abordando para ello algunos escenarios comunes de desarrollo de aplicaciones empresariales .NET MAUI y distinguiendo entre problemas de presentación, de lógica de presentación y de entidades mediante la compatibilidad con el patrón Modelo-Vista-Modelo de vista (MVVM).
Aplicación de ejemplo
Esta guía incluye una aplicación de ejemplo, eShop, que es una tienda en línea que incluye las siguientes funcionalidades:
- Autenticación y autorización en un servicio back-end
- Examen de un catálogo de elementos.
- Filtrado del catálogo
- Ordenación de los artículos del catálogo
- Visualización del historial de pedidos del usuario
- Configuración de opciones
Arquitectura de una aplicación de ejemplo
Aquí se proporciona una descripción general de la arquitectura de una aplicación de ejemplo.
La aplicación de ejemplo se incluye con:
- Hospedaje y orquestación de aplicaciones de .NET Aspire
- Una aplicación web Blazor desarrollada con ASP.NET Core.
- Una aplicación multiplataforma desarrollada con .NET MAUI, que admite iOS, Android, macOS mediante Mac Catalyst y Windows.
La aplicación de ejemplo incluye los siguientes servicios back-end:
- Un microservicio de identidad que usa la identidad de ASP.NET Core e IdentityServer
- Un microservicio de catálogo, que es un servicio de creación, lectura, actualización, eliminación (CRUD) basado en datos que consume una base de datos de SQL Server mediante EntityFramework Core
- Un microservicio de ordenación, que es un servicio basado en dominio que usa patrones de diseño basados en dominio
- Un microservicio de cesta, que es un servicio CRUD basado en datos que usa Redis Cache
Estos servicios de back-end se implementan como microservicios mediante ASP.NET Core y se implementan como contenedores únicos con .NET Aspire. En conjunto, estos servicios back-end se conocen como la aplicación de referencia eShop. Las aplicaciones cliente se comunican con los servicios back-end a través de una interfaz web de Transferencia de estado representacional (REST). Para obtener más información sobre los microservicios y contenedores, consulte Microservicios en contenedores.
Aplicación multiplataforma
Esta guía versa sobre cómo crear aplicaciones empresariales multiplataforma mediante .NET MAUI, y en ella se usa la aplicación multiplataforma eShop como ejemplo. En la siguiente imagen se muestran las páginas de la aplicación multiplataforma eShop que proporcionan la funcionalidad descrita anteriormente.
La aplicación multiplataforma consume los servicios back-end proporcionados por la aplicación de referencia eShop. pero quienes no quieran implementar estos servicios back-end pueden configurarla para consumir datos de servicios ficticios.
La aplicación multiplataforma eShop pone en marcha la siguiente funcionalidad de .NET MAUI:
- XAML
- Controles
- Enlaces
- Convertidores
- Estilos
- Animaciones
- Comandos:
- Comportamientos
- Desencadenadores
- Efectos
- Controles personalizados
Para más información sobre esta funcionalidad, vea la documentación de .NET MAUI.
Además, se proporcionan pruebas unitarias para algunas de las clases de la aplicación multiplataforma eShop.
Solución de aplicación multiplataforma
La solución de aplicación multiplataforma eShop organiza el código fuente y otros recursos en varios proyectos. Todos los componentes móviles principales están contenidos en un proyecto singular denominado eShopContainers. Se trata de una característica que apareció con .NET 6 y que permite que un proyecto tenga varias salidas como destino, lo que acaba con la necesidad de tener varios proyectos de plataforma, que habría sido el caso si hubiéramos usado Xamarin.Forms y versiones anteriores de .NET. Se incluye un proyecto más para las pruebas unitarias.
Aunque este proyecto tiene todos sus componentes almacenados en un proyecto singular, merece la pena estudiar la posibilidad de separarlo en varios proyectos en función de sus necesidades. Por ejemplo, si tiene varias implementaciones de proveedores de servicios basadas en un servicio con sus propias dependencias, quizá tenga sentido dividir esas implementaciones de proveedor de servicios en su proyecto propio correspondiente aparte. Algunos candidatos aptos para separar proyectos son los modelos compartidos, las implementaciones de servicio, los componentes de cliente de API, las capas de base de datos o el almacenamiento en caché. Cualquier lugar donde crea que la empresa pueda reutilizar un componente en otro proyecto es teóricamente un buen candidato para establecer esta separación. Estos proyectos se pueden empaquetar a través de NuGet para facilitar la distribución y el control de versiones.
Todos los proyectos usan carpetas para organizar el código fuente y otros recursos en categorías. Las clases de la aplicación multiplataforma eShop se pueden reutilizar en cualquier otra aplicación .NET MAUI con apenas alguna (o ninguna) modificación.
Proyecto de eShop
El proyecto de eShop contiene las siguientes carpetas:
Carpeta | Descripción |
---|---|
Animaciones | Contiene clases que permiten el consumo de animaciones en XAML. |
Comportamientos | Contiene comportamientos que se exponen para ver clases. |
Controles | Contiene controles personalizados usados por la aplicación. |
Convertidores | Contiene convertidores de valores que aplican lógica personalizada a un enlace. |
Excepciones | Contiene la excepción personalizada ServiceAuthenticationException. |
Extensiones | Contiene los métodos de extensión de las clases VisualElement y IEnumerable<T> . |
Asistentes | Contiene clases auxiliares de la aplicación. |
Models | Contiene las clases de modelo de la aplicación. |
Propiedades | Contiene AssemblyInfo.cs, que es un archivo de metadatos de ensamblado .NET. |
Servicios | Contiene las interfaces y clases que implementan servicios que se proporcionan a la aplicación. |
Desencadenadores | Contiene el desencadenador BeginAnimation, que sirve para invocar una animación en XAML. |
Validaciones | Contiene las clases que participan en la validación de entradas de datos. |
ViewModels | Contiene la lógica de la aplicación que se expone a las páginas. |
Vistas | Contiene las páginas de la aplicación. |
Resumen
Las plataformas y las herramientas de desarrollo de aplicaciones multiplataforma de Microsoft ofrecen una solución integral para aplicaciones cliente móviles B2E, B2B y B2C, lo que permite compartir código en todas las plataformas de destino (iOS, macOS, Android y Windows) y ayuda a reducir el costo total de propiedad. Las aplicaciones pueden compartir su interfaz de usuario y su código de lógica de la aplicación y, a la vez, conservar el aspecto de plataforma nativa.
Los desarrolladores de aplicaciones empresariales se enfrentan a diferentes dificultades que pueden alterar la arquitectura de la aplicación durante el desarrollo. Por eso es tan importante crear una aplicación que se pueda modificar o extender con el tiempo. Diseñar esta capacidad de adaptación puede ser complicado, y suele requerir la partición de una aplicación en componentes discretos y acoplados de manera imprecisa que puedan integrarse fácilmente en una aplicación.