\\\本文要点
\\
- 与传统的.NET Framework相比,.NET Core平台具有显著的性能优势。\\t
- .NET Core在Microsoft平台之外也广为采用,并受益于强大的社区参与。\\t
- .NET Core在设计上采用以服务器为中心,而非聚焦于Windows。.NET Core开发受益于这种设计。\\t
- .NET Core现已成为一种适用于新应用开发的稳定平台。\
随着.NET Core 2.0的发布,这个最初发布于2016年的平台终于有了最新的主版本,该平台具有通用性、模块化、跨平台和开放源代码的特性。.Net Core涵盖了当前.NET Framework版本中可用的很多API。其初衷是为下一代ASP.NET解决方案提供支持,但现在却已成为其它许多应用场景的基础,例如物联网、云计算和下一代移动解决方案。在本系列文章中,我们将探讨.NET Core的一些优势,以及它如何给传统.NET开发者以及所有需要为市场提供强大、高性能和经济解决方案的技术人员带来好处。
\\这篇是“.NET Core”系列文章的一部分。读者可以通过订阅RSS接收更新通知。
\\在本文中,五位资深开发人员对.NET Core平台开展做了一次探讨,内容涉及.NET Core的应用情况,以及其未来的发展方向。通过本文,读者可一窥平台的优缺点,并确定自己是否可在未来做开发时从中受益。
\\讨论小组成员
\\- Jeff Ammons\\t
- Jeremy Miller\\t
- David Pine\\t
- Mark Rendle\\t
- Spencer Schneidenbach\
InfoQ:先请大家做个简要的自我介绍,以及目前使用.NET Core的情况。
\\\\\Jeff:我早在.NET Core还被称为ASP.NET vNext时就开始跟进。虽然我在2012年几乎远离了Microsoft开发,但是vNext让我重拾旧业!我从2014年开始着手宣讲Core,因为在我看来,它为服务器端/Web项目提供了一个更好的基础。
\
\\\Jeremy:我牵头了多个.NET社区的OSS项目,其中部分项目的目标就是混用整个.NET Framework和NETStandard。
\
\\\David:我自2015年下半年以来就一直在使用.NET Core做开发。此后在2016年1月,我开始做PoC(概念验证,Proof-of-Concept)应用。从那时起,我们整个团队一直在积极使用.NET Core做开发。我们借助ASP.NET Core构建企业Web应用。在当时,它还被称作ASP.NET 5,依赖于.xproj文件格式和project.json。我认为自己是一名.NET Core的早期采用者,非常高兴看到.NET Core的发展。同样,我对开发者社区心存感激,正是社区帮助该Microsoft产品定型发展,并使其发展超出人们的预期。我相信NET Core只会变得更好。
\
\\\Mark:我从开始就是一位.NET用户,并自第一次预览版发布以来就在持续使用.NET Core,当时它被称为Project K。我一直为团队和组织提供培训课程和咨询,其中包括.NET Core本身,以及其开放的新生态系统,诸如Linux、Docker、Kubernetes等。我目前正在开发关于使用ASP.NET Core构建云原生应用的一系列在线课程。
\
\\\Spencer:我曾在一些新建的项目中使用了.NET Core,这些项目主要是将ASP.NET Core用做React-Redux应用的后端。我还召集了数次ASP.NET Core的研讨会,其中一次是聚焦于Angular,还有一次是聚焦于ASP.NET Core本身。它们均可由.NET Core提供支持!
\
InfoQ:你们喜欢.NET Core的哪些强大之处?
\\\\\Jeff:每次我在做关于Core的演讲中,该问题都会被问及。例如,“作为一名Windows开发人员,我为什么要关心跨平台问题?”。答案就在于性能上的考虑。最初,.NET是在单台Windows计算机上针对单用户做的优化。与针对多台服务器上的大量用户做了优化的技术(例如Node等)相比,.NET如果仅绑定于Windows并面向单一用户,那么其将难以在多用户服务器环境中创建超高性能的应用。Core使得Microsoft得以将开发基础重置为以服务器为中心的模式。
\
\\\Jeremy:我个人最喜欢之处在于它是跨平台的。我能够将.NET Core的大部分开发工作移植到其它操作系统上。虽然简化csproj文件格式正的确是朝正确方向迈出的一大步,但我仍希望.Net Core能够保持更简洁的project.json格式。dotnet cli工具是我编写的书中的一个亮点。相比以往而言,它极大地简化了OSS工具脚本的构建,最终以简洁的命令行工具启动和管理项目文件。改进的Nuget工具结合了更好的csproj文件格式,这极大地降低了我们在上一代经常会碰到的Nuget和Visual Studio.Net的合并冲突问题,无需诉诸于Paket这类大多数开发人员不太了解的工具。
\
\\\David:很明显,.NET Core的开源、跨平台和卓越性能会受到大多数开发人员的喜爱。 但我的喜欢之处在于.NET Core依然是.NET。如果你曾经在.NET中做过开发,尤其是使用过C#,那么你就会接触到那些优秀的工具、令人叹为观止的社区,以及世界上最强大的编程语言之一。我相信.NET Core对Microsoft而言是迈向正确方向的一步,这对于所有的框架开发人员来说尤为重要。开放源码和跨平台应该成为标准。开发人员可以对C#语言或者是.NET Core中的一项功能做出贡献,并产生影响,这是Microsoft所取得的一项令人难以置信的成就。赋予开发人员阅读源代码、设计实现和运作内部架构的能力是非常有必要的。为此,我向Microsoft脱帽(“红帽子”,Red Hat)致敬。
\
\\\Mark:.NET Core的强大之处主要在于跨平台支持。事实上,你可以开发一个运行在Windows或Linux上的独立应用,或者使用macOS开发可在x86和ARM CPU上运行的应用,这一点令人惊叹。最重要的是,由于采用了正确的开源发展方式,我们已经看到了由社区给出的一些惊人贡献。这使得其性能得到了改善,尤其是在网络方面,并且还有更多的改进即将推出。我们可以在继续使用C#以及一些熟悉的框架和库的情况下,获得所有这些现代优点,这是非常美妙的事情。
\
\\\Spencer:跨平台绝对是.NET Core的最大卖点和最大优势。我先前曾提出过这一观点,即.NET Core旨在吸引下一代的开发人员,而非那些目前使用.NET Framework的开发人员。但是,随着.NET Core中添加了越来越多的功能(例如System.Drawing和System.DirectoryServices等,不胜枚举),我想我们会看到更多的.NET开发人员和商店转移到.NET Core。
\
InfoQ:目前.NET Core中是否还存在一些缺点,这些缺点是你们希望在未来能得到改进的?
\\\\\Jeff:一些重要遗漏将会随时间的推移而得到添加。在过去一年中,改善就非常显著。去年秋天之前,Core的巨大弱点在于.NET、ASP.NET和Visual Studio团队之间的脱节问题。但是在秋季发布之后,团队的脱节问题得到了解决,这才使我可以向其他人推荐使用Core做开发。另一个很好的例子是project.json转换为*.csproj的彻底失败。但是该过程的变化过晚,因此对于早期创建生产项目的人而言,这无疑是一种惩罚。我们需要Core能达到一个稳定的高度,才可以认真地考虑着手采纳的问题。
\
\\\Jeremy:在我看来,如果开发人员需要直接编辑csproj文件,那么目前的文件格式仍然过于繁琐。为消除一些MSBuild内部关注的问题,同时将文件格式推向用户友好的方向,Core在工具和文件格式方面还存在着一定的改进余地。我非常希望看到能推出AssemblyLoadContext概念,并以此作为曾经的AppDomain模型的一个轻量级继任者。
\
\\\David:当前,.NET Core的一个主要弱点就是随之而生的一些误解。无数的开发人员仍然在问,“.NET Core、.NET Standard和.NET Framework有什么区别?”。类似问题还包括,开发人员应该选择哪一个,以及为什么。选择并非总是那么简单或清楚。例如,实际上可能存在以.NET Framework为目标的.NET Core应用。这样的应用的确可能会令人困惑,因为我们知道.NET Framework和.NET Core都是.NET Standard的运行时实现。.NET Core的术语被重载,存在.NET Core应用、.NET Core CLI、.NET Core SDK和.NET Core运行时。我相信,在使所有这些术语更易于理解和使用的方面上还有很大的提升空间。
\
\\\Mark:Core在性能方面还有一些工作要做。例如,在TechEmpower“纯文本”基准测试中,ASP.NET Core的Web服务器Kestrel表现极佳;但在涉及数据库查询等的高级测试中,Kestrel则表现不佳。在性能方面上,大部分从完全(full-fat).NET Framework迁移过来的代码都可以得到很大的改进。好消息是,现在人们正在深入研究代码,并挖掘这些性能问题。
\
\\\Spencer: Core缺乏一些与.NET Framework相匹配的功能。这意味着当前的.NET开发人员在尝试.NET Core时,必须要决定.NET Framework的某些核心功能是否值得弃用。如果你正在使用System.Drawing、System.DirectoryServices,或是某些仅针对.NET Framework的框架,那么你就不会那么好运了。ASP.NET Core已经是一个非常成熟的产品,从ASP.NET MVC/Web API转向非常简单,但并非所有的事情都是如此。例如,Entity Framework 6到EF Core的转换就并非易事。
\
InfoQ:如果现在你要为组织启动一个新项目,你会选择.NET Core而非.NET Framework吗?原因是什么?
\\\\\Jeff: 是的,我就是这样做的!服务器端性能是我做出选择的一个主要原因。另一个主要原因是MVC和WebAPI控制器的整合。对我而言,具有两个独立的代码库是毫无意义的。第三个原因是标签助手(Tag Helpers)。我希望我的HTML看上去尽可能更像是HTML。我一向不喜欢
\\@Html.ActionLink(“Which param is this”, “Or this”, “Wait What Is This One Again”, new { @class = \"OhComeOnYouMustBeKidding\"})
这样的风格。添加CSS类绝对是一个最好的做法。我非常喜欢这样的风格:
\\\
\u0026lt;a asp-controller=”book” asp-action=”edit” class=”MyCSS”\u0026gt;Edit\u0026lt;/a\u0026gt;
\\\Jeremy:当然是的,并且我们已经这样做了。主要原因在于.NET Core对于更多的主机和开发选项而言是跨平台的。
\
\\\David:我会选择.NET Core而非.NET Framework。对我来说,这个选择非常简单,因为我没有开发任何新的WinForms、WPF、WCF或ASP.NET WebForms应用。我很高兴使用Microsoft提供的最新的、最伟大的技术。到目前为止,我唯一期望的就是能看到即将推出的SignalR。在我看来,进步是直截了当的,这是朝着正确方向迈出的一步。我唯一关心的问题是关于.NET Core的可用性。只有一个选项是有点令人沮丧。事实上,我宁愿Microsoft只是声明我们现在需要全部使用.NET Core,并且可以具有以.NET Framework为目标的TFM(目标框架名字对象,Target Framework Moniker)。
\
\\\Mark:对于一个新的项目,我绝对会默认使用.NET Core。最显著的原因在于.NET Core应用性能的提高和占用空间的减少,这意味着无论是对于云还是私有数据中心,可真正做到在基础架构上的成本节省。我主要从事Web和后端服务开发,能够使用Docker和Kubernetes等容器编排工具跨平台开发和部署应用,这是一项真正的优势。对于具有WPF、UWP或Xamarin移动组件的混合项目,使用.NET Standard可让开发人员在整个.NET或Xamarin项目与.NET Core Web或服务项目之间共享软件包。
\
\\\Spencer:我的组织在.NET Framework上运作得很好,所以现在可能不会考虑.NET Core。但是我们希望在某个时候重新开发我们的平台。我们届时将会认真地考虑.NET Core。不必被锁定到基于Windows的托管,这是一件非常好的事情,但当前对我们并不是一个大问题!
\
InfoQ: 你们认为.NET Core的发展是否会超越Microsoft之外,还是会继续局限在现有的.NET开发者社区中?
\\\\\Jeff:我希望如此。这是Microsoft首次有机会必须面对新一代的Web开发人员,这些开发人员认定必须使用Mac做开发。我在课堂上以VS Code入手讲授Core。尽管我越来越喜欢Code,但毫无疑问,完整的Visual Studio具有更高的生产率。目前为止在深入学习了ASP乃至Core之后,大多数从Mac或Linux入手的学员都会转向使用Windows。我们希望能改进非Windows、非Visual Studio开发人员的体验。
\
\\\Jeremy:如果在TechEmpower趋势图上,基于ASP.Net Core的架构能保持攀升势头,情况或许会是如此。.Net Core必须要克服数十年来存在的一些关于Microsoft开发技术和文化的陈旧观念。
\
\\\David:我认为.NET Core的发展已经超出Microsoft之外。从统计数字上看,.NET Core代码库事实上每天都会接受来自于非Microsoft雇员处的Pull请求。此外,.NET基金会有1700多家公司为.NET生态系统做出贡献,具有550多个以.NET为核心的源代码库!认真想来,这非常不同寻常。如果Microsoft不公开源代码,那么这些都是不可能的做到的。.NET开发人员社区与以往一样的强大。
\
\\\Mark:我很希望看到.NET Core的发展壮大,吸引更多来自于其它生态系统的开发人员。它已具有大量的社区支持,似乎主要来于已有的.NET社区,尽管我们可以看到某些行业对此展示出越来越浓厚的兴趣。三星就是一个很好的例子。该企业已经在其Tizen操作系统中采用了.NET Core。我们很高兴看到Amazon和Google也已加强了对云平台的支持,包括提供很好的SDK支持。感觉Core项目像是一个开始,即更开放的Microsoft开始更积极地参与其它的社区。我希望该项目能继续发展,使得这些社区继续与Microsoft合作。
\
\\\Spencer: 很难说。我认为信任是Microsoft在开源领域中存在的最大问题,但是他们已经取得了巨大的进步。Visual Studio Code就是一个例子,它对开源软件的各个方面都已产生了重大的影响。我认为时间会证明一切。
\
InfoQ:你们认为.NET Core在未来两年中将会如何发展?
\\\\\Jeff: 我期望Core的发展轨迹能遵循我们所见的MVC发展的同一轨迹。起初,MVC由于与Web Forms存在一些迥异之处,因此并未受到Microsoft开发人员的喜爱。之后,在开发人员勉为其难地尝试之后,他们的态度发生了转变,进而开始喜欢使用它。现在,开发人员对Core的感受也是一样的。其中的一个巨大的差异之处在于,开发人员的MVC和WebAPI上技能可以得到更多的转换,大大地超过了可转换为MVC的Web Forms技能。
\
\\\Jeremy:如果在以Netstandard 2.0为目标的项目中使用旧的.Net库是切实可行的,我认为更多的开发团队最终会跳到.Net Core。目前出于项目依赖性尚未针对Netstandard的顾虑,这些团队可能会犹豫不决。
\
\\\David: 我并不认为.NET Core真的有什么特别之处。随着它越来越受欢迎,它将会得到日益广泛地采用。.NET Core的工具将变得更高效、无缺陷并且更为实用,进而提高开发人员的工作效率。我相信,.NET Core将成为.NET生态系统内新开发工作的一个行业标准。在ASP.NET Core中引入更好的SPA(单页面应用,Single Page Application)实例并非我的关注点。尽管据我所知,现在已有一些JavaScriptServices代码库,可以帮助开发人员构建Angular或React之类的项目,但我还是希望Microsoft能够涉足客户端框架。Microsoft已经给出了TypeScript,因此已在朝着正确的方向推进!
\
\\\Mark:现在大企业客户开始认真考虑是否可对新项目使用.NET Core,这是我们当前所处的采纳曲线阶段。这种趋势将持续下去,并有望推动更广泛的生态系统向前发展。如果看一下.NET Core、ASP.NET Core、C#等一些项目的路线图,它们已经推出了一些非常令人惊奇的进展。其中的CoreRT是我最喜欢的一个项目,它为.NET提供了AoT编译,支持开发人员构建不带运行时依赖项的独立可执行文件。这些项目也增加了对WebAssembly的支持,支持开发人员编写并编译C#代码,在浏览器中执行复杂的处理。我非常期待看到未来的发展!
\
\\\Spencer:增加一些与.NET Framework相对应的特性,可能将有助于推动.NET Standard的发展。
\
InfoQ:大家最后再谈谈看法?
\\\\\Jeff:相比于推出新特性而言,长期稳定性将成为考虑采用Core时更看重的因素。Core正在接近于此。我是“长期支持版到当前版”模式(LTS vs Current Model)的坚定支持者,这种模式正被Node、Ubuntu等使用。从一个组织的角度考虑,我需要了解是否可以押注一种技术,该技术在必须要做出重大改变之前,至少会保持3到5年的稳定期。同时,我也需要知道该技术的创新也是在稳步推进的。
\
\\\Jeremy:至少在Netstandard 2之前,.NET Core的杀手级问题就是,其在从.NET OSS生态系统分离出来时,如何避免出现像臭名昭著的Python 3发行版那样的问题。要实现完整的框架和.NET Core的多目标并非易事,这可能会成为OSS开发时的一个阻碍。
\
\\\David:我一直惊讶于对.NET Core或ASP.NET Core闻所未闻的.NET开发人员数量。我相信Core是新Microsoft的一部分,作为开发人员肯定是要对此亦步亦趋的。在我的全部编程生涯中,这的确将成为一个我会讲述给孙辈们的创新经历,“令人记忆犹新的是,当年Microsoft同时推出了开放源代码和跨平台。他们将其称为.NET Core,孩子们,请不要介意这个名字”。的确,这是一个激动人心的时刻!
\
\\\Mark:正如大家从我的谈话中可以看出,我是.NET Core的一位忠实粉丝。如果你正启动一个新的ASP.NET项目,你应该使用Core。它与.NET非常相似,所以你能很快就开始运行。它也是稳定的,并正得到一些开源的生态系统的支持。它只会变得更好。
\
讨论小组成员简介
\\Jeff Ammons 是Code Career Academy的首席讲师,在亚特兰大周边区域讲授Microsoft Stack和Node.js网页开发。Jeff具有Microsoft MVP和Pluralsight author认证,经常在用户组、一些聚会和会议上发表演讲。他曾就职于多家不同规模的公司,任开发人员达25年以上,职位从开发人员到首席软件架构师。
Jeremy Miller 是德克萨斯州奥斯丁市的一位开发人员和软件架构师,也是多个OSS工具的作者。他的个人博客是jeremydmiller.com。
David Pine 是位于威斯康星州的Centare公司的一位技术布道师,也是一名Microsoft MVP。David喜欢在技术社区分享知识,并在一些区域性会议、用户组和技术会议上做演讲。David热衷于通过写作来分享自己的想法,并积极维护着个人博客。
Mark Rendle 是一位具有近30年行业经验的软件开发人员。他是一名自由顾问、培训师和开发人员,定期在世界各地的.NET Core、构建现代应用和服务相关的会议上演讲。可在Twitter上关注Mark。
Spencer Schneidenbach 是一位居住在密苏里州圣路易斯市的软件架构师、API/集成专家,也是一名Microsoft MVP。Spencer具有个人博客。