.Net Core应用框架Util介绍(一)

 距离上次发文,已经过去了三年半,这几年技术更新节奏异常迅猛,.Net进入了跨平台时代,前端也被革命性的颠覆。

回顾

  2015年,正当我还沉迷于JQuery + EasyUi的封装时,突然意识到技术已经过时。

  JQuery在面对更加复杂的UI需求时显得力不从心,EasyUi虽然组件比较完善,但界面风格老旧,响应速度慢,且是收费商业产品,在一个商业产品上投入精力封装并不划算,所以我果断弃坑了。

  然后开始封装JQuery + Bootstrap,在一个SPA(单页应用)项目里暴露出很多问题,让我认识到JQuery不适合做SPA,我开始寻找新的方案。

  AngularJs(ng 1.x)是谷歌出品的JS框架,几本书下肚以后,我开始琢磨着如何把AngularJs操作封装起来,为了封装成链式调用,甚至改了它的源码以支持服务定位器模式。

  正当我准备封装基于AngularJs的UI组件时,发现它也过时了。由于UI封装工作量巨大,而前端环境异常混乱,不再敢轻举妄动,直到前端三大框架浮出水面。

  2016年,.Net Core兴起,为了方便学习交流,Alexinea(刘怡)发起了.Net Core学习小组,Kiler(谢炀)、Lemon(刘浩杨)和我做为第一批成员加入了小组。

  微软当时尚未提供.Net Core中文文档,为了方便国内.Net Core的学习和推广,.Net Core学习小组组织了一批.Net爱好者进行翻译,直到官方提供了中文文档为止。

  2017年,.Net Core学习小组决定发布开源项目以推动.Net Core的发展,.Net Core学习小组也正式改名为.NET Core Community(.Net Core中国社区),简称NCC。

  最初加入的项目有Lemon的AOP框架AspectCore,Savorboard(杨晓东)的分布式事务解决方案CAP框架,以及我的应用框架Util。随后一些优秀的开源项目加入了NCC,包括爬虫解决方案DotnetSpider,分布式微服务框架Surging等。

Util产生的背景

  我长期混迹于小型软件公司,小公司资源有限,人少事多,水平也参差不齐,如何降低团队的学习成本,如何提高项目的开发进度,如何降低Bug率,是我的主要关注点。

  Util应用框架是我在多年的项目实战中积累起来以解决上述问题的利器,实践证明,它在多个小型团队和多个中小项目上起到关键作用,甚至包括一些濒临流产的项目。

中小项目的瓶颈在哪

  对于中小项目,简单CRUD(增删改查)占据大量篇幅,核心模块包含复杂业务逻辑,报表包含复杂查询,另外还需要权限控制、流程控制等,不管模块再多,大体不出这个范围。  

  前端UI体验变得越来越重要,工作量也越来越大。一个简单CRUD,服务端API开发半小时,UI可能需要折腾一天。

如何打破瓶颈

  如果能够迅速拿下CRUD,并且能有效减轻前端开发任务,那么就能将更多精力投入核心业务,从而提高项目交付能力。

  对于服务端CRUD,通过封装基类再配合代码生成就能很好解决,如何提升前端开发效率?

正确认识"前后分离"

  一些人鼓吹“前后分离“原则,前端界面交给专业的前端人员,后端人员只负责提供API就好了,这似乎是提升前端开发效率的灵丹妙药。

  问题在于小公司资金预算有限,而专业前端人员薪资要求很高,以低价招聘的前端人员,往往只会HTML + CSS,JS耍得并不溜,最后还得服务端程序员上场。

  另一方面,前端还有前台和后台之分,前台是面向终端用户的网站,比如门户网站,商城一类,前台偏重展示,规律性不强,后台是面向用户或管理员的表单系统,偏重功能,规律性比较强。大多公司的前端人员主要开发前台网站,而管理后台还是服务端程序员开发,前端人员顶多帮助界面布局,功能还是后端人员完成。

  "前后分离"不一定是人员的分离,也不能降低工作量,主要是指前后端依赖关系的分离,如果前端技术或后端技术可随意替换,而不是绑定在一起,就认为分离成功,这提升了项目的可维护性。

