以Blog.Core的方式来打开Abp.vNext
(發(fā)現(xiàn)Abp這個(gè)logo真像佐助寫輪眼)
最近自己的框架已經(jīng)基本的成型了,當(dāng)然還有很多質(zhì)疑的地方,比如這些人是這么說的,基本都是原文:
你的教程太亂了,和框架代碼都不一樣(???)
文章還行,代碼規(guī)范要改善(???)
為啥要分那么多層,看著不舒服(???)
給我講講SqlSugar的優(yōu)勢在哪里(???)
多庫,讀寫分離沒看出來有啥意義(???)
我也沒辦法,只能用問號(hào)來表示我的看法了,其實(shí)一直以來我都是希望通過文章的形式讓大家如何去學(xué)習(xí),后來雖然框架的越推越廣,導(dǎo)致很多人都是直接通過框架來學(xué)習(xí)知識(shí)點(diǎn)了,所以沖突就慢慢出來了,既然本末倒置了,那索性我也倒過來,不去修改文章了,精修代碼吧,因此我也打算趁著上班之余,看看傳說中的最厲害,最豐富,最難懂的框架 —— Abp vNext,看看他們是如何運(yùn)營的吧。
群主的安排是什么?
我的計(jì)劃:很多小伙伴會(huì)說,會(huì)不會(huì)開系列教程,這個(gè)應(yīng)該會(huì)有,目前我還在學(xué)習(xí)階段,我的想法通過博客和視頻的形式,來一個(gè)三步走,先了解這個(gè)框架,再使用框架搭建自己項(xiàng)目,最后分析下他的運(yùn)行原理。
你的計(jì)劃:當(dāng)然這個(gè)教程肯定有范圍的,初學(xué)者不建議學(xué),建議剛?cè)腴T的還是看我的教程和代碼吧,然后按照這個(gè)順序?qū)W,先掌握ASP.NET Core,然后簡單了解前后端分離,再學(xué)習(xí)下DDD領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)的思想,接著簡單了解下IdentityServer4的內(nèi)容,至少要了解認(rèn)證和授權(quán)的部分內(nèi)容,我的教程目錄,設(shè)計(jì)模式是輔助:
(老張的哲學(xué),博客園系列教程)
大概就是這樣,今天呢,特別簡單,不會(huì)說這個(gè)框架的由來,官網(wǎng)地址,如何下載,如何說這個(gè)框架是多么多么厲害,大家能看到這里,證明都是知道的,今天畢竟是一個(gè)嘗鮮,是先讓大家初見下Abp的框架布局情況,而且是通過Blog.Core框架的形式來了解,前提是你正在使用或者研究Blog.Core。
1、兩個(gè)框架的對比
既然要對比呢,我就簡單的做了一個(gè)圖,當(dāng)然,我也不是真心的要和Abp比較,因?yàn)橥耆珱]有對比性,只是想說明一下,Abp這個(gè)框架的好處:
(Blog.Core與Abp框架對比圖)
我自己簡單的總結(jié)了下,Abp各個(gè)方面都很領(lǐng)先,是毋庸置疑的好框架,當(dāng)然為了體現(xiàn)文章的意義,我也列舉了不足之處,就是對新手的不太友好,很多初學(xué)者是看不懂的,這也就是為什么我在文章開頭說的,如果想要學(xué)好Abp,可以先看看我的框架或者系列文章。
那我接下來就帶著大家看看,如何通過Blog.Core來入門Abp vNext框架。
2、整體分層情況
(很巧,都是標(biāo)準(zhǔn)的十層結(jié)構(gòu))
當(dāng)然,這是開玩笑的。不過總體上來看,似乎兩個(gè)框架關(guān)聯(lián)性并不是很大,
Blog.Core采用的是,{服務(wù)-倉儲(chǔ)-接口}的開發(fā)模式;
Abp采用的是,{應(yīng)用-領(lǐng)域-基礎(chǔ)設(shè)施}的DDD開發(fā)模式;
很多人都說Blog.Core就是一個(gè)簡單的三層架構(gòu),其實(shí)我當(dāng)時(shí)這么寫,就是為了引出后邊的DDD領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)教程,不然為啥不直接叫DAL層和BLL層,還不能抬杠,抬杠我就會(huì)被問區(qū)別,我也是懶得解釋。
這么看其實(shí)關(guān)聯(lián)性不大,但是接下來我會(huì)拆分來講,你就會(huì)發(fā)現(xiàn),其實(shí)很多都是一樣的。
3、Web層對比分析
因?yàn)槟J(rèn)創(chuàng)建的Abp框架,用的是MVC Page模式(當(dāng)然它封裝了api,這個(gè)以后再說),所以我們簡單看一下Startup.cs就行:
Blog.Core在依賴注入中,采用的是服務(wù)模塊化注冊,然后配置Autofac進(jìn)行服務(wù)層的依賴注入自動(dòng)化,然后配套進(jìn)行動(dòng)態(tài)代理AOP。
Abp也是采用的模塊化的注冊方式,當(dāng)然他這個(gè)封裝的更徹底,更好吧,然后他自己也將Autofac容器給封裝了,反正就是全部封裝了。
4、服務(wù)層設(shè)計(jì)分析
服務(wù)層,也可以叫做應(yīng)用層,主要是用來向上對展示層提供服務(wù)的,向下嘛,可以是領(lǐng)域?qū)踊蛘邆}儲(chǔ)層:
在Blog.Core中,采用的是Service和IService的形式,分了兩個(gè)層,分別是
.Services?和?.IServices
我們可以定義多個(gè)服務(wù)和服務(wù)接口,來實(shí)現(xiàn)不同業(yè)務(wù)模塊的聯(lián)系,然后將IService給暴漏出給展示層。
而在Abp中呢,我們的Service層變成了應(yīng)用層.Application,IServices層變成了應(yīng)用契約層
.Application.Contracts,契約也就是接口,主要是對展示層進(jìn)行服務(wù)封裝的,然后由應(yīng)用層進(jìn)行實(shí)現(xiàn)。
除了這個(gè)服務(wù)接口呢,還有一個(gè)實(shí)體映射,也就是Dto:
在Blog.Core項(xiàng)目中,我設(shè)計(jì)到了Web層,當(dāng)然這個(gè)也是可以的:
不過Abp倒是分開了兩個(gè)部分,他在Abp和應(yīng)用層都有,不過基本都是在應(yīng)用層來設(shè)計(jì)的:
PS:Abp分層名字寫的還是挺好的,把這兩個(gè)層并列在一起了,不像我的,因?yàn)槊峙判虻膯栴},距離比較遠(yuǎn)。
5、倉儲(chǔ)層設(shè)計(jì)解析
倉儲(chǔ)層其實(shí)屬于基礎(chǔ)設(shè)施層的一部分,基礎(chǔ)設(shè)施層分兩部分,一個(gè)是對持久化的處理,另一個(gè)就是對公共層的封裝,那現(xiàn)在咱們先說下第一部分,持久化:
在Blog.Core中,我單獨(dú)建立了兩個(gè)層,倉儲(chǔ)和倉儲(chǔ)接口,這個(gè)和服務(wù)層與服務(wù)接口層似乎有些雷同,很多人表示不解,為啥要分開,這里不多說,詳細(xì)如果你看過DDD,明白了應(yīng)用層和基礎(chǔ)設(shè)施層的設(shè)計(jì)應(yīng)該就明白了。
但是在Abp框架中,有一些不太一樣了,你似乎看不到他定義Repository和IRepository的相關(guān)存在,他因?yàn)橛玫搅薊FCore,所以把EFCore當(dāng)成了倉儲(chǔ)了。
其實(shí)不是的,如果你看他的源碼,就可以發(fā)現(xiàn),他還是有倉儲(chǔ)的影子的,只不過是封裝了:
剛剛我們在應(yīng)用層中定義的服務(wù),其實(shí)是集成了倉儲(chǔ)接口的,只不過是基類,而且命名空間還是Domain領(lǐng)域?qū)?#xff1a;
從這里我們可以看出來,領(lǐng)域?qū)又卸x了倉儲(chǔ)接口,然后再在.EntityFrameworkCore層中設(shè)計(jì)我們的持久化操作。
這里就引出了第一個(gè)重要知識(shí)點(diǎn),領(lǐng)域?qū)又械降资鞘裁?#xff1f;—— 一切包含領(lǐng)域行為的類,都應(yīng)該封裝到領(lǐng)域?qū)又?#xff0c;目前的第一個(gè),倉儲(chǔ)接口。那是不是還有其他的呢?
6、實(shí)體層的設(shè)計(jì)解析
實(shí)體層這個(gè)顧名思義,我們要持久化,肯定要定義實(shí)體,或者用DDD中的屬于,可以叫聚合。
在Blog.Core中,我用Model層,來封裝了實(shí)體層,這個(gè)是沒問題的,但是有一個(gè)問題就是,這層不應(yīng)該在定義ViewModels層了,這個(gè)不應(yīng)該寫到這里,應(yīng)該寫到應(yīng)用契約層,畢竟我們知道契約就是為了用戶的。
在Abp框架中,設(shè)計(jì)的就比較合理了,詳細(xì)你也應(yīng)該能看的懂,這里不多說了。
這里要重點(diǎn)說的就是,領(lǐng)域?qū)拥诙K內(nèi)容——實(shí)體,剛剛我們說了第一個(gè)是倉儲(chǔ)接口,這兩個(gè)其實(shí)都是擁有領(lǐng)域行為的類。
7、公共層設(shè)計(jì)解析
公共層其實(shí)這個(gè)最容易理解,就是平時(shí)我們整個(gè)項(xiàng)目中,都會(huì)遇到的以下模塊,比如錯(cuò)誤碼,本地化,枚舉,常量等等,這些統(tǒng)一定義好后,可以貫穿到我們整個(gè)項(xiàng)目中。
在Blog.Core中,我就直接叫做Common層了,言簡意賅。
而在Abp中,他把這些數(shù)據(jù)放到了.Domain.Shared層了,從名字可以看懂,就是分享的意思,再加上Abp是一個(gè)DDD領(lǐng)域驅(qū)動(dòng)的框架,所以就基于領(lǐng)域?qū)酉碌姆窒韺恿恕?br />
8、其他層設(shè)計(jì)分析
至于其他層就很簡單了,Abp中,剩下的就是遷移層了:
.DbMigrator其實(shí)是一個(gè)控制臺(tái)層,配置好數(shù)據(jù)庫連接字符串,就可以直接生成項(xiàng)目了。
.EntityFrameworkCore.DbMigrations是一個(gè)類庫,存放我們的遷移記錄。
Blog.Core中的兩個(gè):
.FrameWork是一個(gè)T4模板,生成整個(gè)框架文件;
.Tasks是一個(gè)任務(wù)調(diào)度層,目前用的是Quartz.Net;
當(dāng)然,如果你還沒用過Abp,這里我列舉了十步走,你可以試試。
9、Abp開發(fā)十步走
其實(shí)說了這么多,已經(jīng)基本的說完了,從上邊的解析中,我們可以看到,如果你學(xué)會(huì)了Blog.Core,其實(shí)很好入門Abp的,至少我只看了半個(gè)小時(shí)就知道如何開發(fā)了,這里我還列舉了Abp開發(fā)十步走:
好啦,說了這么多,詳細(xì)你肯定已經(jīng)會(huì)使用Abp了吧,至少寫個(gè)增刪改查是沒問題的。
總結(jié)
以上是生活随笔為你收集整理的以Blog.Core的方式来打开Abp.vNext的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .NET Core开发实战(第33课:集
- 下一篇: 如何做好一个开源项目(一)