自的首次发布以来。NET Framework在2002年,开发人员一直在使用客户端-服务器架构构建大型应用程序。这些应用程序经常采用分层的方法,通过桌面或web前端访问业务逻辑来解决各种复杂的问题。
今天,C#和。除了Windows之外,NET还可以跨多种平台使用,包括带有Xamarin的Android和iOS,以及Apple Watch和Android Wear等可穿戴设备、通过三星Tizen的消费电子产品,甚至HoloLens。
在这篇博客文章中,我将展示如何从WPF移植业务逻辑,并为Android、iOS和UWP构建一个手机和表格友好的移动应用程序。现有的C#代码通常可以通过最少的更改重新使用,用户界面可以使用Xamarin.Forms XAML构建,以便跨平台运行。
使用Mobile Mindset移植桌面应用程序
与桌面或服务器应用程序不同,移动应用程序运行在有限的资源上,用户的注意力跨度最小。尽管本文主要关注现有代码的移植,但您也应该考虑对应用程序架构或用户界面进行更改,以便在手机和平板电脑上更好地工作。一个好的起点是我们移动开发原则.
WPF-to-mobile示例
几乎所有。NET代码库,包括Windows窗体、WPF、ASP。NET和Silverlight具有可移植到Xamarin.iOS、Xamarin.Android和UWP项目的共享代码。通过将平台无关的共享代码移动到。NET标准库(或共享项目),您可以在移动项目中轻松引用它们。
在这个例子中,我调动了一个费用样本几年前为支持云计算的WPF应用程序演示编写。该功能在移动设备上运行良好,如您所见:
![支持云的WPF应用程序在移动设备上运行](https://devblogs.microsoft.com/visualstudio/wp-content/uploads/sites/4/2018/04/Cloud-enabled-WPF-app-working-on-a-mobile-device.png)
最初的Expenses应用程序是为WPF中的桌面编写的一个厚客户端。该应用程序帮助用户管理费用,创建费用报告,并允许提交给经理审批。它连接到WCF后端和SQL Server以进行数据存储,如下所示:
![在WPF中为桌面编写的费用应用程序厚客户端](https://devblogs.microsoft.com/visualstudio/wp-content/uploads/sites/4/2018/04/Expenses-app-thick-client-written-for-desktop-in-WPF.png)
以下部分详细介绍了如何分析、重新使用和调整遗留应用程序代码以进行移动部署。您可以从我的GitHub回购.
分析动员代码
通常,任何非平台相关代码,即业务层、数据层、数据访问层、服务访问层等,都可以跨所有平台共享。为了帮助您识别哪些代码是可共享的,请使用.NET可移植性分析器工具. The.NET可移植性分析器为您提供了有关程序可移植性的详细报告。NET平台,通过分析程序集。可移植性分析器作为Visual Studio扩展和控制台应用程序提供。安装此扩展后,请确保在设置中检查要分析的平台,然后右键单击要分析的项目,然后单击“分析项目可移植性”
![在解决方案资源管理器中右键单击项目时的“分析项目可移植性”选项](https://devblogs.microsoft.com/visualstudio/wp-content/uploads/sites/4/2018/04/Analyze-Project-Portability-option-when-you-right-click-on-a-project-in-Solution-Explorer.png)
它将从Expenses WPF应用程序生成一个类似下面的报告。
![Expenses WPF应用程序中的演示报告表](https://devblogs.microsoft.com/visualstudio/wp-content/uploads/sites/4/2018/04/Demo-report-table-from-Expenses-WPF-app.png)
上述合并报告分析了两个图书馆——费用。WPF和费用。数据。显然,从报告中可以看出,费用。数据(数据层)可在所有平台上100%共享,费用也符合预期。WPF约有80%的股份。这些报告可在我的githubrepo–请参阅工作簿中的详细表格,以了解不可共享的库。
将WCF后端移植到Azure移动应用程序
我可以保留WCF后端as-is,并将其托管在云中,以便移动应用程序访问。然而,我决定将其移植到Azure移动应用程序,以利用离线同步支持,这是创建卓越移动用户体验的一个重要功能。在移动世界中,设备总是在移动,连接不断变化,网络中断时有发生。应用程序需要智能化,可以依靠本地存储的数据,并在与服务器建立更好的网络连接时按需传输数据。幸运的是,Azure移动应用程序通过其SDK为开发人员提供了一个简单的API,以支持在线和离线数据存储场景,包括在设备和服务器之间自动同步数据。
MyExpenses项目。MobileAppService具有从TableController继承的控制器,TableController提供RESTful端点,并很好地抽象出支持脱机数据同步的代码。
如果您是Azure移动应用程序的新手,这些文档将帮助您快速入门。但是,如果您希望在Azure上保留WCF服务as-is,在9频道观看这段视频.
Xamarin.Forms是一个跨平台UI工具包,可帮助您创建可在iOS、Android和通用Windows平台应用程序之间共享的本机用户界面。由于UI是使用目标平台的本地控件呈现的,因此Xamarin.Forms在每个平台上都保留了适当的外观。就像在WPF中一样,Xamarin.Forms中的UI是完全用XAML或C#代码创建的。然而,最好利用其DataBinding支持并采用MVVM(Model-View-ViewModel)模式。这里需要注意的一点是,WPF中使用的控件与Xamarin.Forms中的控件不同。尽管有类似的控件可用,但它们的命名通常不同,以适应移动用户界面准则,因此WPF XAML不能在Xamarin.Forms项目中重用。阅读我们的文档WPF与Xamarin。形式:相似性和差异.
关于移植这个WPF应用程序,有趣的是,100%的ViewModels、Helper、Converter、Models、Services以及任何没有平台特定引用的代码都可以在Xamarin.Forms应用程序中重用。因此,即使保留了整个UI逻辑(ViewModels),也只有新创建的UI(XAML)适合多设备移动外形。在这个示例项目中,我创建了名为“Legacy”的文件夹,以帮助您了解重用了哪些代码。
![只有UI XAML是新创建的,以适应多设备移动外形因素,同时保留整个UI逻辑ViewModels](https://devblogs.microsoft.com/visualstudio/wp-content/uploads/sites/4/2018/04/Only-UI-XAML-is-freshly-created-to-suit-the-multi-device-mobile-form-factors-while-retaining-entire-UI-logic-ViewModels.png)
有关如何构建此示例UI的详细信息,请参阅共享项目中的Views文件夹。WPF项目中的所有ViewModel都被重用了,没有做太多修改。尽管与WPF厚客户端应用程序相比,移动实现可能要简单得多。然而,我保留了as-is逻辑,以展示最大代码共享的重用。
为了快速开始在Azure移动应用程序中使用Xamarin.Forms,Visual Studio 2017和Visual Studio for Mac中有一个模板,它可以自动为您设置所有内容。您所需要做的就是将代码添加到正确的位置。
在Visual Studio中创建解决方案
打开Visual Studio 2017,单击文件>新建项目>Visual C#>跨平台>移动应用程序(Xamarin.Forms)。在下一个对话框中,确保选中选择Master-Detail模板Xamarin.Forms作为UI技术,并选择“Include Azure Mobile Apps backend project”选项。通过选择适当的Azure订阅并在首选资源组上托管来完成此过程。
![新项目对话框窗口显示跨平台移动应用程序下的包括Azure移动应用程序后端项目选项](https://devblogs.microsoft.com/visualstudio/wp-content/uploads/sites/4/2018/04/New-Project-Dialog-window-showing-Include-Azure-Mobile-Apps-backend-project-option-under-Cross-Plat-Mobile-App.png)
有关使用Xamarin.Forms构建跨平台应用程序的详细指导,请查看我们的入门指南.
使用Azure移动应用后端
从WCF移植到Azure移动应用程序的后端代码可以在MobileAppService中找到。对移动应用程序后端代码的解释超出了本文的范围。您可以从我的githubrepo并将其直接发布到Azure门户。
默认情况下,模板创建一个名为AzureDataStore的帮助器类,该类抽象了离线同步支持的代码。我进一步修改了它以适合Expenses项目。在这个项目中,我们有三个场景——
- 管理费用(添加/编辑/删除费用)
- 管理开支报告(附加费用、创建开支报告并提交以供批准)
- 管理员工
为了支持每个表的离线同步,创建了一个相应的数据存储,实现IDataStore<T>接口——T是Model对象。
源代码和总结
你可以从我的GitHub回购请参阅原始WPF源的_before文件夹和可移植性分析器报告的Port-Report文件夹。有关将现有Windows窗体或WPF应用程序移植到Android、iOS、macOS或UWP的详细文档,请参阅我们的移植指南.
您的现有。NET代码比你想象的更具移动性!
帖子动员现有人员。NET应用程序首次出现于Visual Studio博客.
]]>