Js框架的选择

  为了降低前端开发难度,选择一个好的Js框架显得特别重要。

  对于一个复杂界面操作,JQuery同样可以完成任务,但与现代主流的Js框架相比,JQuery操作Dom的方式更加复杂,效率低下,且难以维护。

  现代前端三大Js框架是Angular(ng 2+),Vue和React。通过学习,发现Angular更符合我对开发效率的追求。

  要提升开发效率,最关键的特性就是代码提示。不相信??请在记事本上用C#写几句试试。

  Angular是谷歌开发的Js框架,默认采用Typescript(Ts)语言开发,Typescript语言是微软开发的强类型脚本语句,它是Js的超集,在VS或VSCode上具有代码提示。

  你可能会说,Js不也有代码提示?这完全不一样,Ts具有强类型的代码提示,你只能看见对象上明确定义的成员,提供了非常精确的提示,而Js的代码提示滚动条好几米长,和当前对象无关的信息也显示出来,这严重降低了代码提示的作用。

  除了代码提示,Ts还填平了Js固有的一些设计缺陷。

  很多开发人员不选择Angular的原因是需要多学一门脚本语言,认为成本高,这其实是一种误解。

  Ts在语法上有点像Js + C# + Java的混合体,对于C#或Java程序员,上手成本非常低,开发起来让你爽不停。

  作为微软系.Net程序员的我们更应该大力支持。

声明式编程

  现在我们在开发服务端和前端脚本时都有了代码提示,工作效率得到提升,还能更进一步吗?

  现代流行的前端框架都有组件或指令的概念,用来支持声明式编程,它通过扩展Html自定义标签或自定义属性的方式来调用Js

  这种方式将Js隐藏在内部,将Js转化成了Html,形成更好的封装性。毫无疑问,使用Html编写的页面,比使用Js具有更强的表现力。

  如果文本框需要非空验证,只需要在标签上加个属性,就像下面这样,你并不需要调用任何Js就完成了验证工作,这相当酷。 

1
<input required=”true”>

   不过我发现很多团队并不使用声明式编程方式,更愿意使用Js,原因在于Html是弱类型标签,自定义属性并没有代码提示,这确实是个大问题。

TagHelper - 编写Html的救命稻草

  我在2012年学习Dwz这个前端框架时,接触到声明式编程的概念,也被Html无提示的问题所困扰,后面发现Asp.Net提供的HtmlHelper能够封装Html,提供强类型的代码提示,这正是我需要的特性。

  2015年用HtmlHelper封装了EasyUi,虽然只完成了一些基础工作,但使用过的人都认为它大量提升了开发效率,它现在甚至仍然是一些公司的主打技术。

  HtmlHelper也有缺陷,它看上去是C#代码,而不是标签,比如HtmlHelper封装的文本框长成这样。

640?wx_fmt=png

  如果需要前端同学来帮助你调整界面,这就不太友好了。

  另外HtmlHelper与Html混在一起也让代码看上去不直观。

  微软发现了这个问题,在Asp.Net Core推出了TagHelper,TagHelper与HtmlHelper类似,也是用来封装Html的强类型工具,不过它用起来是个标签,如果你不注意,根本看不出这是Html,还是TagHelper,这对前后端人员配合完成Html页面具有重大意义。

  现在TagHelper封装的文本框长成这样了。 

640?wx_fmt=png

 

