当前位置:网站首页>MAUI 遷移指南
MAUI 遷移指南
2022-06-11 03:47:00 【dotNET跨平臺】
前言
為了能够讓大家更好的理解全新的MAUI框架, 那麼本次遷移指南主要給大家講解從Xamarin.Forms昇級到MAUI帶來了哪些全新的變化, 下面將圍繞以下幾點給大家重點介紹。
單個代碼庫演變
啟動配置演變
統一資源管理
依賴注入
隱式using 指令
Essentials合並
全新命名空間
您僅需要具備Xamarin.Forms的一些基礎概念
單個代碼庫演變
如下,演示了一個Xamarin.Forms典型應用的項目結構, 包含了一個共享類庫以及2個原生平臺的應用(Android/IOS)。
MyApp(共享類庫): 用於編寫非特定平臺的業務邏輯實現代碼
MyApp.Android(原生安卓應用):包含Android平臺的特定配置、資源、程序集相關。
MyApp.iOS(原生安卓應用):包含IOS平臺的特定配置、資源、程序集相關。
如果您的應用選擇Windows平臺, 則會多一個UWP項目選項, 類似,這僅僅是針對UWP平臺的相關配置。
下面, 則演示了一個MAUI的典型應用的項目結果, 僅包含了一個項目。
MAUI 應用的項目包含 一個 Platform 文件夾,每個子文件夾都錶示 .NET MAUI 可以面向的平臺
在生成時,生成系統僅在為該特定平臺生成時包含每個文件夾中的代碼。例如,在為 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中, 每個項目都包含各自的資源文件, 大多數情况下, 我們會重複定義幾組相同的資源(字體、樣式、圖像)在對應的平臺
MAUI單項目解决了這個問題, 在 Resources 文件夾當中, 包含了所有的資源文件定義。
依賴注入
在Xamarin.Forms中,如果我們想要使用依賴注入,來實現特定平臺的實現, 首先需要在共享類庫中定義標准接口, 然後每個平臺單獨實現一遍。
在具體的實現類當中, 我們還需要程序集級別的特性標記, 以便於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.兼容現有的渲染器模式
後面再接著說...
边栏推荐
- Xu Li 618, how can Suning fight this hard battle?
- Skynet source code analysis make
- 基于SSM框架的学生在线教育教学课程管理系统
- 从功能测试进阶自动化测试,熬夜7天整理出这一份3000字超全学习指南【附网盘资源】
- 让人感到心灵平静,阳光温暖的图片
- Object storage Minio tutorial
- RT thread test
- pmm监控oracle
- 【SignalR全套系列】之在.Net6中实SignalR通信
- The key data of music genuine rate is missing. What is the odds of Netease cloud music IPO?
猜你喜欢

How to improve the efficiency of regression testing

Comparison of four delivery modes of Message Oriented Middleware

大厂外包or自研公司?测试人找工作怎么选?
![[elt.zip] openharmony paper Club - fast random access string compression](/img/e6/e47046d6e56ca0c2608fc50060eb23.png)
[elt.zip] openharmony paper Club - fast random access string compression

Lecturer paging query_ Instructor condition query with page

SQL查询连续三天登录的用户

Exam item management system based on SSM

用Fragment实现图片简易浏览

Thinkphp3.2.3 deserialization using chain analysis

Lvgl Chinese font production
随机推荐
Parameter transfer format when the parameter of PostgreSQL function is a user-defined type
Lianyirong (passed)
unforgettable moments
OpenGL第十一章 多光源
Xu Li 618, how can Suning fight this hard battle?
VIM quickly select a method / function
OpenGl第九章 光照贴图
让人感到心灵平静,阳光温暖的图片
RT thread test
thinkphp3.2.3反序列化利用链分析
【ELT.ZIP】OpenHarmony啃论文俱乐部——数据高通量无损压缩方案
OPENSSL ASN.1, DER, PEM, X509
Benefits of declaring variables
OpenGL Chapter 9 lighting map
JS click the sun and moon to switch between day and night JS special effect
RHEL7 切换字符编码为GBK
Understand single chip microcomputer drive 8080lcd
Oppo K9 tests "bundling sales" and consumers "earn" or "lose"?
Free flying animation of paper plane based on SVG
Mavros controls UAV to conduct binocular slam in gazebo environment