以Blog.Core的方式来打开Abp.vNext

(发现Abp这个logo真像佐助写轮眼)

最近自己的框架已经基本的成型了,当然还有很多质疑的地方,比如这些人是这么说的,基本都是原文:

你的教程太乱了,和框架代码都不一样(???)

文章还行,代码规范要改善(???)

为啥要分那么多层,看着不舒服(???)

给我讲讲SqlSugar的优势在哪里(???)

多库,读写分离没看出来有啥意义(???)

我也没办法,只能用问号来表示我的看法了,其实一直以来我都是希望通过文章的形式让大家如何去学习,后来虽然框架的越推越广,导致很多人都是直接通过框架来学习知识点了,所以冲突就慢慢出来了,既然本末倒置了,那索性我也倒过来,不去修改文章了,精修代码吧,因此我也打算趁着上班之余,看看传说中的最厉害,最丰富,最难懂的框架 —— Abp vNext,看看他们是如何运营的吧。

群主的安排是什么?

我的计划:很多小伙伴会说,会不会开系列教程,这个应该会有,目前我还在学习阶段,我的想法通过博客和视频的形式,来一个三步走,先了解这个框架,再使用框架搭建自己项目,最后分析下他的运行原理。

你的计划:当然这个教程肯定有范围的,初学者不建议学,建议刚入门的还是看我的教程和代码吧,然后按照这个顺序学,先掌握ASP.NET Core,然后简单了解前后端分离,再学习下DDD领域驱动设计的思想,接着简单了解下IdentityServer4的内容,至少要了解认证和授权的部分内容,我的教程目录,设计模式是辅助:

(老张的哲学,博客园系列教程)

大概就是这样,今天呢,特别简单,不会说这个框架的由来,官网地址,如何下载,如何说这个框架是多么多么厉害,大家能看到这里,证明都是知道的,今天毕竟是一个尝鲜,是先让大家初见下Abp的框架布局情况,而且是通过Blog.Core框架的形式来了解,前提是你正在使用或者研究Blog.Core。

1、两个框架的对比

既然要对比呢,我就简单的做了一个图,当然,我也不是真心的要和Abp比较,因为完全没有对比性,只是想说明一下,Abp这个框架的好处:

(Blog.Core与Abp框架对比图)


我自己简单的总结了下,Abp各个方面都很领先,是毋庸置疑的好框架,当然为了体现文章的意义,我也列举了不足之处,就是对新手的不太友好,很多初学者是看不懂的,这也就是为什么我在文章开头说的,如果想要学好Abp,可以先看看我的框架或者系列文章。

那我接下来就带着大家看看,如何通过Blog.Core来入门Abp vNext框架。

2、整体分层情况

(很巧,都是标准的十层结构)

当然,这是开玩笑的。不过总体上来看,似乎两个框架关联性并不是很大,

Blog.Core采用的是,{服务-仓储-接口}的开发模式;

Abp采用的是,{应用-领域-基础设施}的DDD开发模式;

很多人都说Blog.Core就是一个简单的三层架构,其实我当时这么写,就是为了引出后边的DDD领域驱动设计教程,不然为啥不直接叫DAL层和BLL层,还不能抬杠,抬杠我就会被问区别,我也是懒得解释

这么看其实关联性不大,但是接下来我会拆分来讲,你就会发现,其实很多都是一样的。

3、Web层对比分析

因为默认创建的Abp框架,用的是MVC Page模式(当然它封装了api,这个以后再说),所以我们简单看一下Startup.cs就行:

Blog.Core在依赖注入中,采用的是服务模块化注册,然后配置Autofac进行服务层的依赖注入自动化,然后配套进行动态代理AOP。

Abp也是采用的模块化的注册方式,当然他这个封装的更彻底,更好吧,然后他自己也将Autofac容器给封装了,反正就是全部封装了。

4、服务层设计分析

服务层,也可以叫做应用层,主要是用来向上对展示层提供服务的,向下嘛,可以是领域层或者仓储层:

在Blog.Core中,采用的是Service和IService的形式,分了两个层,分别是

.Services 和 .IServices

我们可以定义多个服务和服务接口,来实现不同业务模块的联系,然后将IService给暴漏出给展示层。