TagHelper与Angular结合的艰难之路

  使用Angular或Vue框架,你通常不会从0开始工作,寻找现成的UI组件库是更明智的选择,比如Angular可以选择Angular Material或Ng-Zorro。

  这些库都提供了大量组件和属性,如果直接使用Html编写,没有代码提示,你必须随时打开官网,四处翻上翻下以寻找你需要的属性,哪怕你曾经用过它,如果你记得不是十分精确,从官网复制粘贴会时刻伴随着你。

  现在好了,你知道TagHelper是救命稻草,可能已经迫不急待想要动手封装了,不就是把Html拼接出来输出到页面,这能有多难?别急,小伙子,将Angular组件封装成TagHelper可不是你想的这么简单。

  如果你关注过Asp.Net Core Angular这个模板项目,你会发现这个模板使用的依然是Html,而不是TagHelper,这是为什么?自家这么好的技术,你都不推广一下?

  我凭借之前封装HtmlHelper所积累下来的经验,将Asp.Net Core 2.0 Angular这个模板项目改造成支持TagHelper,这是使用Angular提供的JIT编译特性做到的。JIT就是即时编译,会在运行时动态获取Html页面并编译成内部Js,我在Github上也发现国外有些人在使用这种方式,不过都处于Demo级别。

  我用TagHelper封装了Angular Material组件库,并将它应用在项目上。

  很快爆发了严重的性能问题,这时候项目上的页面也才上百个。

  从启动到看见登录页面,需要半分钟,F5刷新还需要这么久,这个速度是无法接受的。

  我观察到系统在启动时会请求所有页面,原来我虽然使用了Angular模块,但没有使用延迟加载,主模块直接引用了子模块,导致在启动时加载全部页面。

  使用延迟加载缓解了这个问题,启动能在三秒左右完成,进入子模块也需要几秒,虽然能勉强使用,但性能和AOT编译相去甚远。

  AOT编译是Angular提供的预编译,能在发布阶段把Html文件直接编译成Js,这样在运行时就不再访问Html页面,对性能具有极大的提升。

  使用了TagHelper以后,并没有Html文件,AOT编译无法访问服务端Url,所以没办法使用。

  鱼和熊掌都想兼得,如果能够得到TagHelper的编译时检查和代码提示功能,又能得到AOT编译的运行时性能,这该多好啊。

  我当时寄希望于Asp.Net Core团队,希望他们能提供一点支持,在Github提了Issue之后,Asp.Net Core团队表示TagHelper与Angular这种Js框架水火不容,机制上的问题。我后面仔细想想,确实如此,TagHelper主要为服务端MVC提供支持,而使用了Angular这样的Js框架后,路由都走客户端,通过AOT编译后,服务端除了提供WEB API,真没它啥事。

  由于TagHelper提高了我团队的开发效率,延迟加载能让这个机制勉强使用,我也就坚持了下来。直到有一天灵机一动,用TagHelper生成出Html文件不就好了吗,和玄冰同学折腾了一天,终于解决了这个问题。现在,TagHelper充当了代码生成器的角色,服务端MVC相关的特性被全部抛弃。

小结

  前面介绍了Util的一些背景和动机,同时也解释了为何我花大把时间在UI封装的原因。

  未完待续,下一篇介绍Util包含的主要功能,以及让你把TagHelper + Angular Material封装的Demo运行起来。

  Util应用框架的下载地址为:https://github.com/dotnetcore/Util

  写文需要动力,请大家多多支持,点下推荐,Github点下星星。

  Util应用框架交流一群: 24791014

原文链接:https://www.cnblogs.com/xiadao521/p/Util-Introduction-1.html

.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

640?wx_fmt=jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/320075.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

牛客网 【每日一题】5月26日题目精讲 [JSOI2007]建筑抢修

链接&#xff1a; 文章目录题目描述题意&#xff1a;题解&#xff1a;题目描述 小刚在玩JSOI提供的一个称之为“建筑抢修”的电脑游戏&#xff1a;经过了一场激烈的战斗&#xff0c;T部落消灭了所有z部落的入侵者。但是T部落的基地里已经有N个建筑设施受到了严重的损伤&#xf…

【二分】数列分段(ybtoj 二分-1-1)

