当前位置:网站首页>MAUI 遷移指南

MAUI 遷移指南

2022-06-11 03:47:00 dotNET跨平臺

前言

為了能够讓大家更好的理解全新的MAUI框架, 那麼本次遷移指南主要給大家講解從Xamarin.Forms昇級到MAUI帶來了哪些全新的變化, 下面將圍繞以下幾點給大家重點介紹。

  • 單個代碼庫演變

  • 啟動配置演變

  • 統一資源管理

  • 依賴注入

  • 隱式using 指令

  • Essentials合並

  • 全新命名空間

您僅需要具備Xamarin.Forms的一些基礎概念

單個代碼庫演變

如下,演示了一個Xamarin.Forms典型應用的項目結構, 包含了一個共享類庫以及2個原生平臺的應用(Android/IOS)。
2e3027c2dd8904837e32219c2e4ce33b.png

  • MyApp(共享類庫): 用於編寫非特定平臺的業務邏輯實現代碼

  • MyApp.Android(原生安卓應用):包含Android平臺的特定配置、資源、程序集相關。

  • MyApp.iOS(原生安卓應用):包含IOS平臺的特定配置、資源、程序集相關。

如果您的應用選擇Windows平臺, 則會多一個UWP項目選項, 類似,這僅僅是針對UWP平臺的相關配置。

下面, 則演示了一個MAUI的典型應用的項目結果, 僅包含了一個項目。
889ede808fc199ab09171ad2de34fb2e.png
MAUI 應用的項目包含 一個 Platform 文件夾,每個子文件夾都錶示 .NET MAUI 可以面向的平臺
9d25332bb55dc2759f026b8a5f8d0d7e.png
在生成時,生成系統僅在為該特定平臺生成時包含每個文件夾中的代碼。例如,在為 Android 生成平臺時Android文件夾中的文件>將內置到應用包中,但其他平臺文件夾中的文件不會。

有了單代碼庫的支持, 我們不再需要單獨維護多個平臺的項目, 重複的SDK引用, 資源文件定義等。

關於基於多目標的配置, 可參考 MAUI 中配置多目標

啟動配置演變

在Xamarin.Forms當中, 無論是我們啟動Android還是IOS項目, 我們都需要在啟動之前初始化Xamarin.Forms框架。
Android

protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            //初始化Xamarin.Forms
            Xamarin.Essentials.Platform.Init(this, savedInstanceState);
            global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
            LoadApplication(new App());
        }

IOS中

public override bool FinishedLaunching(UIApplication app, NSDictionary options)
        {
            //初始化Xamarin.Forms
            global::Xamarin.Forms.Forms.Init();
            LoadApplication(new App());

            return base.FinishedLaunching(app, options);
        }

整個初始化過程中, 我們是無法進行配置的, 例如: 掃描程序集配置容器服務、導出字體、加載默認的控件渲染器、平臺綁定等。這也就意味著, 對於Xamarin.Forms而言,
大多數功能都是按照約定配置, 無法進行自定義, 以及服務大都是掃描程序集進行反射加載的。

在MAUI當中, 使用了類似通用主機結構來初始化 .NET MAUI 應用程序。這將為用戶提供非常微軟的體驗,並且讓許多代碼符合 ASP.NET Core 範式。

public static MauiApp CreateMauiApp()
	{
		var builder = MauiApp.CreateBuilder();
		builder
			.UseMauiApp<App>()
			.ConfigureFonts(fonts =>
			{
				fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
				fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold");
			});

		return builder.Build();
	}

在默認情况下, 每個單獨的平臺都會調用 CreateMauiApp 來構建應用程序的服務依賴。

統一資源管理

在Xamarin.Forms中, 每個項目都包含各自的資源文件, 大多數情况下, 我們會重複定義幾組相同的資源(字體、樣式、圖像)在對應的平臺
0b69b7809d32bbc31dd1b7c51814de5e.png

MAUI單項目解决了這個問題, 在 Resources 文件夾當中, 包含了所有的資源文件定義。
7850a77afd4a3151bb1edb3836b17dfa.png

依賴注入

在Xamarin.Forms中,如果我們想要使用依賴注入,來實現特定平臺的實現, 首先需要在共享類庫中定義標准接口, 然後每個平臺單獨實現一遍。
fe1ae811fbc5fe5c32df7985e61fd170.png

在具體的實現類當中, 我們還需要程序集級別的特性標記, 以便於Xamarin.Forms初始化的過程中能够掃描程序集並且加載到容器當中。

[assembly: Xamarin.Forms.Dependency(typeof(LocalService))]
namespace MyApp.Droid
{
    public class LocalService : ILocalService
    {
        public void SetValue(string key, object value)
        {

        }
    }
}

獲取容器服務的方式, 則可以通過DependencyService的靜態方法獲取。

var localService= DependencyService.Get<ILocalService>();

同樣, 針對字體的訪問, 也是通過掃描程序集的方式加載

[assembly: ExportFont("iconfont.ttf", Alias = "iconfont")]

那麼, 在MAUI當中, 通過通用主機的形式, 提供了容器可以進行自定義配置服務。

public static MauiApp CreateMauiApp()
    {
        var builder = MauiApp.CreateBuilder();
        builder
            .UseMauiApp<App>()
            .ConfigureFonts(fonts =>
            {
                //注入字體
                fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
                fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold");
            });

        //注入服務
        builder.Services.AddScoped<ILocalService, LocalService>(); 
        return builder.Build();
    }

是不是很輕松?不僅僅非常直觀, 也大大的提高的開發效率以及性能

隱式using 指令

有了global using , 我們無需在多個類當中重複定義命名空間, 只需要一句 global using, 從此別的類當中會自動引用。

global using System;
global using System.Threading;
global using System.Linq;
global using System.ComponentModel;

針對一些非常常見的命名空間, 我們都可以使用 global using。

  • Essentials合並
    Xamarin.Forms時期, 我們使用Essentials它是單獨進行nuget分發以及維護, 在配置的時候, 我們也需要單獨的初始化代碼。

Xamarin.Essentials.Platform.Init(this, savedInstanceState);PLAINTEXT複制全屏

MAUI則將Essentials全部融合到了MAUI項目當中, 命名控件則是 Microsoft.MAUI下, 例如訪問設備。

using Microsoft.Maui.Devices
  • 全新命名空間
    Xamarin.Forms 當中我們使用的 using Xamarin.Forms 變成了 using Microsoft.Maui 相關。

  • 性能改進
    性能也帶來了很大的改進, 可參考文章: .NET MAUI 中的性能改進

  • 關於更多
    1.事件處理程序
    2.兼容現有的渲染器模式
    後面再接著說...

原网站

版权声明
本文为[dotNET跨平臺]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/162/202206110335404771.html