ABP会臃肿吗?

有了ABP,还要学其他的框架?

  我有时候在想在JAVA领域,Spring基本一统天下,新手也好,高手也罢都在学习、研究和项目实战。也就是说其实对与应用开发,Spring已经是绕不开的框架,不管是单体还是微服务都可以轻松胜任,学了Spring在JAVA开发层面,其实你可以完全不需要去学习其他的任何知识点,也能参加工作(当然不包括数据库和前端,我这里指的是JAVA语言本身)。

  那么在.NET有没有类似Spring的框架,让.NET学员学完之后也可以胜任任何.NET工作,甚至能胜任架构师的角色,我觉得对于开源的ABP vNext来说,是完全可以做到的。因为它足够简单,上手非常容易,只要入门之后持续一段时间,我们就可以不断地在实战中逐步深入,重要的是开源的信息量足够一个架构师去模仿和学习,不管内部的模块化设计理念,还是模块化安装和删除的方式,都是一个理念活生生的落地代码,看得见摸得着,甚至我有时候觉得,只要学好ABP其他的框架可学可不学,不学是因为其他的框架从综合素质来说,目前还没有看到一个框架在应用层面可以和ABP媲美(.NET领域),没有夸张地说没有之一。学是因为不管是任何开源的框架都可以被ABP吸收并蓄,只要我们自己懂得ABP的框架规则,我们的集成是分分钟的事情。  

  所以,我的结论是,如果你们公司的业务是垂直产品的,可以用ABP没问题,因为它可以从模块到单体到微服务兼容,到微服务做到快速而高效的演化;如果你们公司的业务是项目型的交付,也可以重复利用ABP的模块化来降低开发的成本;如果你们公司是外包型的项目,面对交付各种各样,ABP一样可以通过排列组合来快速交付成果。我这里不是故意夸大,也不是为了宣传而宣传,而是真的觉得这玩意儿真的是很方便,谁用谁知道。

ABP难吗?

  当然ABP入门容易,进阶困难,毕竟他是基础设施,里面有很深厚的技术深度,如果你只是停留在使用的角度,那么问题不大,可以很快入门,请相信我,对于有点.NET基础的人,可能一天就上手了,但是一旦遇到问题或者需要定制,那么你一定会遇到困难,这个时候你会迷失在碎片化的模块海洋,而且每个模块之间又有网状般的依赖关系,模块化是非常灵活的,一个解决方案你要分4层还是7层,甚至更多都是很有讲究的,因为你要深入理解DDD分层模型和业务需求。所以,当你需要深入学习的时候,你会觉得ABP不容易。

ABP存在的意义?

  问这个问题就好比问我们有了Java,为什么还要有Spring。ABP存在真正的意义是让开发人员早点下班,做一个幸福的程序员。不要觉得这个要求很低,这非常困难。因为项目从开发到运维没有一个环节是容易的。项目初期,我们会为了进度加班加点,虽然累但不感觉疲惫,因为项目一直在推进。项目后期,你不断修改代码也可以接受,因为都是你自己写的代码,你知道怎么修改。项目运维阶段,你离职了,新人一边修改你的代码一边摇头骂娘,项目开始慢慢变质。随着一波又一波的新人不断折腾和累积屎山,你的项目遍体鳞伤、伤痕累累确又无法推倒重来,代码开始慢慢腐朽。

  所有的这些都是因为团队缺乏规范,人员层次不齐,因为你没有一个行业最佳实践的地图。如果说ABP能帮助我们解决以上这些问题,那么它的价值自然不低。从事.NET开发人员如果您跳槽频繁的话,我相信你一定接手过很多遗留系统,很多系统从构建的第一天可能有了遗留系统的痕迹,所以如果我们要进行整体迁移,那就是一场噩梦,我干了10来年的.NET,真的还没见过成功的案例,要么团队能力不够,要么成本太高,要么风险太大……总之,一切问题都在第一天就定了基调。

  除了项目管理和软件工程方面,在技术方面我们一样可以从开源的ABP身上学到不少经典代码、架构设计、测试规范、最佳实践。我举一个简单的多租户的例子,如果你有在用多租户,你一定能对它的多租户印象深刻,因为你好像感觉不到多租户的存在,也许这就是多租户的优雅之处。至于DDD就更不用说了,你跟着它的规范走一遍,你对DDD会有更加深入的了解,原来我们以前一直在用的贫血模式开发就觉得自己懂得了DDD。

  ABP的意义真的不是三言两语能说的完的,毕竟它自己也不断与时俱进中,它本身从开源身上吸收的能量也在间接展示给我们看。我到现在都觉得自己不能精通ABP,因为它上手容易,精通真的不是那么容易,因为这意味着你曾经花费很大的时间从0到1重构了一次ABP,否则你怎么敢说自己精通ABP呢?

ABP会臃肿吗?

  我经常听到有些人会说ABP很臃肿,我不知道他是指的哪一方面,如果只是泛泛而谈,我感觉是很不专业的,甚至我可以说对方根本没有深入研究过ABP。是Dll文件过多,还是启动很慢,还是吃内存,除非你能拿出证据来。

