无论平台如何,企业应用开发人员都面临着几个挑战:
- 随时间变化的应用程序要求。
- 新的商机和挑战。
- 开发期间持续的反馈可能会显着影响应用程序的范围和要求。
考虑到这些,建立可以随时间轻松修改或扩展的应用程序很重要。 设计这种适应性可能很困难,因为它需要允许应用程序的各个部分独立开发和测试的架构,而不会影响应用程序的其余部分。
许多企业应用程序非常复杂,需要多个开发人员。 决定如何设计应用程序可能是一个重大挑战,以便多个开发人员可以独立工作在不同的应用程序上,同时确保在集成到应用程序中时,这些程序无缝集成。
设计和构建应用程序的传统方法导致所谓的单片应用程序,其中组件紧密耦合,并且它们之间没有明确的分离。 通常,这种单一的方法导致难以维护的应用程序,因为可能难以在不破坏应用程序中的其他组件的情况下解决错误,并且可能难以添加新功能或替换现有功能。
对这些挑战的有效补救是将应用程序分解成离散的,松散耦合的组件,可以轻松地集成到应用程序中。 这种方法提供了几个好处:
- 它允许由个人或团队开发,测试,扩展和维护个人功能。
- 它促进应用程序的横向功能(例如身份验证和数据访问)以及垂直功能(例如应用程序特定的业务功能)之间的重用和干净分离。 这样可以更容易地管理应用程序组件之间的依赖关系和交互。
- ·通过允许不同的个人或团队根据专业知识专注于特定任务或功能,有助于保持角色分离。 特别是,它在用户界面和应用程序的业务逻辑之间提供了更清晰的分隔。
- 决定如何在用户界面控件及其逻辑之间提供清晰的分离关系。 创建Xamarin.Forms企业应用程序最重要的决定之一是是将业务逻辑放置在代码隐藏文件中,还是在用户界面控件与其逻辑之间创建干净的分离关系,以使应用程序 更可维护和可测试。 有关更多信息,请参阅Model-View-ViewModel。
- 确定是否使用依赖注入容器。 依赖注入容器通过提供一种用于构建其注册依赖关系的类的实例的设施来减少对象之间的依赖关系,并根据容器的配置来管理其使用寿命。 有关详细信息,请参阅依赖注入。
- 选择平台提供的事件和组件之间松散耦合的基于消息的通信,这些通信不方便通过对象和类型引用进行链接。 有关详细信息,请参阅松散耦合组件之间的通信简介。
- 决定如何在页面之间导航,包括如何调用导航以及导航逻辑应位于何处。 有关详细信息,请参阅导航。
- 确定如何验证用户输入的正确性。 该决定必须包括如何验证用户输入,以及如何通知用户有关验证错误。 有关详细信息,请参阅验证
- 身份验证和授权。
- 确定如何从Web服务访问远程数据,包括如何可靠地检索数据以及如何缓存数据。 有关详细信息,请参阅访问远程数据。
- 决定如何测试应用程序。 有关更多信息,请参阅单元测试。
本指南提供有关这些问题的指导,并重点介绍使用Xamarin.Forms构建跨平台企业应用程序的核心模式和架构。 该指南旨在通过解决常见的Xamarin.Forms企业应用程序开发场景,并通过支持Model-View-ViewModel(MVVM)模式来分离演示,演示逻辑和实体的关注,从而帮助生成适应性强,可维护和可测试的代码。
示例应用程序
本指南包括一个示例应用程序eShopOnContainers,它是一个包含以下功能的在线商店:
- 对后端服务进行身份验证和授权。
- 浏览衬衫,咖啡杯和其他营销物品的目录。
- 过滤目录。
- 从目录中订购料品。
- 查看用户的订单历史记录。
- 配置设置。
示例应用程序架构
图1-1提供了示例应用程序架构的高级概述。
图1-1:eShopOnContainers高级架构
示例应用程序附带三个客户端应用程序:
- 使用ASP.NET Core开发的MVC应用程序。
- 用Angular 2和Typescript开发的单页应用程序(SPA)。 这种Web应用程序的方法避免了每次操作对服务器执行往返。
- 采用Xamarin.Forms开发的移动应用,支持iOS,Android和通用Windows平台(UWP)。
有关Web应用程序的信息,请参阅。
示例应用程序包括以下后端服务:
- 身份微服务器,它使用ASP.NET Core Identity和IdentityServer。
- 目录微服务器,它是使用EntityFramework Core消耗SQL Server数据库的数据驱动创建,读取,更新,删除(CRUD)服务。
- 订购微服务器,它是一种使用域驱动设计模式的域驱动服务。
- 一个篮子微服务器,它是一个使用Redis Cache的数据驱动CRUD服务。
这些后端服务作为使用ASP.NET Core MVC的微服务实现,并在单个Docker主机中部署为唯一容器。 总而言之,这些后端服务被称为eShopOnContainers参考应用程序。 客户端应用程序通过表示状态转移(REST)Web界面与后端服务进行通信。有关微服务和Docker的更多信息,请参阅Containerized微服务.
有关后端服务实现的信息,请参阅 .。
移动应用
本指南的重点是使用Xamarin.Forms构建跨平台企业应用程序,并使用eShopOnContainers移动应用程序作为示例。 图1-2显示了eShopOnContainers移动应用程序中提供前面列出的功能的页面。
图1-2:eShopOnContainers手机应用程序
移动应用程序使用eShopOnContainers参考应用程序提供的后台服务。 但是,它可以配置为为希望避免部署后端服务的用户使用来自模拟服务的数据。
eShopOnContainers手机应用程序执行以下Xamarin.Forms功能:
- XAML
- Controls
- Bindings
- Converters
- Styles
- Animations
- Commands
- Behaviors
- Triggers
- Effects
- Custom Renderers
- MessagingCenter
- Custom Controls
有关此功能的更多信息,请参阅Xamarin开发人员中心上的Xamarin.Forms文档,以及。
此外,eShopOnContainers手机应用程序中的某些类提供了单元测试。
移动应用解决方案
eShopOnContainers移动应用程序解决方案将源代码和其他资源组织到项目中。 所有项目都使用文件夹将源代码和其他资源组织到类别中。 下表列出了构成eShopOnContainers手机应用程序的项目:
项目 |
描述 |
eShopOnContainers.Core |
该项目是包含共享代码和共享UI的便携式类库(PCL)项目。 |
eShopOnContainers.Droid |
该项目拥有Android特定代码,是Android应用的入门点。 |
eShopOnContainers.iOS |
该项目拥有iOS专用代码,是iOS应用程序的入门点。 |
eShopOnContainers.UWP |
该项目拥有通用Windows平台(UWP)特定代码,是Windows应用程序的入门点。 |
eShopOnContainers.TestRunner.Droid |
该项目是eShopOnContainers.UnitTests项目的Android测试运行器。 |
eShopOnContainers.TestRunner.iOS |
这个项目是eShopOnContainers.UnitTests项目的iOS测试运行器。 |
eShopOnContainers.TestRunner.Windows |
该项目是eShopOnContainers.UnitTests项目的通用Windows平台测试运行器。 |
eShopOnContainers.UnitTests |
该项目包含eShopOnContainers.Core项目的单元测试。 |
来自eShopOnContainers手机应用程序的课程可以重新用于任何Xamarin.Forms应用程序,很少或根本没有修改。
eShopOnContainers.Core 项目
eShopOnContainers.Core PCL项目包含以下文件夹:
文件夹 |
描述 |
Animations |
包含能够在XAML中使用动画的类。 |
Behaviors |
包含暴露于视图类的行为。 |
Controls |
包含应用程序使用的自定义控件。 |
Converters |
包含将自定义逻辑应用于绑定的值转换器。 |
Effects |
包含EntryLineColorEffect类,用于更改特定Entry控件的边框颜色。 |
Exceptions |
包含自定义Service AuthenticationException。 |
Extensions |
包含VisualElement和IEnumerable 类的扩展方法。 |
Helpers |
包含应用程式的辅助类。 |
Models |
包含该应用程序的模型类。 |
Properties |
包含AssemblyInfo.cs,.NET程序集元数据文件。 |
Services |
包含实现提供给应用程序的服务的接口和类。 |
Triggers |
包含BeginAnimation触发器,用于在XAML中调用动画。 |
Validations |
包含验证数据输入的类。 |
ViewModels |
包含暴露于页面的应用程序逻辑。 |
Views |
包含应用程序的页面。 |
平台项目
平台项目包含效果实现,自定义渲染器实现和其他平台特定的资源。
概要
Xamarin的跨平台移动应用开发工具和平台为B2E,B2B和B2C移动客户端应用提供了全面的解决方案,能够在所有目标平台(iOS,Android和Windows)之间共享代码,并有助于降低总成本 的所有权。 应用程序可以共享其用户界面和应用程序逻辑代码,同时保留本机平台的外观和感觉。
企业应用开发人员面临着几个挑战,可以在开发过程中改变应用的架构。 因此,重要的是构建一个应用程序,以便随着时间的推移可以修改或扩展。 设计这种适应性可能很困难,但通常包括将应用程序分割成离散的,松散耦合的组件,可以轻松地集成到应用程序中。