.NET Core 2017年中已经发布了 2.0 版本了,而 2.1 版本也很快将发布。2017年底的 技术雷达 将 .NET Core 从“评估”移到了“试用”阶段,意味着运用这项技术的风险在不断减小。本文将简要介绍基于 .NET Core 的快速开发的方式。

.NET Core 产生于 2014年,是一个不折不扣的新开发平台。SmallTalk 的面向对象曾给软件产业带来革命,Ruby on Rails 曾经用“约定胜于配置”的特性俘获一片芳心,而到了编程平台的竞争白热化的今天,全新的 .NET Core 又何以面世呢?说起来,其实它并没有什么过人之处,只是总结了过去曾在 Windows 平台大放异彩的经验,剔除了为人诟病的累赘,并吸收了大量现代开发平台的特性而打造的,用官方的话说,是“面向未来”的开发平台。甩掉了包袱,又站在巨人的肩上,自然能够站得高,望得远的同时,轻装上路、跑步前进了。

快速开始

在网站上下载了 SDK,之后通过一个命令就可以快速创建一个简单的 .NET Core 应用程序了:

dotnet new console

使用任意文本编辑器编写完成代码之后,再执行一条命令就可以运行程序了:

dotnet run

   

是不是很容易上手?

对于现代开发平台来说,包管理是必不可少的功能。.NET Core 内置了 nuget 包管理能力,包括安装卸载,以及打包和发布等功能都内置提供了。如果需要安装一个依赖,也是执行一个命令:

dotnet add package Newtonsoft.Json

单元测试?为项目使用 dotnet new xunit 添加上单元测试项目之后,执行 dotnet test 即可执行测试:

dotnet test

真正开发应用程序的时候,我们需要一款顺手的编辑器。——以前在 Windows 上做 .NET 的时候,宇宙第一 IDE Visual Studio 是标配,尤其是在它提供了免费的完整版本之后更是如此。但跨平台的 .NET Core 可不再需要 Visual Studio 这种庞然大物了——虽然我承认用 Visual Studio 的人仍然是幸福的,而且 Mac 版本 也有了,但对于轻量级的快速开发来说始终还是个头太大了。

重点来了,基于 .NET Core 的开发甚至都不需要一个 IDE,可以使用任何文本编辑器进行。比如上面截图中的 vim。如果给 vim 安装上插件,还可以直接在 vim 里体验 IDE 里一样的高级开发功能,比如自动完成、查找引用等。不错,这正是利用了技术雷达中介绍的另一项技术来实现的:语言服务器协议。借助这项技术,Sublime Text 及 Visual Studio Code 等一众编辑器都可以作为 .NET Core 开发环境了!

开源标准

用过微软技术的人都对它的封闭性有一定的担心,毕竟他曾经做过不少把好技术葬送在自己平台上的事情,比如 WPF。不过近年来微软推出不少良心作品都广受好评,比如 Visual Studio Code 和 TypeScript。那么这里介绍的 .NET Core 可以说是另一个良心之作了,从 2014 年宣布开源之后,.NET Core 本身的所有开发工作都是开源的,定时与社区更新计划和状态,及时与网友交互讨论问题,从2016 年发布 1.0 版本到现在,已经发布了 2.0 版本,增加了大量的 API。旨在全面优化性能的 2.1 版本也在紧锣密鼓地开发之中,相信不久就会发布。

有意思的是,.NET Core 里不少实践都采用社区中已经约定俗成的模式,即使有对应的“微软风格”存在,甚至即使 Windows 上的 .NET 已经使用过的模式也不再兼容。从前面的演示可以看到,.NET Core 的开发流程与我们熟悉的 node.js 和 Ruby 等开发平台并没有什么不同,一个已经接触过其他现代化开发平台的工程师,新来接触 .NET Core,会显得毫无违合感。因此 .NET Core 可以称得上是一种标准的开发平台。

说到标准,微软本来是制定过很多标准的,从时区格式、字体格式到命令行格式、文本编码等都有他的标准存在。这次,.NET Core 在各方面都选择了社区标准,而非微软标准。比如下面这条命令行参数,是 GNU 风格,而不是 Windows 风格

dotnet help –help

其他方面,包括积极使用 JSON 和 yml 配置文件,以及语义版本化等,都是目前社区项目的典型实践,.NET Core 也都采用社区做法。在跨平台成为基本要求的年代,.NET Core 也不无意外地默认提供。.NET Core 运行时在 GitHub 的 CI 状态 如下,我们可以看到它默认提供大量平台的兼容性:

种种迹象表明,这次 .NET Core 确实是真心实意地在为社区提供标准化跨平台开发工具。由于采用了 MIT 协议,因此几乎可以随意使用其源代码和生成物。

博采众长

在这个普遍用“借鉴”来指代“抄袭”的年代,不抄点都不好意思了。据说 .NET 出现的时候,关于它与 Java 相互抄袭的说法就不绝于耳。不过时过境迁,不管是谁抄谁,这一仗算是 Java 完胜了。但 Java 步伐的缓慢也是众所周之的,Java 平台上的一些问题,使得 Kotlin、Groovy 和 Scala 等 JVM 上的兼容语言大放异彩。.NET 之所以能保持独立发展,除了用的人没有 Java 多、以及社区本身就没那么活跃之外,最大的原因其实是它本身已经比较完善了。