真正的臃肿是什么?

  模块化是根据业务或者功能的一种拆分,目的是为了重用。拆分多了,你可能学习了会有点困难,因为那么多块块,如果你不够熟悉,身边没有一份说明书,你根本就无从下手。所以,那不是叫臃肿,我们有人会评价乐高很臃肿吗?相反,我们会觉得乐高很强大,很灵活,可以实现各种可能,除非你缺乏想象力,不要用自己想象力的缺乏来说乐高是臃肿的。

  管理复杂系统必然要求我们对系统进行分类拆分,否则一块大单体岂不是更加臃肿?我理解的臃肿是,代码耦合度非常高,进行二次开发很困难,剪不断理还乱。另外开发完了,要进行运维修改很困难,甚至出现改到后面,改不动只能重新推倒重来,在旧业务online情况下,新框架要重新开发,变开飞机变换引擎,中间还要做数据库迁移,对于一般的小公司只是非常危险的,严重的会直接宣告项目死刑,因为改不动了,然后新进的人员也只想贴膏药,公司必然存在离职率高的问题。所以,我的结论是代码耦合高是臃肿,二开困难是臃肿,运维低效是臃肿。当然臃肿还有很多内涵,比如编译缓慢、部署麻烦、性能低下等等。

  我像请教那些说ABP臃肿的人,你到底在说什么?模块化后,团队各自编译会缓慢吗?模块化后,模块可以单独部署也可以集成部署是臃肿吗?你使用ABP跑功能会很慢吗,所有的模块都在启动时候就预先加载到我们的内存里了,哪儿慢了?无非多耗费一点内存,多用一点空间换取的不是更快的性能是什么?

  所以,请那些说ABP臃肿的人,不要泛泛而谈,请你在臃肿前面加个定语,然后用真实的案例来和大家交流。

 结尾

   因为ABP很优秀,所以我花了很大的精力对ABP进行了深耕,不敢说精通,但是不止一次在深夜探索ABP源码,也阅读了许许多多的文档资料,ABP入门真的很容易,但是如果你一想进一步窥探它的神秘面纱,也许我的这个系列翻译应该可以帮你更快、更深入地学习它,祝你学有所得,学得快乐。

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

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

相关文章

python如何正则匹配浮点值_Python正则表达式字符串数组到浮点数组

我是python正则表达式的初学者.我达到了我所需要的,但是由于缺少经验,这真的很丑.我的目标是转换以下形式的字符串数组:notes ["10.0% higher", "5.0% lower", "Same as", "21.2% lower"]到一个float数组,这样上面的数组将…

php stripslashes 去除反斜线

stripslashes可以去除反斜线&#xff0c;准确的说是去掉一个反斜线&#xff0c;因为如果是两个反斜线的话stripslashes会把两个反斜线替换成一个&#xff1a; 引用php手册的例子&#xff1a; <?php $str "Is your name O\reilly?";// 输出: Is your name Ore…

HTML5 播放器

随着 HTML5 的普及&#xff0c;越来越多视频网站使用 <video></video> 标签播放直播、点播内容&#xff08;如下图所示&#xff09;。使用 <video> 的好处&#xff0c;主要以下两点。 可以直接在页面中播放&#xff0c;也就是所谓的“区域播放”&#xff0c;…

linux shell之控制台打印各种颜色字体和背景

1 问题 控制台打印各种颜色字体和背景 字体颜色 #30:黑 #31:红 #32:绿 #33:黄 #34:蓝色 #35:紫色 #36:深绿 #37:白色 背景颜色 #40:黑 #41:深红 #42:绿 #43:黄色 #44:蓝色 #45:紫色 #46:深绿 #47:白色 echo -e "\e[43;35m chenyu\e[0m hello word&quo…

修改GIT的user.name和user.email

为什么80%的码农都做不了架构师&#xff1f;>>> $ git config --global --replace-all user.email "输入你的邮箱" $ git config --global --replace-all user.name "输入你的用户名" ----验证是否修改成功---- $ git config --list 转载…

python包实际怎么使用_Python--模块与包

模块1、什么是模块&#xff1f;一个模块就是一个Python文件&#xff0c;文件名就是模块名字加上.py后缀。因此模块名称也必须符合变量名的命名规范。1 使用python编写的代码(.py文件)2 已被编译为共享库或DLL的C或C扩展3 包好一组模块的包4 使用C编写并链接到python解释器的内置…

php获取虚拟机ip,php如何获取用户的ip地址

