为什么选择ASP.NET Core
什么是.NET
有一次小飞去面试,面试官上来就问了一个宏观的问题:“你觉得什么是.NET”?小飞的脑子嗡嗡的,支吾了半天,才吐了一些碎片化的词语:“跨平台、开源、微软…”
虽然作为一个.NET人,但是小飞更喜欢编码细节,对理论这一类不是很感兴趣,比如.NET历史枷锁、什么是.NET等。一个源于技术更新发展太快,另外一个原因是小飞觉得技术以实用为主,聊这些虚头巴脑的理论没有什么用。
考官点评了:“你对.NET缺乏基本的了解,作为.NET技术的运用者,对问题缺少刨根问底的思考,我们要招聘的是面向未来,有系统性思维的人。”
面试让小飞很受挫,于是他去找小黑,一个.NET方面的老司机。
“小黑,你在.NET这方面比较资深,到底什么是.NET呢?”
小黑知道小飞比较好学:“小飞,你先不用难过,这次面试反过来也是对自己知识的查缺补漏。”小黑一边安慰,一边回答道:“你可以这么思考,假如你是微软的产品经理,你会如何规划.NET呢?”
小飞摇摇头:“我只是一个菜鸟,初出江湖,哪里有这个高度。”
小黑道:“嗯,没关系,就是一个思考角度罢了。你可以这么思考,微软就像一个主厨,做了一桌满汉全席,上面有八大菜系:有网页,移动,桌面,微服务,游戏,机器学习,云原生,物联网。”

“微软不但提供桌子这个平台,而且上面的每道菜系怎么做,用什么材料做,如何打样都提供了周到的说明。更贴心的是,微软对开源社区说:我的满汉全席大家随便吃,随便拿,不要钱,因为我采用的是最宽松的MIT协议。”

小飞:“我知道以前很多人对微软帝国有很多偏见,都说微软不开源。”
小黑:“这次微软是真的放下架子,彻底拥抱开源了。”
小飞对大厨的比喻很深刻,不禁念叨:“.NET、满汉全席,八大菜系,各具特色,不要钱。”
小黑看到小飞碎碎念,就帮他做了一个概括:“是的,.NET是一个可构建各种应用(八大菜系)的跨平台的开源的开发平台。”
小黑继续展开解释道:“构建各种应用,说明.NET具有多面手的能力,好比班上的三好生,虽然在某个科目上无法做到最优秀,但是每一门功课几乎都没有短板。也就是说学好了.NET一种技术平台就可以应对各种商业场景的开发,这对中小团队是非常友好的。”

小飞不解的问:“为什么说对小团队非常友好?”
小黑:“你想,如果你用Java做Web开发,后续做桌面开发怎么办?Java在桌面端开发是没有优势的,如果你用Dart开发移动端,后续想做物联网开发怎么办?这对中小企业是很不友好的,因为他们不可能像大企业那样,为了极致的选型,可以养一批不同技术栈的人员。”
小飞琢磨了一下,好像是这么回事。
.NET发展和规划
小飞对.NET的发展不是很感兴趣,但是从事.NET技术开发又撇不开它,所以索性就去请教了前辈小黑。
小黑给了他一张版本演化图:

“你看到什么规律了没?”
小黑认真的回复到:“从以下.NET Core发展历史,我们可以看到它的发展的进度非常快,微软会每隔一年发布一个版本,有时候还不止一个,注意看,版本号为奇数的是普通版本,版本号为偶数的为长期支持版本(LTS),我们要关注LTS版本,一般长期支持时间为三年,所以我们选型版本的时候尽量以LTS版本为准”。
“原来如此,还是有一点讲究在里面啊。”
在小飞感叹的时候,小黑继续叨叨:“在未来.NET只有一个平台,就是现在.NET Core演化过去的.NET,而不会有.NET Framework的版本,.NET Core会在.NET 5.0这个版本上对新旧版本进行统一,所以未来从.NET 5.0到7.0都会叫.NET而不是叫.NET Core,而且统一名称后,微软会定义在每年的11月份进行新版本发布。”
“不知道你留意没有,这里为什么没有4.0的版本?”小黑故意停顿了一下。
“是啊,我刚才没有注意看,确实版本号有断档。”小飞挠了挠头。
“原因是当前.NET Framework为4.8版本,所以二者如果要融合的话,就不能起一个版本冲突的4.X的名字。”
“明白,非常感谢!”,小飞对.NET的历史和未来有了更加深刻的理解。
ASP.NET Core的特点
聊了.NET的前世今生,小飞若有所获,但是对ASP.NET这个家伙,有点迷惑,到底什么是ASP.NET呢?
小飞故意查了一下ASP的全称,ASP(Activity Server Page活动服务器网页),回想之前看到的ML.NET和Azure.NET,小飞若有所思:ASP.NET应该就是用来开发Web应用的子框架了。
就在小飞得意之时,小黑突然微弱地问了一句:“你知道ASP.NET和ASP.NET Core有什么区别吗?”
“卡壳中……”
小黑像个布道师一样继续说道:“别看他们二者很像,其实骨子里是两套完全不同的设计框架。除了性能提高之外,关键是新架构采用了组件化的设计理念。”
“组件化是个好东西,而且也听得多了,但是这里的组件化具体是什么意思,为什么要组件化呢?”小飞发现自己对ASP.NET Core的认知还很肤浅,小黑的话给了他很多触发,也产生了更多的疑问。
小黑解释道:“组件化借鉴的是乐高思想,它的核心是复用。比如,我们可以用有限的乐高组件拼装出各种栩栩如生的玩具。同样,我们可以复用ASP.NET的组件,比如依赖注入、配置框架、选项框架、日志框架、HTTP中间件等,像流水线一样拼装出各种我们想要的Web应用,这里有个高大上的名称叫控制反转,扯得有点远,我们后面再聊。”