数列分段 ybtoj 二分-1-1 题目大意 给出一个序列A&#xff0c;让你把它分成m段&#xff0c;使每段和最大值最小 输入样例 5 3 4 2 4 5 1输出样例 6数据范围 1⩽M⩽N⩽1051\leqslant M\leqslant N\leqslant 10^51⩽M⩽N⩽105 sum{Ai}⩽109sum\begin{Bmatrix}A_i\end{Bmatr…

CF878E-Numbers on the blackboard【并查集,贪心】

正题 题目链接:https://www.luogu.com.cn/problem/CF878E 题目大意 nnn个数字&#xff0c;每次可以把两个相邻的数字x,yx,yx,y变为x2yx2yx2y。 mmm次询问一个区间合成一个数字后最大是多少。 解题思路 答案可以把每个数字变成xicix_i^{c_i}xici​​&#xff0c;其中ci≤ci−1…

2021-03-24

非空G个数G的大小n的奇偶性答案>4\\D3\奇数D3至少一个大小>2\D3均为1偶数D-12大小均>2\D2至少一个大小>2奇数D2一个大小1&#xff0c;一个大小>1偶数D-12均为1奇数D-12均为1偶数

牛客网【每日一题】5月27日题目精讲 货币系统

链接&#xff1a; 文章目录题目描述题解&#xff1a;代码&#xff1a;题目描述 在网友的国度中共有n种不同面额的货币&#xff0c;第i种货币的面额为a[i]&#xff0c;你可以假设每一种货币都有无穷多张。为了方便&#xff0c;我们把货币种数为n、面额数组为a[1…n]的货币系统记…

使用.NET Core+Docker 开发微服务

.NET Core发布很久了,因为近几年主要使用java&#xff0c;所以还没使用过.NET Core&#xff0c;今天正好有一个c#写的demo&#xff0c;需要做成服务&#xff0c;不想再转成java来实现&#xff0c;考虑使用.NET CORE来尝下鲜&#xff0c;目标是开发一个微服务&#xff0c;然后部…

【二分】防具布置/秦腾与教学评估(ybtoj 二分-1-2/jzoj 1253/luogu 4403)

正题 ybtoj 二分-1-2 jzoj 1253 luogu 4403 题目大意 给出n组数&#xff1a;si,ei,dis_i,e_i,d_isi​,ei​,di​ 对于每组数据&#xff0c;表示在sis_isi​加1&#xff0c;然后每隔did_idi​就加1&#xff0c;当位置大于eie_iei​时结束 题目保证数字是奇数的位置最多只有1个…

[XSY] 智慧树(线性同余方程组,线段树/树状数组)

智慧树 解决此题有两个要点&#xff1a; 如何判断一个线性同余方程组有没有解如何统计合法子序列数目 先看第2点&#xff1a; 若一个序列是合法的&#xff0c;则这个序列的所有子序列都是合法的 考虑对∀1≤i≤n\forall 1\leq i\leq n∀1≤i≤n&#xff0c;求出以iii为左端点…

P2272-[ZJOI2007]最大半连通子图【tarjan,缩点】

正题 题目链接:https://www.luogu.com.cn/problem/P2272 题目大意 半连通图定义为任意两个点(u,v)(u,v)(u,v)满足uuu可以到vvv或vvv可以到uuu的有向图。 现在给出一张图&#xff0c;求最大半连通子图与其数量。 解题思路 显然一个强连通一定是一个半连通&#xff0c;所以我…

牛客网 【每日一题】5月28日题目精讲 Protecting the Flowers

链接&#xff1a; 文章目录题目描述题意&#xff1a;题解&#xff1a;代码&#xff1a;时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 32768K&#xff0c;其他语言65536K 64bit IO Format: %lld题目描述 Farmer John went to cut some wood and…

【二分】最大均值(ybtoj 二分-1-3)

最大均值 ybtoj 二分-1-3 题目大意 给出一个序列&#xff0c;让你求一个长度不小于m的子序列&#xff0c;使其平均值最大 输入样例 10 6 6 4 2 10 3 8 5 9 4 1输出样例 6500数据范围 1⩽L⩽N⩽1051\leqslant L \leqslant N \leqslant 10^51⩽L⩽N⩽105 Ai⩽2000A_i\leqs…