直接上代码/*** 获取客户端IP地址*/function real_ip(){$ip $_SERVER[REMOTE_ADDR];if (isset($_SERVER[HTTP_X_FORWARDED_FOR]) && preg_match_all(#\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}#s,$_SERVER[HTTP_X_FORWARDED_FOR], $matches)) {foreach ($matches[0] AS $xi…

sql distinct 去重复 (mysql)

DISTINCT 去重复 &#xff08;运动扭伤腰。。。悲伤。。。 (▼ _ ▼) &#xff09; 首先&#xff0c;例如我们的表&#xff1a; 首先观察表&#xff1a; 其中第二行和第三行和第八行的name1的只是重复的&#xff0c;但第八行的age1确是12&#xff0c;与第二行和第三行不同…

如何5分钟上手使用OCR

随便打开一个Microsoft Visual Studio&#xff0c;新建一个WinForms项目&#xff0c;从下面列表中随便选择一个NET框架。net35;net40;net45;net451;net452;net46;net461;net462;net47;net471;net472;net48; netstandard2.0;netcoreapp3.1; net5.0;net6.0;创建完窗口后&#xff…

GDI与OpenGL与DirectX之间的区别

图形编程的几种技术对比&#xff1a; GDI&#xff0c;图形设备接口&#xff0c;MS开发的通用的windows系统图形编程接口&#xff0c;功能强涉及面广&#xff0c;一般的编程都用它。但是用来做多媒体开发就差强人意了 OPENGL是SGI开发的一套三维图形软件包&#xff0c;出现很早&…

HDU 5238 Calculator 线段树 中国剩余定理

题意&#xff1a; 给一个计算器&#xff0c;有一系列计算步骤&#xff0c;只有加&#xff0c;乘&#xff0c;幂三种运算。 有一种查询操作&#xff1a;查询初始值为\(x\)的时候&#xff0c;最终运算结果模\(29393\)的值。 有一种修改操作&#xff1a;可以修改第\(p\)个运算的运…

linux shell之把文本里面的;替换成\n格式输出

1 问题 一个文本里面很多中间很多&#xff1b;然后&#xff0c;现在需要把&#xff1b;替换成\n,然后换行打印出来 比如文件1.txt namechenyu;sexman;age27 我们可以用tr命题替换&#xff0c;第一个参数是需要替换的内容&#xff0c;第二个参数是将要替换的内容 2 实现 ca…

利用Excel VBA批量计算气象数据多个台站多年来春季和冬季降水量和平均气温

气象数据是地理数据的重要组成部分,存储量虽然不大,但是处理过程非常繁琐,长时序数据更不用说。本文总结了一个气象数据的基本处理方法。 如下图所示,气象数据的排列格式是区站号→年→月→降水量→平均气温,时间范围为1983~2012年,每一年都有台站数300多个,下面按区站…

VMware Workstation 12新建虚拟机

1、点击“创建新的虚拟机”2、选择“自定义”(初学选择典型也可以)&#xff0c;下一步3、默认&#xff0c;直接下一步4、通常都是先创建虚拟机&#xff0c;等虚拟机创建完成后再来安装操作系统&#xff0c;若安装过程出现什么问题方便解决&#xff0c;故选择“稍后安装操作系统…

sql count用法_SQL学习笔记3:count(*)函数

1.count(*)函数用法COUNT(*) 函数返回表中的记录数&#xff0c;具体来说&#xff0c;返回值是一个数字。语法&#xff1a;返回表中所有记录的数量&#xff1a;SELECT COUNT(*) FROM table_name返回表中满足一定条件的记录的数量&#xff1a;SELECT COUNT(*) FROM table_name WH…

sql order by,desc和limit使用(mysql)

(&#xff61;ŏ_ŏ) 首先我们来看一个表&#xff1a; 在此我们要进行排序&#xff0c;按降序排序&#xff0c;就是从大到小。然后我们只要查询前2条数据。 意思就是我们需要把这个表从大到小排序后&#xff0c;取前两条&#xff0c;那么我们就需要使用到order by 和desc …

Blazor University (13)组件 — 多线程渲染

原文链接&#xff1a;https://blazor-university.com/components/multi-threaded-rendering/多线程渲染由于 Blazor Server 应用程序中可用的线程不止一个&#xff0c;因此完全有可能不同的组件可以让不同的线程在其上执行代码。这在基于异步任务的操作中最常见。例如&#xff…

【Util】 时间天数增加,时间比较。

版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 https://blog.csdn.net/inforstack/article/details/46516623 public static void main(String[] args) {try {DateFormat formatter new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");Cale…

linux shell之$?和得到联合使用命令的结果

1 介绍 $?命令&#xff1a;可以得到上次执行命令的值&#xff0c;如果返回时0&#xff0c;说明执行成功&#xff0c;如果是其它数说明命令执行失败 联合使用命令&#xff1a;我们一般这样使用 value$(cat 1.txt | grep chenyu) echo $value 2 代码测试 #/bin/bashpwd"…

方法调用(车票练习)

第一步、创建一个类 //public class Tickete //{ //写一个Ticket类&#xff0c;有一个距离属性&#xff08;本属性只读&#xff0c;在构造方法中赋值&#xff09; //不能为负数&#xff0c;有一个价格属性&#xff0c;价格属性只读&#xff0c; //并且根据距离distance计算价格…