“嗯,你的比喻非常形象,乐高确实有很强的复用性。而且,我看每个小孩几乎都会玩,而且可以无限扩展。”
“是的,组件化还有易扩展的特点,不知道你发现了没有,小孩玩乐高是越玩越得心应手,一旦你对ASP.NET的各个组件熟悉之后,我相信你也可以快速生产各种应用了。”
小飞在心中默默的念叨:ASP.NET Core、乐高、易复用、易扩展。
小黑又进一步问道:“好的框架,除了以上,还应该具备哪些特点吗?”
小飞脑子又嗡嗡起来:“这可是架构师要考虑的,我无论如何也想不出来啊。我只知道以前很多人选择Java都说因为Java跨平台。现在很多钟情Go,因为容器化、易部署。”
“对了,你说出了两个很重要的关键词,跨平台、易部署,这个.NET也考虑到了。”
小黑很兴奋,声音有点大。
“虽然微软的开源来得有点晚,很多人对他的过往独裁有成见,但这次开源确实也是很给力,C#也已经摆脱Windows系统的限制,不但支持Mac OS和Linux,而且对容器化(Docker),微服务、容器编排(Kubernetes)等技术的支持非常友好,这很好地顺应了云原生的未来趋势。”
很多新概念在小飞的脑袋开始延伸开来……
“为什么微服务和容器化关系这么密切,我经常听别人把这两者放在一起?”
小黑:“你可以这么思考,一旦服务的数量扩大为成百上千后会怎么样?”
小飞:“这么多的服务,部署和运维会让人抓狂吧?”
小黑:“对的,易部署和易运维也是ASP.NET Core的重要特点。”
一个新框架的诞生想不到背后有这么多的设计理念,小飞继续在心中念叨一遍:ASP.NET Core、乐高、易复用、易扩展、跨平台、易部署、易运维。
“小飞,别忘了,新架构如果性能不够优异,其他的指标再好也没人用的。”
“是哦,我经常听老的.NET程序员聊过旧版ASP.NET首次加载很慢,不知道这次全新改版性能怎样?”
“微软在设计早期就将性能列为其重要的目标之一,根据性能测试网站Tech Empower的最新数据(Round18 2019-07-09),ASP.NET Core在云服务器规格下(Azure D3v2 instances)的Plaintext响应测试可达215 941次/秒,JSON序列化响应测试可达52 623次/秒,表现非常亮眼。”
小飞对测试数据没有什么感觉,但是感觉好像很快的样子,小飞在脑子里对这些特点画了一幅脑图:

“小飞,你这幅脑图应该再加一个圈,里面填上…的省略号,他可不仅仅只有这些能力,很多内容我也没用过呢。”
“还能有什么能力,我感觉上面这些已经很高大上了啊?”
“我把其他的能力也列在下面,你可以看看。”