而在Abp中呢,我们的Service层变成了应用层.Application,IServices层变成了应用契约层

.Application.Contracts,契约也就是接口,主要是对展示层进行服务封装的,然后由应用层进行实现。

除了这个服务接口呢,还有一个实体映射,也就是Dto:

在Blog.Core项目中,我设计到了Web层,当然这个也是可以的:

不过Abp倒是分开了两个部分,他在Abp和应用层都有,不过基本都是在应用层来设计的:

PS:Abp分层名字写的还是挺好的,把这两个层并列在一起了,不像我的,因为名字排序的问题,距离比较远。

5、仓储层设计解析

仓储层其实属于基础设施层的一部分,基础设施层分两部分,一个是对持久化的处理,另一个就是对公共层的封装,那现在咱们先说下第一部分,持久化:

在Blog.Core中,我单独建立了两个层,仓储和仓储接口,这个和服务层与服务接口层似乎有些雷同,很多人表示不解,为啥要分开,这里不多说,详细如果你看过DDD,明白了应用层和基础设施层的设计应该就明白了。

但是在Abp框架中,有一些不太一样了,你似乎看不到他定义Repository和IRepository的相关存在,他因为用到了EFCore,所以把EFCore当成了仓储了。

其实不是的,如果你看他的源码,就可以发现,他还是有仓储的影子的,只不过是封装了:

刚刚我们在应用层中定义的服务,其实是集成了仓储接口的,只不过是基类,而且命名空间还是Domain领域层:

    public class BookAppService :CrudAppService<Book, BookDto, Guid, PagedAndSortedResultRequestDto,CreateUpdateBookDto, CreateUpdateBookDto>,IBookAppService{private readonly IRepository<Book, Guid> _repository;public BookAppService(IRepository<Book, Guid> repository): base(repository){_repository = repository;}}

从这里我们可以看出来,领域层中定义了仓储接口,然后再在.EntityFrameworkCore层中设计我们的持久化操作。

这里就引出了第一个重要知识点,领域层中到底是什么?—— 一切包含领域行为的类,都应该封装到领域层中,目前的第一个,仓储接口。那是不是还有其他的呢?

6、实体层的设计解析

实体层这个顾名思义,我们要持久化,肯定要定义实体,或者用DDD中的属于,可以叫聚合。

在Blog.Core中,我用Model层,来封装了实体层,这个是没问题的,但是有一个问题就是,这层不应该在定义ViewModels层了,这个不应该写到这里,应该写到应用契约层,毕竟我们知道契约就是为了用户的。

在Abp框架中,设计的就比较合理了,详细你也应该能看的懂,这里不多说了。

这里要重点说的就是,领域层第二块内容——实体,刚刚我们说了第一个是仓储接口,这两个其实都是拥有领域行为的类。

7、公共层设计解析

公共层其实这个最容易理解,就是平时我们整个项目中,都会遇到的以下模块,比如错误码,本地化,枚举,常量等等,这些统一定义好后,可以贯穿到我们整个项目中。

在Blog.Core中,我就直接叫做Common层了,言简意赅。

而在Abp中,他把这些数据放到了.Domain.Shared层了,从名字可以看懂,就是分享的意思,再加上Abp是一个DDD领域驱动的框架,所以就基于领域层下的分享层了。

8、其他层设计分析

至于其他层就很简单了,Abp中,剩下的就是迁移层了:

.DbMigrator其实是一个控制台层,配置好数据库连接字符串,就可以直接生成项目了。

.EntityFrameworkCore.DbMigrations是一个类库,存放我们的迁移记录。

Blog.Core中的两个:

.FrameWork是一个T4模板,生成整个框架文件;

.Tasks是一个任务调度层,目前用的是Quartz.Net;

当然,如果你还没用过Abp,这里我列举了十步走,你可以试试。

9、Abp开发十步走

其实说了这么多,已经基本的说完了,从上边的解析中,我们可以看到,如果你学会了Blog.Core,其实很好入门Abp的,至少我只看了半个小时就知道如何开发了,这里我还列举了Abp开发十步走:

好啦,说了这么多,详细你肯定已经会使用Abp了吧,至少写个增删改查是没问题的。

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

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

相关文章

