1.7 应用程序类型和技术
可以使用C#创建控制台应用程序,本章的大多数示例都是控制台应用程序。对于实际的程序,控制台应用程序并不常用。使用C#创建的应用程序可以使用与.NET相关的许多技术。本节概述可以用C#编写的不同类型的应用程序。
1.7.1 数据访问
在介绍应用程序类型之前,先看看所有应用程序类型都使用的技术:数据访问。
文件和目录可以使用简单的API调用来访问,但简单的API调用对于有些场景而言不够灵活。使用流API有很大的灵活性,流提供了更多的特性,例如加密或压缩。阅读器和写入器简化了流的使用。所有可用的不同选项都包含在第23章中。也可能以XML或JSON格式序列化完整的对象。第27章讨论了这些选项。
为了读取和写入数据库,可以直接使用ADO.NET(参见第37章);也可以使用抽象层:ADO.NET Entity Framework (参见第38章)。Entity Framework提供了从对象层次结构到数据库关系的映射。
ADO.NET Entity Framework进行了若干次迭代。Entity Framework的不同版本值得讨论,以很好地理解NuGet包的优点。还要了解不应继续使用Entity Framework的哪些部分。
表1-4描述了Entity Framework的不同版本和每个版本的新特性。
表1-4
下面介绍一些细节。Entity Framework最初发布为.NET Framework类的一部分,和.NET Framework一起预装。Entity Framework 1是.NET 3.5第一个服务包的一部分,它有一个特性更新:.NET 3.5 Update 1。
第2版有许多新特性,因此决定和.NET 4一起跳到第4版。之后,Entity Framework以比.NET Framework更快的节奏发布新版本。要得到Entity Framework的更新版本,必须把一个NuGet包添加到应用程序中(版本4.1、4.2、4.3)。这种方法有一个问题。已经通过.NET Framework发布的类必须用以前的方式使用。只有新添加的功能,如代码优先,用NuGet包添加。
Entity Framework 5.0与.NET 4.5一起发布。其中的一些类附带在预装的.NET Framework中,而附加的特性是NuGet包的一部分。NuGet包也允许给Entity Framework 5.0和.NET 4.0应用程序安装NuGet包。然而在现实中,Entity Framework 5.0添加到.NET 4.0项目中时,(通过脚本)决定的包就是Entity Framework 4.4,因为一些类型必须属于.NET 4.5,而不是.NET 4。
下一个版本的Entity Framework解决了这个问题,它把所有Entity Framework类型移动到NuGet包中;忽略框架本身附带的类型。这允许同时使用Framework 6.0与旧版本,而不会局限于Framework 4.5。为了不与框架的类冲突,有些类型移到不同的名称空间中。对此,ASP.NET Web Forms的一些特性有一个问题,因为它们使用了Entity Framework的原始类,而这些类映射到新类没有那么轻松。
在发布不同版本的过程中,Entity Framework提供了不同的选项,把数据库表映射到类。前两个选项是Database First和Model First。在这两个选项中,映射是通过XML文件完成的。XML文件通过图形设计器表示,可以把实体从工具箱拖动到设计器中,进行映射。
在4.1版本中,添加了通过代码来映射的选项:代码优先(Code First)。代码优先并不意味着数据库不能事先存在。两者都是可能的:数据库可以动态地创建,数据库也可以在编写代码之前存在。使用代码优先,不通过XML文件进行映射。相反,属性或流利的API可以以编程方式定义映射。
Entity Framework Core 1.0是Entity Framework的完全重新设计,新名称反映了这一点。代码需要更改,把应用程序从Entity Framework的旧版本迁移到新版本。旧的映射变体,如Database First和Model First已被删除,因为代码优先是更好的选择。完全重新设计也支持关系数据库和NoSQL。Azure Table Storage现在是可以使用Entity Framework的一个选项。
1.7.2 Windows桌面应用程序
为了创建Windows桌面应用程序,可以使用两种技术:Windows Forms和Windows Presentation Foundation。Windows Forms包含包装本地Windows控件的类;它基于像素图形。Windows Presentation Foundation(WPF)是较新的技术,基于矢量图形。
WPF在构建应用程序时利用了XAML。XAML是指可扩展的应用程序标记语言(Extensible Application Markup Language)。这种在微软环境中创建应用程序的方式在2006年引入,是.NET Framework 3.0的一部分。.NET 4.5给WPF引入了新特性,如功能区控件和实时塑造。
XAML是用来创建表单的XML声明,表单代表WPF应用程序的所有可视化方面和行为。虽然可以以编程方式使用WPF应用程序,但WPF是迈向声明性编程方向的一步,软件业正转向这个方向。声明性编程意味着,不使用C#、Visual Basic或Java等编译语言通过编程方式创建对象,而是通过XML类型的编程方式声明一切对象。第29章介绍了XAML(使用XML Paper Specification、Windows Workflow Foundation和Windows Communication Foundation)。第30章涵盖了XAML样式和资源。第34章提供控件、布局和数据绑定的细节。打印和创建文档是WPF的另一个重要方面,参见第35章。
WPF的未来是什么? UWP是用于未来的新应用程序的UI平台吗?UWP的优点是也支持移动设备。只要一些用户没有升级到Windows 10,就需要支持旧的操作系统,如Windows 7。UWP应用程序不在Windows 7/8上运行。可以使用WPF。如果还愿意支持移动设备,最好共享尽可能多的代码。通过支持MVVM模式,可以使用尽可能多的通用代码,通过WPF和UWP创建应用程序。这种模式参见第31章。
1.7.3 UWP
UWP(Universal Windows Platform,通用Windows平台)是微软公司的一个战略平台。使用UWP创建Windows应用程序时,只能使用Windows 10和Windows的更新版本,但不限于Windows的桌面版本。使用Windows 10有很多不同的选择,如Phone、Xbox、Surface Hub、HoloLens和IoT。还有一个适用于所有这些设备的API!
一个适用于所有这些设备的API?是的!每个设备系列都可以添加自己的软件开发工具包(Software Development Kit, SDK),来添加不是API的一部分、但对所有设备可用的功能。添加这些SDK不会破坏应用程序,但需要以编程方式检查,这种SDK中的API在运行应用程序的平台上是否可用。根据需要区分的API调用数,代码可能变得混乱,依赖注入可能是更好的选择。
注意:第31章讨论了依赖注入,以及对基于XAML的应用程序有用的其他模式。
可以决定什么设备系列支持应用程序。并不是所有的设备系列都可用于每个应用程序。
在Windows 10后,会有新版本的Windows吗?Windows 11尚未计划。对于Windows应用程序(也称为Metro应用程序、Windows Store应用程序、Modern应用程序和UWP),应针对Windows 8或Windows 8.1。Windows 8应用程序通常也在Windows 8.1上运行,但Windows 8.1应用程序不在Windows 8上运行。这是非常不同的。为UWP创建应用程序时,目标版本是10.0.10130.0,定义了可用的最低版本和要测试的最新版本,并假设它在未来版本上运行。根据可以为应用程序使用的功能,以及希望用户拥有的版本,可以决定要支持的最低版本。个人用户通常会自动更新版本;企业用户可能会坚持使用旧版本。
运行在UWP上的Windows应用程序利用了Windows运行库和.NET Core。讨论这些应用程序类型的最重要部分是第32章和第33章。
1.7.4 SOAP服务和WCF
Windows Communication Foundation(WCF)是一个功能丰富的技术,旨在取代在WCF以前可用的通信技术,它为基于标准的Web服务使用的所有特性提供基于SOAP的通信,如安全性、事务、双向和单向通信、路由、发现等。WCF允许一次性构建服务,然后在一个配置文件中进行更改,让这个服务用于许多方面(甚至在不同的协议下)。WCF是一种强大而复杂的方式,用来连接完全不同的系统。第44章将介绍它。
1.7.5 Web服务和ASP.NET Web API
ASP.NET Web API是非常容易通信的一个选项,能满足分布式应用程序90%以上的需求。这项技术基于REST (Representational State Transfer),它定义了无状态、可伸缩的Web服务的指导方针和最佳实践。
客户端可以接收JSON或XML数据。JSON和XML也可以格式化来使用Open Data规范(OData)。
这个新API的功能是便于通过JavaScript和UWP使用Web客户端。
ASP.NET Web API是创建微服务的一个好方法。创建微服务的方法定义了更小的服务,可以独立运行和部署,可以自己控制数据存储。
ASP.NET 5是ASP.NET Web API的旧版本,从ASP.NET MVC分离而来,现在与ASP.NET MVC 6合并,使用相同的类型和特征。
注意:ASP.NET Web API和微服务的更多信息参见第42章。
1.7.6 WebHooks和SignalR
对于实时Web功能以及客户端和服务器端之间的双向通信,可以使用的ASP.NET技术是WebHooks和SignalR。
只要信息可用,SignalR就允许将信息尽快推送给连接的客户。SignalR使用WebSocket技术,在WebSocket不可用时,它可以回退到基于拉的通信机制。
WebHooks可以集成公共服务,这些服务可以调用公共ASP.NET Web API服务。WebHooks技术从GitHub或Dropbox和其他服务中接收推送通知。
1.7.7 Windows服务
Web服务无论是通过WCF完成还是通过ASP.NET Web服务完成,都需要一个主机才能运行。IIS(Internet Information Server,互联网信息服务器)通常是一个很好的选择,因为它提供了所有的服务,但它也可以是自定义程序。使用自定义选项创建一个后台进程,在运行Windows时启动的是Windows服务。这个程序设计为在基于Windows NT内核的操作系统的后台运行。希望程序持续运行,做好响应事件的准备,而不是让用户显式地启动时,就可以使用服务。一个很好的例子是Web服务器上的World Wide Web服务,它监听来自客户端的Web请求。
很容易用C#编写服务。.NET Framework基类在System.ServiceProcess名称空间中,处理与服务相关的许多样板任务。此外,Visual Studio .NET允许创建C# Windows服务(Service)项目,它给基本Windows服务使用C#源代码。第39章探讨了如何编写C# Windows服务。
1.7.8 Web应用程序
最初引入ASP.NET 1,从根本上改变了Web编程模型。ASP.NET 5是新的主要版本,允许使用.NET Core提高性能和可伸缩性。这个新版本也可以在Linux系统上运行,这个需求很高。
在ASP.NET 5中,不再包含ASP.NET Web Forms(它仍然可以使用,在.NET 4.6中更新),所以本书关注现代技术ASP.NET MVC 6,它是ASP.NET 5的一部分。
ASP.NET MVC基于著名的MVC(模型-视图-控制器)模式,更容易进行单元测试。它还允许把编写用户界面代码与HTML、CSS、JavaScript清晰地分离,它只在后台使用C#。
注意:第41章介绍了ASP.NET MVC 6。
1.7.9 Microsoft Azure
现在,在考虑开发图片时不能忽视云。虽然没有专门的章节讨论云技术,但在本书的几章中都引用了Microsoft Azure。
Microsoft Azure提供了软件即服务(Software as a Service, SaaS)、基础设施即服务(Infrastructure as a Service, IaaS)和平台即服务(Platform as a Service, PaaS)。下面介绍这些Microsoft Azure产品。
1. SaaS
SaaS提供了完整的软件,不需要处理服务器的管理和更新等。Office 365是一个SaaS产品,它通过云产品使用电子邮件和其他服务。与开发人员相关的SaaS产品是Visual Studio Online,它不是在浏览器中运行的Visual Studio。Visual Studio Online是云中的Team Foundation Server,可以用作私人代码库,跟踪错误和工作项,以及构建和测试服务。
2. IaaS
另一个服务产品是IaaS。这个服务产品提供了虚拟机。用户负责管理操作系统,维护更新。当创建虚拟机时,可以决定不同的硬件产品,从共享核心开始,到最多32核(这个数据会很快改变)。32核、448 GB的RAM和6144 GB的本地SSD属于计算机的“G系列”,命名为哥斯拉。
对于预装的操作系统,可以在Windows、Windows Server、Linux和预装了SQL Server、BizTalk Server、SharePoint和Oracle的操作系统之间选择。
作者经常给一周只需要几个小时的环境使用虚拟机,因为虚拟机按小时支付费用。如果想尝试在Linux上编译和运行.NET Core程序,但没有Linux计算机,在Microsoft Azure上安装这样一个环境是很容易的。
3. PaaS
对于开发人员来说,Microsoft Azure最相关的部分是PaaS。可以为存储和读取数据而访问服务,使用应用程序服务的计算和联网功能,在应用程序中集成开发者服务。
为了在云中存储数据,可以使用关系数据存储SQL Database。SQL Database与SQL Server的本地版本大致相同。也有一些NoSQL解决方案,例如,DocumentDB存储JSON数据,Storage存储blob(如图像或视频)和表格数据(这是非常快的,提供了大量的数据)。
Web应用程序可以用于驻留ASP.NET MVC解决方案,API应用程序可以用来驻留ASP.NET Web API服务。
Visual Studio Online是开发者服务(Developer Service)产品的一部分。在这里也可以找到Visual Studio Application Insights。它的发布周期更短,对于获得用户如何使用应用程序的信息越来越重要。用户因为可能找不到哪些菜单,而从未使用过它们?用户在应用程序中使用什么路径来完成任务?在Visual Studio Application Insights中,可以得到良好的匿名用户信息,找出用户关于应用程序的问题,使用DevOps可以快速解决这些问题。
注意:第20章介绍了跟踪特性以及如何使用Microsoft Azure的Visual Studio Application Insights产品。第45章不仅说明了如何部署到本地IIS上,还描述了如何部署到Microsoft Azure Web Apps上。