Compartir a través de


Reutilización de componentes Razor en ASP.NET Core Blazor Hybrid

Nota

Esta no es la versión más reciente de este artículo. Para la versión actual, consulte la versión de .NET 9 de este artículo.

Advertencia

Esta versión de ASP.NET Core ya no se admite. Para obtener más información, consulte la directiva de compatibilidad de .NET y .NET Core. Para la versión actual, consulte la versión de .NET 9 de este artículo.

Importante

Esta información hace referencia a un producto en versión preliminar, el cual puede sufrir importantes modificaciones antes de que se publique la versión comercial. Microsoft no proporciona ninguna garantía, expresa o implícita, con respecto a la información proporcionada aquí.

Para la versión actual, consulte la versión de .NET 9 de este artículo.

En este artículo se explica cómo crear y organizar componentes Razor para la web y Web Views en aplicaciones Blazor Hybrid.

Los componentes Razor funcionan en todos los modelos de hospedaje (Blazor WebAssembly, Blazor Server y en el Web View de Blazor Hybrid) y en todas las plataformas (Android, iOS y Windows). Los modelos y plataformas de hospedaje tienen funcionalidades únicas que los componentes pueden aprovechar, pero los componentes que se ejecutan en modelos y plataformas de hospedaje deben aprovechar las funcionalidades únicas por separado, lo que demuestran los siguientes ejemplos:

  • Blazor WebAssembly admite la interoperabilidad sincrónica de JavaScript (JS), que no es compatible con el canal de comunicación de interoperabilidad de JS estrictamente asincrónico en Blazor Server y Web Views de aplicaciones Blazor Hybrid.
  • Los componentes de una aplicación Blazor Server pueden acceder a los servicios que solo están disponibles en el servidor, como un contexto de base de datos de Entity Framework.
  • Los componentes de BlazorWebView pueden acceder directamente a las características nativas de escritorio y dispositivos móviles, como los servicios de geolocalización. Las aplicaciones Blazor Server y Blazor WebAssembly deben basarse en interfaces de API web de aplicaciones en servidores externos para proporcionar características similares.

Principios de diseño

Para crear componentes Razor que puedan funcionar sin problemas en modelos y plataformas de hospedaje, siga los siguientes principios de diseño:

Organización de código del proyecto

Tanto como sea posible, coloque el código y el contenido estático en las bibliotecas de clases de Razor (RCL). Cada modelo o plataforma de hospedaje hace referencia a la RCL y registra implementaciones individuales en la colección de servicios de la aplicación que podría requerir un componente Razor.

Cada ensamblado de destino debe contener solo el código específico de ese modelo o plataforma de hospedaje junto con el código que ayuda a iniciar la aplicación.

Blazor WebAssembly, Blazor Server y WebView tienen cada uno una referencia de proyecto para la biblioteca de clases de Razor (RCL).

Uso de abstracciones para características únicas

En el ejemplo siguiente se muestra cómo usar una abstracción para un servicio de geolocalización por modelo y plataforma de hospedaje.

  • En una biblioteca de clases Razor (RCL) usada por la aplicación para obtener datos de geolocalización para la ubicación del usuario en un mapa, el componente MapComponentRazor inserta una abstracción de servicio ILocationService.
  • App.Web para proyectos Blazor WebAssembly y Blazor Server implementa ILocationService como WebLocationService, que utiliza llamadas a la API web para obtener datos de geolocalización.
  • App.Desktop para .NET MAUI, WPF y Windows Forms, implementa ILocationService como DesktopLocationService. DesktopLocationService usa características de dispositivo específicas de la plataforma para obtener datos de geolocalización.

En una biblioteca de clases de Razor (RCL), MapComponent inserta un servicio ILocationService. De manera independiente, App.Web (proyectos Blazor WebAssembly y Blazor Server) implementa ILocationService como WebLocationService. De manera independiente, App.Desktop (.NET MAUI, WPF, Windows Forms) implementa ILocationService como DesktopLocationService.

Código específico de la plataforma .NET MAUIBlazor

Un patrón común en .NET MAUI es crear implementaciones independientes para distintas plataformas, como definir clases parciales con implementaciones específicas de la plataforma. Por ejemplo, vea el diagrama siguiente, donde se implementan clases parciales para CameraService en cada una de las clases CameraService.Windows.cs, CameraService.iOS.cs, CameraService.Android.cs y CameraService.cs:

Clases parciales para CameraService se implementan en cada CameraService.Windows.cs, CameraService.iOS.cs, CameraService.Android.cs y CameraService.cs.

Cuando quiera empaquetar características específicas de la plataforma en una biblioteca de clases que puedan consumir otras aplicaciones, se recomienda seguir un enfoque similar al descrito en el ejemplo anterior y crear una abstracción para el componente Razor:

  • Coloque el componente en una biblioteca de clases Razor (RCL).
  • Desde una biblioteca de clases .NET MAUI, haga referencia a la RCL y cree las implementaciones específicas de la plataforma.
  • Dentro de la aplicación de consumo, haga referencia a la biblioteca de clases .NET MAUI.

En el ejemplo siguiente se muestran los conceptos de las imágenes de una aplicación que organiza fotografías:

  • Una aplicación .NET MAUIBlazor Hybrid usa InputPhoto de una RCL a la que hace referencia.
  • La aplicación .NET MAUI también hace referencia a una biblioteca de clases .NET MAUI.
  • InputPhoto en la RCL inserta una interfaz ICameraService, que se define en la RCL.
  • Las implementaciones de clase parcial CameraService para ICameraService se encuentran en la biblioteca de clases .NET MAUI (CameraService.Windows.cs, CameraService.iOS.cs, CameraService.Android.cs), que hace referencia a la RCL.

Una aplicación .NET MAUIBlazor Hybrid utiliza InputPhoto de una biblioteca de clases de Razor (RCL) a la que hace referencia. La aplicación .NET MAUI también hace referencia a una biblioteca de clases de .NET MAUI. InputPhoto en la RCL inserta una interfaz ICameraService definida en la RCL. Las implementaciones de clase parcial CameraService para ICameraService están en la biblioteca de clases de .NET MAUI (CameraService.Windows.cs, CameraService.iOS.cs, CameraService.Android.cs), que hace referencia a la RCL.

Recursos adicionales