算法题目中常见的几种输入小点-gets,cin,scanf,getline,sstream

cin,scanf遇到空格都会停下来。gets可读入空格 例如: 在这里由于要读入空格&#xff0c;我们用gets来读入。 const int N 8; char g[N][N];while(gets(g[0])!NULL) {gets(g[1]);}C关于getline()和getchar()的小点C stringstream输入方式下面这两段代码要注意一下: const in…

如何做好一个开源项目(一)

做好一个开源项目其实是一件比较费时费力费心的工作&#xff0c;它的最大难点除了代码维护之外&#xff0c;还包括后期的维护和持续的跟进。我曾经做过不少开源项目&#xff0c;但是坚持下来的&#xff0c;目前有信心能够持续维护的也只有Magicodes.IE。这里请允许我来一波硬广…

Abp商业版 - Identity Server模块

该模块提供了Identity Server的集成和管理功能.建立在IdentityServer4类库之上.管理系统中的客户端,身份资源和API资源(Clients, Identity resources, API resources)设置客户端(Clients)权限.轻松创建标准的身份资源(例如role, profile)创建自定义身份资源(identity resources…

洛谷 P1162 填涂颜色-dfs染色法

输入: 6 0 0 0 0 0 0 0 0 1 1 1 1 0 1 1 0 0 1 1 1 0 0 0 1 1 0 0 0 0 1 1 1 1 1 1 1输出: 0 0 0 0 0 0 0 0 1 1 1 1 0 1 1 2 2 1 1 1 2 2 2 1 1 2 2 2 2 1 1 1 1 1 1 1代码如下: #include <iostream> using namespace std; const int N 40; int mp[N][N], mps[N][N…

15个基本的C#面试问题

原文来自互联网&#xff0c;由长沙DotNET技术社区【笑语】编译。原文来自&#xff1a;https://www.toptal.com/c-sharp/top-10-mistakes-that-c-sharp-programmers-make1、给定一个int数组&#xff0c;编写方法以统计所有偶数的值。有很多方法可以做到这一点&#xff0c;但是最…

洛谷 P1122 最大子树和-求树的最大子树权值和

输入: 7 -1 -1 -1 1 1 1 0 1 4 2 5 3 6 4 7 5 7 6 7输出: 3代码如下: #include <iostream> #include <vector> using namespace std; const int N 100010; typedef long long LL; LL ans; vector<LL>t[N]; LL w[N];void dfs(int root, int fa) {for (int…

玩转控件:封装Dev的LabelControl和TextEdit

缘由俗话说的好&#xff1a;"工欲善其事必先利其器"&#xff0c;作为软件攻城狮也是同样道理&#xff0c;攻城狮开发的软件目的是简化客户的操作&#xff0c;让客户动动手指就可以完成很多事情&#xff0c;减少人力成本。这也是系统/软件存在的目的。那对于攻城狮来说…

洛谷 P1958 上学路线-dfs

输入: 5 4 3 2 2 2 3 4 2输出: 5注意点:这题目输入的时候先输入列&#xff0c;再输入行&#xff0c;这点要注意&#xff0c;然后这个图跟我们二维数组是反过来的&#xff0c;所以题目说得向北走要变成向南走&#xff0c;注意一下细节就好了。 代码如下: #include <io…

.NET Core开发实战(第33课:集成事件:使用RabbitMQ来实现EventBus)--学习笔记(下)...

33 | 集成事件&#xff1a;使用RabbitMQ来实现EventBus为了演示我们的发布和订阅的话&#xff0c;我们在这里的代码做一些稍微的调整namespace GeekTime.API.Application.DomainEventHandlers {public class OrderCreatedDomainEventHandler : IDomainEventHandler<OrderCre…

文本框赋值guide matlab,科学网-Matlab: 学习GUI (使用GUIDE时需注意的几个问题)-刘磊的博文...

在博文《Matlab&#xff1a;学习GUI(一个简单的例子)》(介绍的方法是完全用代码来建立一个GUI&#xff0c;实际上Matlab本身有一个设计GUI的交互系统——GUIDE&#xff0c;用户可以使用该系统更方便的建立自己的GUI.本文将介绍使用GUIDE时常常遇到的几个问题。本文将通过一个简…

洛谷 P1294 高手去散步-邻接矩阵+dfs-求无向图的一条最长路径

输入: 4 6 1 2 10 2 3 20 3 4 30 4 1 40 1 3 50 2 4 60输出: 150邻接矩阵&#xff1a; 代码如下: #include <iostream> using namespace std;int ans -1; const int N 25; int mp[N][N]; bool vis[N]; int n, m; void dfs(int u, int sum) {ans max(ans, sum);for …

论ORM框架—EntityFrameworkCore

欢迎大家阅读《朝夕Net社区技术专刊》我们致力于.NetCore的推广和落地&#xff0c;为更好的帮助大家学习&#xff0c;方便分享干货&#xff0c;特创此刊&#xff01;很高兴你能成为忠实读者&#xff0c;文末福利不要错过哦&#xff01;01PARTORM框架ORM&#xff08;Object Rela…

苏老师首播3小时!超500人观看!录屏!源码!PPT……你要的都在这里!

点击视频 ☝ 回顾直播现场2020年3月25日晚18&#xff1a;30&#xff0c;“盛派周三分享”首次直播交流会&#xff0c;由盛派技术团队带头人Jeffrey&#xff0c;苏震威老师主持、分享&#xff0c;主题是《SCF 框架介绍快速创建项目演示》。此次直播历时3个多小时&#xff0c;500…

[蓝桥杯][算法提高VIP]数的划分-dp

题目描述 一个正整数可以划分为多个正整数的和&#xff0c;比如n3时&#xff1a; 3&#xff1b;1&#xff0b;2&#xff1b;1&#xff0b;1&#xff0b;1&#xff1b; 共有三种划分方法。 给出一个正整数&#xff0c;问有多少种划分方法。 输入 一个正整数n 数据规模和约定 …

十问十答 GPL 许可证

GPL 是 GNUs General Public License 的缩写&#xff0c;翻译成中文叫 GNU 的通用公共许可证&#xff0c;是最受欢迎的开源许可证之一。它由理查德斯托曼&#xff08;Richard Stallman&#xff09;创建&#xff0c;目的是保护 GNU 软件免于被专有&#xff0c;是基于他「版权向左…

oracle consistent gets,oracle构建一致性读

对于实际的业务系统&#xff0c;通常有一些热点的表&#xff0c;insert和delete的量非常大&#xff0c;这个时候就会发现一些查询语句的逻辑读比较偏高&#xff0c;这时可能就是oracle在构建一致性块的进行的consistentread。下面做一个测试看下&#xff1a;第一步准备数据&…

解析“60k”大佬的19道C#面试题(上)

解析“60k”大佬的19道C#面试题&#xff08;上&#xff09;先略看题目&#xff1a;请简述 async函数的编译方式请简述 Task状态机的实现和工作机制请简述 await的作用和原理&#xff0c;并说明和 GetResult()有什么区别Task和 Thread有区别吗&#xff1f;如果有请简述区别简述 …

通过极简模拟框架让你了解ASP.NET Core MVC框架的设计与实现[上篇]

《200行代码&#xff0c;7个对象——让你了解ASP.NET Core框架的本质》让很多读者对ASP.NET Core管道有了真实的了解。在过去很长一段时间中&#xff0c;有很多人私信给我&#xff1a;能否按照相同的方式分析一下MVC框架的设计与实现原理&#xff0c;希望这篇文章能够满足你们的…

通过极简模拟框架让你了解ASP.NET Core MVC框架的设计与实现[中篇]:请求响应

《200行代码&#xff0c;7个对象——让你了解ASP.NET Core框架的本质》让很多读者对ASP.NET Core管道有了真实的了解。在过去很长一段时间中&#xff0c;有很多人私信给我&#xff1a;能否按照相同的方式分析一下MVC框架的设计与实现原理&#xff0c;希望这篇文章能够满足你们的…

洛谷 P2853 [USACO06DEC]Cow Picnic S-dfs

输入: 2 4 4 2 3 1 2 1 4 2 3 3 4输出: 2代码如下: #include <iostream> #include <vector> #include <cstring> using namespace std; const int N 1010; bool vis[N]; vector<int>v[N]; int r[N]; int mk[N];void dfs(int u) {mk[u];for (int i …