Steeltoe之Config客户端篇

Steeltoe是一款开源项目&#xff0c;其目标是选取源自Netflix及其它公司的工具&#xff0c;使它们能够运用于.NET社区。它不仅可以在.NET Core上&#xff0c;也可以在.NET Framework 4.X以上使用。此外&#xff0c;大多数的组件能够同时运行在本地机器及Cloud Foundry(一个领先…

[XSY] 绿色(圆方树、树形DP、树上差分)

绿色 题意简述 题解 首先&#xff0c;每次修改完点权后&#xff0c;重新考虑一遍所有路径显然是不现实的&#xff0c;所以我们考虑求出经过每个点的两端同色的简单路径数&#xff0c;这样权值和容易统计和修改。 接下来分析仙人掌上的简单路径性质。一条简单路径上的边&…

P4309-[TJOI2013]最长上升子序列【Splay】

正题 题目链接:https://www.luogu.com.cn/problem/P4309 题目大意 nnn次&#xff0c;第iii次在第xix_ixi​个数字后面插入iii然后询问最长上升子序列长度。 解题思路 因为是插入所以考虑用SplaySplaySplay维护&#xff0c;因为从小到大插入&#xff0c;其实每次就是找一个在x…

牛客网 【每日一题】5月29日 管道取珠

链接&#xff1a; 文章目录题目描述题意&#xff1a;题解&#xff1a;代码&#xff1a;时间限制&#xff1a;C/C 2秒&#xff0c;其他语言4秒 空间限制&#xff1a;C/C 524288K&#xff0c;其他语言1048576K 64bit IO Format: %lld题目描述 管道取珠是小X很喜欢的一款游戏。在本…

【dfs】拔河比赛(ybtoj dfs-1-1)

拔河比赛 ybtoj dfs-1-1 题目大意 给你n个数&#xff0c;让你分成两堆&#xff0c;使其数量相差不大于1&#xff0c;问数值相差最小是多少 输入样例 1 3 55 50 100输出样例 5数据范围 1⩽T⩽501\leqslant T \leqslant 501⩽T⩽50 2⩽N⩽202\leqslant N\leqslant 202⩽N⩽…

半天搭建你的Jenkins持续集成与自动化部署系统

前言相信每一位程序员都经历过深夜加班上线的痛苦&#xff01;而作为一个加班上线如家常便饭的码农&#xff0c;更是深感其痛。由于我们所做的系统业务复杂&#xff0c;系统庞大&#xff0c;设计到多个系统之间的合作&#xff0c;而核心系统更是采用分布式系统架构&#xff0c;…

牛客网 【每日一题】6月10日 失衡天平

链接&#xff1a; 文章目录题目描述题解&#xff1a;代码&#xff1a;时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO Format: %lld题目描述 终于Alice走出了大魔王的陷阱&#xff0c;可是现在傻傻…

P3345-[ZJOI2015]幻想乡战略游戏【点分树,RMQ】

正题 题目链接:https://www.luogu.com.cn/problem/P3345 题目大意 nnn个点的一棵树&#xff0c;每次修改一个点的点权后询问一个xxx最小化∑y1ndis(x,y)∗dy\sum_{y1}^ndis(x,y)*d_yy1∑n​dis(x,y)∗dy​ 解题思路 先是构建一个点分树&#xff0c;然后考虑如何计算答案。 我…

[XSY]Illyasviel的图游戏(博弈论)

Illyasviel的图游戏 除了1号点和n号点每个点度数小于等于2&#xff0c;因此1 到 n 的所有简单路径互不相交。 在结束游戏前的最后一步一定是剩下一条 1 到 n 的路径&#xff0c;并且路径上的权值全都是1。 游戏总步数确定&#xff0c;如果剩下的最后一条路径确定了&#xff…