.NET Core 直接从 C# 7 开始支持。C# 语法的优雅性是从来没有人怀疑过的。比如,在我们谈论 Java 10 将增加隐式类型推导的时候,C# 这个功能已经存在了 10 年之久。其他的也就不一一列举了,本文并非意在引战。下面来看一段用 C# 并行异步调用 API,并进行异常处理和空值处理的例子:

可以看出,C# 的高级语法特性让我们更关注逻辑本身,而诸如多线程、级联的异步操作、异步操作的异常捕获,以及空值处理等“技术上”的操作都交由语言本身来完成。语法的直观已经脱离了语法糖的层面了,当大量这种语法糖的效果累加到一起之后,它就可以成为新的开发模式。正所谓,生产力决定了生产关系。在上面的例子里,在轻松地对集合进行异步化、并行化之后,我们将异步操作嵌入了函数式的操作步骤中。类似这样的语法能够释放开发人员的创造力,提高软件的质量。另外,.NET Core 还支持函数式编程语言 F#。

在 .NET Core 里开发 Web 应用时,使用 Kestrel 可以直接使用自宿主的 Web 服务器,这与 Spring Boot 的机制完全一样。而在 Web 应用中,最简单的 Web 程序只需要一行代码——与 node.js 的简洁性何其相似,另一方面它还使用源于 Rails 的约定胜于配置理念来构建 Web 应用。

下面是一个极简的 .NET Core 的 Web 应用的例子

.NET Core 作为 .NET 的开源版本,自然是会继承 .NET 本身十几年的发展成果的。因此,包括 nuget 在线上的大量资源,以及以前适用于 .NET 的各种技术,都适用于 .NET Core。比如 LINQ、Rx,以及 Entity Framework 等技术,不过它们很可能由于重新进行了实现,所以可能有了新的名字。值得注意的是,在这个过程中,也有不少老旧的技术是因为时代已经不再需要它们了,所以不会再提供了,比如 WCF、Windows Forms。

面向未来

现在这个人人讲云原生和微服务的时代,.NET Core 要想标榜是面向未来的开发技术,就得有一些真本事才行。

在微服务开发领域,它提供自宿主(self-hosted)的命令行 Web 应用,能以自包含(self contained)的形式直接与 .NET Core 运行时一起发布。对操作系统以及系统中需要安装的软件几乎没什么特别的依赖(以前的 ASP.NET 应用一般需要 IIS、Jexus)。.NET Core 天生的跨平台能力又让它与容器技术可以无缝结合,既可以支持 Linux 容器,也可以支持 Windows 容器。所以服务器环境不管是虚拟机,还是 Docker Swarm、Kubernetes、Service Fabric 之类的云原生(Cloud Native)容器环境,它完全不挑。在应用层面,.NET Core 应用可以用其他社区用的工具体系(如 zookeeper、Consul、Kafka、ELK、OpenAM),也可以用 .NET 社区中踊现出来的一批新的工具(如 Ocelot、Polly、Exceptionless、IdentityServer)等。开发体验方面,跨平台开发环境、包管理,以及云端持续集成等现代化应用开发的特性都已经完备。
说到面向未来的具体体现,就要细数一些人们都在关注的方向了,比如 Web Assembly、无服务器和 IoT 等。ASP.NET Core 团队正在投入 Blazor 项目的开发,旨在将 .NET Core 代码带到浏览器中,目前已经取得一定进展。可以在这里在看到实际样例 Demo。无服务器技术本身是对云资源的再一次抽象,以达到对应用进行随时启停的目的。.NET Core 能与容器技术很好地兼容,本身又足够轻量级,所以它与无服务器技术的结合也就很自然而然了。目前 AzureAWS 都已经推出了 .NET Core 的无服务器应用环境。在一个不显眼的网页,.NET Core 官方宣布,其运行时支持 ARM 架构 CPU,可以运行于树莓派等设备上,这为 .NET Core 在 IoT 设备上运行扫清了障碍。

这两年,伴随着人工智能技术的走热,Python 也越来越被人们熟知,这正是由于它一直以来在这个领域的大量积累才获得的成就。.NET Core 既拥有快速开发的能力,又在面向未来的开发上占有先机,因而在可以预见的未来里,.NET Core 作为一种通用性的开发平台,也必将以优雅的姿态被运用到更多领域的开发中去。 

结论

有人说,微软的东西,到了2.0版本才敢用,原因是 1.0 版的时候还只是个原型,可能太简陋又可能被砍掉(或者改名)。而一般2.0 版本就代表了稳定:已经投入了精力去打造,并且仍会继续投资的产品。所以开发者可以放心地把 .NET Core 用于生产环境了。在微服务环境中,由于服务体积小,迭代周期短,开发过程的快速就特别重要了。作为一款优雅、高效,具有广泛兼容性的静态开发平台,.NET Core 必然会成为微服务主要开发语言之一。

与以往典型的微软开发平台不同的是,.NET Core 是一个新产品,有点像腾讯微信之于腾讯 QQ,因此相信 .NET Core 会是一个不同于过往的版本,它会更开放,更现代化。对于以前就有 .NET 开发经验的人来说,这无疑是一个更新开发方式的好机会,而对于还没有深入了解的人来说,可以拿出几分钟小试一下