在 ASP.NET Core Blazor Hybrid 中重用 Razor 组件

注意

此版本不是本文的最新版本。 对于当前版本,请参阅此文的 .NET 8 版本

警告

此版本的 ASP.NET Core 不再受支持。 有关详细信息,请参阅 .NET 和 .NET Core 支持策略。 对于当前版本,请参阅此文的 .NET 8 版本

重要

此信息与预发布产品相关,相应产品在商业发布之前可能会进行重大修改。 Microsoft 对此处提供的信息不提供任何明示或暗示的保证。

对于当前版本,请参阅此文的 .NET 8 版本

本文介绍如何在 Blazor Hybrid 应用中创作和组织 Web 和 Web Views 的 Razor 组件。

Razor 组件可跨托管模型(Blazor WebAssembly、Blazor Server 以及在 Blazor Hybrid 的 Web View 中)和跨平台(Android、iOS 和 Windows)工作。 托管模型和平台具有组件可以利用的独特功能,但跨托管模型和平台执行的组件必须单独利用独特的功能,以下示例说明了这一点:

  • Blazor WebAssembly 支持同步 JavaScript (JS) 互操作,而 Blazor Hybrid 应用的 Blazor Server 和 Web Views 中严格异步的 JS 互操作通信通道不支持此操作。
  • Blazor Server 应用中的组件可以访问仅在服务器上可用的服务,例如实体框架数据库上下文。
  • BlazorWebView 中的组件可以直接访问本机本地桌面和移动设备功能,例如地理位置服务。 Blazor Server 和 Blazor WebAssembly 应用必须依赖外部服务器上应用程序的 Web API 接口来提供类似的功能。

设计原理

若要创作可跨托管模型和平台无缝工作的 Razor 组件,请遵循以下设计原则:

项目代码组织

尽可能多地将代码和静态内容放在 Razor 类库 (RCL) 中。 每个托管模型或平台都引用 RCL,并在应用的服务集合中注册 Razor 组件可能需要的各个实现。

每个目标程序集应仅包含特定于该托管模型或平台的代码以及帮助启动应用的代码。

Blazor WebAssembly、Blazor Server 和 WebView 都有对 Razor 类库 (RCL) 的项目引用。

对独特的功能使用抽象

以下示例演示如何通过托管模型和平台对地理位置服务使用抽象。

  • 在应用用来获取用户在地图上位置的地理位置数据的 Razor 类库 (RCL) 中,MapComponentRazor 组件会注入一个 ILocationService 服务抽象。
  • Blazor WebAssembly 和 Blazor Server 项目的 App.WebILocationService 实现为 WebLocationService,它使用 Web API 调用来获取地理位置数据。
  • App.Desktop 对于 .NET MAUI、WPF 和 Windows 窗体,将 ILocationService 实现为 DesktopLocationServiceDesktopLocationService 使用特定于平台的设备功能来获取地理位置数据。

在 Razor 类库 (RCL) 中,MapComponent 注入 ILocationService 服务。另外,App.Web(Blazor WebAssembly 和 Blazor Server 项目)将 ILocationService 实现为 WebLocationService。另外,App.Desktop(.NET MAUI、WPF、Windows 窗体)将 ILocationService 实现为 DesktopLocationService。

.NET MAUIBlazor 特定于平台的代码

.NET MAUI 中的一个常见模式是为不同平台创建单独的实现,例如使用特定于平台的实现定义部分类。 例如,请参阅下图,其中 CameraService 的部分类在 CameraService.Windows.csCameraService.iOS.csCameraService.Android.csCameraService.cs 中实现:

CameraService 的分部类分别在 CameraService.Windows.cs、CameraService.iOS.cs、CameraService.Android.cs 和 CameraService.cs 中实现。

如果要将特定于平台的功能打包到可供其他应用使用的类库中,建议采用与前面示例中所述的方法类似的方法,并为 Razor 组件创建一个抽象:

  • 将组件放置在 Razor 类库 (RCL) 中。
  • 从 .NET MAUI 类库中,引用 RCL 并创建特定于平台的实现。
  • 在消耗应用中,引用 .NET MAUI 类库。

以下示例演示了用于组织照片的应用中图像的概念:

  • .NET MAUIBlazor Hybrid 应用使用其引用的 RCL 中的 InputPhoto
  • .NET MAUI 应用还引用 .NET MAUI 类库。
  • RCL 中的 InputPhoto 注入了一个在 RCL 中定义的 ICameraService 接口。
  • ICameraServiceCameraService 部分类实现位于引用 RCL 的 .NET MAUI 类库(CameraService.Windows.csCameraService.iOS.csCameraService.Android.cs)中。

.NET MAUIBlazor Hybrid 应用使用其引用的 Razor 类库 (RCL) 中的 InputPhoto。.NET MAUI 应用还引用了 .NET MAUI 类库。RCL 中的 InputPhoto 注入了 RCL 中定义的 ICameraService 接口。ICameraService 的 CameraService 分部类实现位于 .NET MAUI 类库(CameraService.Windows.cs、CameraService.iOS.cs、CameraService.Android.cs)中,该类库引用了 RCL。