Xamarin 社区工具包是一个使用 Xamarin.Forms 进行移动开发的可重用的元素集,包括动画、行为、转换器、效果和辅助工具。它简化了在使用 Xamarin.Forms 构建 iOS、Android、macOS、WPF 和通用 Windows 平台(UWP)应用程序时常见的开发任务。对于新的或现有的 Xamarin.Forms 项目,Xamarin 社区工具包可以通过 Visual Studio NuGet 获得。
由于 Xamarin.Forms 正在演变成.NET MAUI,Xamarin 社区工具包(XCT)也在为过渡做准备。InfoQ 采访了 Gerald Versluis。他是一位来自荷兰的微软软件工程师。他是微软的高级软件工程师,是 Xamarin 社区工具包开发和维护团队的核心一员。在这次采访中,我们探讨了 XCT、向 MAUI 的过渡以及他们未来的路线图。
InfoQ:您希望看到 XCT 未来包含哪些特性?
Gerald Versluis:现在有很多很棒的控件和库都是由社区推动的,都是隐藏的宝藏,如果能把其中一部分添加到我们的小工具包里,那就太好了。我认为,对于 Xamarin.Forms 和.NET MAUI 生态系统来说,在控件套件方面,仍有很大的改进空间。很多人都希望能有 data grid 或 autosuggest 之类的控件。因此,我们要么自己去创建这些东西,要么我们可以询问现有库的维护者是否愿意与我们合作并将其添加到工具包中。
这对大家都有利:维护者不必承担单独维护一个库的负担,库不再那么分散,它将被添加到一个活跃的、由微软支持的、更知名的库中。话虽如此,第三方供应商的控制套件做得很好,我们很难与之相媲美,但它们通常是付费的,所以并不适合所有人。这样,我们就多了选择,每个人都可以使用他们想要的控件。
但也不止于此。我认为,工具包的一个好处是,我们收集了很多人们正在使用的转换器。如果你使用过 Xamarin.Forms,你可能知道至少有一个转换器是你在每个项目中都需要的。但你没有把它封装在一个库中,因为它太小了,你一次又一次地复制和粘贴它。也许你会在一个项目中对它进行调整,突然间你就有了多个版本。将这些东西集中在工具包中,我们会让维护工作变得更容易,你只需把它放入这个库,这个库可以为你提供 Xamarin.Forms 的一站式服务。我们希望能在.NET MAUI 上继续这样做。
InfoQ:.NET MANI 社区工具包已在实施,那 Xamarin 社区工具包的未来有什么规划?
Versluis:我们在 Xamarin 社区工具包(XCT)中所做的一切,在.NET MAUI 社区(MCT)工具包中都需要进行(重新)评估。因为离.NET MAUI 的发布越来越近了,我们在引入新特性时会越来越谨慎。
对于 Xamarin.Forms 以及.NET MAUI,我们大致遵循同样的路径。XCT 和 Forms 一样,目前将主要是接收 Bug 修复和小的服务改进。同时,我们正在为 MCT 制定计划,看看我们保留哪些特性,放弃哪些特性。
实际上,这意味着我们将确保 XCT 可以继续使用 Xamarin.Forms,并且可以用于 iOS、Android 和 UWP 的新版本,但不会增加新特性。当对 Forms 的支持结束时,对 XCT 的支持也将结束。
回到可能被 MCT 放弃的特性,不用担心!我们还有一个 XCT 的兼容版本.NET MAUI Compat。如果你现在对.NET MAUI 有所了解,你就知道你可以启用一个兼容层,这样你的 Xamarin.Forms 渲染器等仍然可以在.NET MAUI 中使用,直到你有时间按照新的架构重写它们。
XCT .NET MAUI Compat 版本将拥有 XCT 的一切,但与.NET MAUI 兼容。因此,我们对每种情况都有解决方案,你永远不会被迫放弃今天已在使用的任何功能。
InfoQ:现在,我们有了两个社区工具包,您觉得它们应该变成一个吗?
Versluis:随着向.NET MAUI 社区工具包的迁移,实际上,它们某种程度上正在变成一个。对于其他工具包,最值得注意的是 Windows 社区工具包。从 Xamarin 社区工具包开始,我们就一直与他们保持着密切的联系,但在那时,比较难形成合力。
现在,随着工具包开始从头重写,我们获得了一个独一无二的机会,与 Windows 社区工具包开展了更紧密地合作。这意味着我们有了一个统一的名称:CommunityToolkit.Maui 和 CommunityToolkit.Windows,我们共享一个 GitHub 组织,我们所有的代码都在这里,只要有可能,我们就会分享代码,避免重复工作。
他们会不会成为一个很大的库?我认为不会如此。不会比我刚才描述的多。对于这一点,我认为最好是了解一下不同的软件开发工具包(SDK),以及它们如何相互配合。Windows 社区工具包(WCT)针对的是 UWP,或者说是 Windows。.NET MAUI 针对的是 UWP,但也包括 iOS、Android、macOS 等等。因此,举例来说,在控件方面,这将意味着我们必须匹配 WCT 中现有的每一个控件。它们已经有了很多控件,但也有很多控件在桌面上运行得非常好,在移动端上却不那么好。
除了控件之外,WCT 还包含了 MvvmLight,并在 CommunityToolkit.Mvvm 中做了他们自己的演化,这很棒!由于 Windows 和.NET MAUI 通过 XAML 共享很多相同的概念,我们现在可以在两个工具包中共享 MVVM 框架。这样做的同时,我们从我们的工具包中删除了一些概念,这些概念让我们接近于自己实现一个 MVVM 框架,这是我们不想做的。现在,我们可以把我们的 ObservableCollection 改进和其他东西从我们的工具包中拿出来,放到 CommunityToolkit.Mvvm 包中。这样一来,那些对 MVVM 不感兴趣的人就不会获取到他们不使用的代码,但仍然可以非常容易地添加它。
单个大库在依赖性方面也有很大的缺点。特别是在 Android 上,不同的控件存在于不同的 Android 包中。把所有东西都放在一个库里意味着人们会有大量他们可能永远都不会使用的依赖。这是我们在 XCT 和 MCT 中都努力达成的一种平衡。
我们现在的组织方式使我们能够真正地混搭。我们可以在可能的情况下共享代码,也可以根据需要使用.NET MAUI 和 Windows 专用的代码,并且未来有望扩展到 CommunityToolkit 家族...CommunityToolkit.Blazor?CommunityToolkit.WinForms?谁知道呢!
InfoQ:现在又引入了 MAUI Essentials,那么哪些特性将进入社区工具包,哪些特性将进入 Essentials,是根据什么策略呢?
Versluis:我们在这方面没有任何官方协议或准则。但是看看 Essentials 有什么,Toolkit 又有什么,它们之间的区别就很明显了。这一切都源于:工具包对 Xamarin.Forms 有硬性依赖,而 Essentials 则没有。你可以在 Xamarin.Android 或 Xamarin.iOS 项目中使用 Essentials 的所有 API,如果你想那样做的话。它基本上是在原生 API 上提供了一个抽象层,使它们更偏向于.NET 风格。
另外一点就是,工具包有很多的 UI 特性。无论是 XAML 支持,还是现有的完备的控件。Essentials 没有显示任何 UI 的特性。至少它们没有自己的用户界面。如果要显示任何 UI,那也是来自它所运行的操作系统。Essentials 提供的是访问传感器、媒体等与用户界面无关的功能。
不过,也难免会有一个灰色地带,存在一些重叠,但 Essentials、.NET MAUI 和 Toolkit 的团队彼此挨得很近,所以我们可以非常快速、非常容易地把事情理清。
InfoQ:将来的话,在.NET MAUI 社区工具中实现的所有新特性都会在 Xamarin 社区工具包中实现吗?
Versluis:如果你的意思是我们是否有计划把新功能从 MCT 移植回 XCT,那么答案将非常简单:不会。如前所述,XCT 将与 Xamarin.Forms 遵循相同的路径。真正的 "开发 "停止了,我们现在专注于修复 Bug 以及维护,从而保证 XCT 与 Xamarin.Forms 以及运行它们的操作系统相兼容,所以,你想用多长时间都可以,但不会有新东西加入了。
所有新开发的内容都将进入.NET MAUI 社区工具包。
嘉宾简介:
Gerald Versluis 是微软 Xamarin.Forms/.NET MAUI 团队的一名软件工程师。他有多年使用 Azure、ASP.NET、DevOps、Xamarin 和其他.NET 技术的经验,他参与过许多不同的项目,并一直在构建多个真实世界的应用程序和解决方案。他不仅喜欢写代码,而且还热衷于传播知识——当然,在这个过程中他也有所收获。在业余时间,Gerald 会参加演讲,提供(视频)培训课程,撰写博客和文章,在 Stack Overflow 上回答问题,并为开源项目做贡献。
原文链接:
Present and Future of Xamarin Community Toolkit: Q&A with Gerald Versluis
评论