在 ASP.NET Core Blazor Hybrid 中重複使用 Razor 元件

注意

這不是這篇文章的最新版本。 如需目前版本,請參閱本文的 .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) Interop,而 Blazor Server 和 Web Views 的 Blazor Hybrid 應用程式中嚴格非同步 JS Interop 通訊通道卻不支援。
  • Blazor Server 應用程式中的元件可以存取只能在伺服器上使用的服務,例如 Entity Framework 資料庫內容。
  • 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.Web 會將 ILocationService 實作為 WebLocationService,其會使用 Web API 呼叫來取得地理位置資料。
  • .NET MAUI 的 App.Desktop、WPF 和 Windows Forms,將 ILocationService 實作為 DesktopLocationServiceDesktopLocationService 使用平台特定的裝置功能來取得地理位置資料。

在 Razor 類別庫 (RCL) 中,MapComponent 會插入 ILocationService 服務。App.Web (Blazor WebAssembly 和 Blazor Server 專案) 會分別將 ILocationService 實作為 WebLocationService。App.Desktop (.NET MAUI、WPF、Windows Forms) 會分別將 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。

其他資源