以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領域層:
從這里我們可以看出來,領域層中定義了倉儲接口,然后再在.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了吧,至少寫個增刪改查是沒問題的。
總結
以上是生活随笔為你收集整理的以Blog.Core的方式来打开Abp.vNext的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .NET Core开发实战(第33课:集
- 下一篇: 如何做好一个开源项目(一)