编后语:
本人的.NET Core入门和实战系列课程持续更新中,感谢您的捧场。
为什么选择ASP.NET Core的更多相关文章
- ASP.NET Core介绍
认识ASP.NET Core ASP.NET Core是一个跨平台,高性能,开源的框架,用于构建现代,基于云的网络应用程序,使用ASP.NET Core可以实现: 开发web应用,服务,IoT应用和移 ...
- 欢迎阅读daxnet的新博客:一个基于Microsoft Azure、ASP.NET Core和Docker的博客系统
2008年11月,我在博客园开通了个人帐号,并在博客园发表了自己的第一篇博客.当然,我写博客也不是从2008年才开始的,在更早时候,也在CSDN和系统分析员协会(之后名为"希赛网" ...
- Windows下构建ASP.NET Core+Code First+Docker
背景介绍 本文将会示范如何在Windows系统下基于ASP.NET Core构建跨平台服务,并通过Docker容器运行发布. 首先说一下为什么选择这一套组合: 我本人和我们Code4Thought团队 ...
- 一个基于Microsoft Azure、ASP.NET Core和Docker的博客系统
2008年11月,我在博客园开通了个人帐号,并在博客园发表了自己的第一篇博客.当然,我写博客也不是从2008年才开始的,在更早时候,也在CSDN和系统分析员协会(之后名为“希赛网”)个人空间发布过一些 ...
- 基于Microsoft Azure、ASP.NET Core和Docker的博客系统
欢迎阅读daxnet的新博客:一个基于Microsoft Azure.ASP.NET Core和Docker的博客系统 2008年11月,我在博客园开通了个人帐号,并在博客园发表了自己的第一篇博客 ...
- ASP.NET Core 实战:使用 NLog 将日志信息记录到 MongoDB
一.前言 在项目开发中,日志系统是系统的一个重要组成模块,通过在程序中记录运行日志.错误日志,可以让我们对于系统的运行情况做到很好的掌控.同时,收集日志不仅仅可以用于诊断排查错误,由于日志同样也是大量 ...
- ASP.NET Core使用Jaeger实现分布式追踪
前言 最近我们公司的部分.NET Core的项目接入了Jaeger,也算是稍微完善了一下.NET团队的技术栈. 至于为什么选择Jaeger而不是Skywalking,这个问题我只能回答,大佬们说了算. ...
- Asp.Net Core Web Api图片上传(一)集成MongoDB存储实例教程
Asp.Net Core Web Api图片上传及MongoDB存储实例教程(一) 图片或者文件上传相信大家在开发中应该都会用到吧,有的时候还要对图片生成缩略图.那么如何在Asp.Net Core W ...
- WebAPI调用笔记 ASP.NET CORE 学习之自定义异常处理 MySQL数据库查询优化建议 .NET操作XML文件之泛型集合的序列化与反序列化 Asp.Net Core 轻松学-多线程之Task快速上手 Asp.Net Core 轻松学-多线程之Task(补充)
WebAPI调用笔记 前言 即时通信项目中初次调用OA接口遇到了一些问题,因为本人从业后几乎一直做CS端项目,一个简单的WebAPI调用居然浪费了不少时间,特此记录. 接口描述 首先说明一下,基于 ...
随机推荐
- Day003 位运算
位运算 & 按位与,全1才为1,否则为0 | 按位或,全0才为0,否则为1 ^ 按位异或,相同则为0,不通则为1 ~按位取反 <<左移,相当于*2 >>右移,相当于/2 ...
- VS2010编写32位和64位dll环境配置,以及判断dll是多少位
前言 最近在编写dll注入程序的时候,因为想注入到系统进程,结果发现总是注入失败.自闭了好长一会发现我忘记了我的系统是64位的,系统进程也是64位的,而我编写的待注入的DLL是32位了,所以才导致失败 ...
- CSS中margin负值巧布局
margin负值实现细边框 我们先准备五个div盒子,并设置好浮动和2px的实线黑色边框,看看效果 中间的边框线挨在了一起致使边框变粗成了4px,这时使用margin负值就可以解决这个问题 <s ...
- 手写Promise中then方法返回的结果或者规律
1. Promise中then()方法返回来的结果或者规律 我们知道 promise 的 then 方法返回来的结果值[result]是由: 它指定的回调函数的结果决定的 2.比如说下面这一段代码 l ...
- gdb 调试,当发现程序退出,需要定位程序退出位置时。
在进入gdb后设置,执行下面语句 handle SIGSEGV nopass handle SIGSEGV nostop 执行程序,触发问题,gdb侧执行c 故障出现时,执行bt,显示堆栈调用.
- Canal和Otter讨论二(原理与实践)
上次留下的问题 问题一: 跨公网部署Otter 参考架构图 解析 a. 数据涉及网络传输,S/E/T/L几个阶段会分散在2个或者更多Node节点上,多个Node之间通过zookeeper进行协同工 ...
- MySQL 查询操作
目录 基本语法 查询常量 查看表达式 查询函数 查询指定字段 查询所有列 列别名 表别名 条件查询 条件查询运算符 逻辑查询运算符 排序与分页 排序查询(order by) 排序方式 limit 分组 ...
- mysql简单教程-(转自wid)
21分钟 MySQL 入门教程 目录 一.MySQL的相关概念介绍 二.Windows下MySQL的配置 配置步骤 MySQL服务的启动.停止与卸载 三.MySQL脚本的基本组成 四.MySQL中的数 ...
- 国外DIY网站
https://site.douban.com/109950/widget/notes/250072/note/248811721/
- Canvas跟随鼠标炫彩小球
跟随鼠标炫彩小球 canvas没有让我失望,真的很有意思 实现效果 超级炫酷 实现原理 创建小球 给小球添加随机颜色,随机半径 鼠标移动通过实例化,新增小球 通过调用给原型新增的方法,来实现小球的动画 ...