ABP理论学习之开篇介绍
返回總目錄
為了和2016年春節(jié)賽跑,完成該系列博客,我犧牲了今天中午的時(shí)間來完成該系列的第一篇————開篇介紹。開篇介紹嘛,讀過大學(xué)教材的同學(xué)都知道,這玩意總是那么無聊,跟考試沒關(guān)系,干脆直接跳過,呵呵,多么美好的大學(xué)時(shí)光啊!不過,現(xiàn)在想想,開篇介紹確實(shí)不怎么重要,它只是告訴我們今后我要開始講什么了,主要講什么,大概瀏覽下重點(diǎn)。
哦了,不扯了,時(shí)間不多了,干活!
本篇目錄
- 介紹
- 快速樣例
- 其他
- 啟動(dòng)模板
- 如何使用
介紹
我們總是基于不同的需求創(chuàng)建不同的應(yīng)用,但是在一定程度上,總在反復(fù)地實(shí)現(xiàn)通用而相似的結(jié)構(gòu)。這些通用的結(jié)構(gòu)包括授權(quán),驗(yàn)證,異常處理,日志,本地化,數(shù)據(jù)庫(kù)連接管理,設(shè)置管理,審計(jì)日志等。而且,我們總是在構(gòu)建體系結(jié)構(gòu)和最佳實(shí)踐,比如分層和模塊化架構(gòu),領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)(DDD),依賴注入等等。同時(shí)也在嘗試基于慣例開發(fā)應(yīng)用。
因?yàn)檫@些都是非常耗時(shí)的,并且對(duì)于每個(gè)項(xiàng)目單獨(dú)創(chuàng)建是很困難的,所以很多公司都會(huì)創(chuàng)建自己私有的框架。通過使用私有的框架,他們總是可以快速地開發(fā)新的應(yīng)用,同時(shí)應(yīng)用的bug又會(huì)更少。當(dāng)然了,不是所有的公司都是那么幸運(yùn)了,你以為中國(guó)所有的公司都是BAT啊?!大多數(shù)公司還是沒有時(shí)間,預(yù)算和團(tuán)隊(duì)來開發(fā)他們自己的私人框架。即使他們有可能構(gòu)建這么一個(gè)框架,寫文檔,培訓(xùn)開發(fā)者以及維護(hù)也是很難的。
ABP是一個(gè)開源的且文檔友好的應(yīng)用框架,起始的想法是,“開發(fā)一款為所有公司和開發(fā)者通用的框架!”。它不僅僅是一個(gè)框架,更提供了一個(gè)基于DDD和最佳實(shí)踐的健壯的體系模型。
快速樣例
一起來研究一個(gè)簡(jiǎn)單的類來看看ABP有哪些好處 :
public class TaskAppService : ApplicationService, ITaskAppService {private readonly IRepository<Task> _taskRepository;public TaskAppService(IRepository<Task> taskRepository){_taskRepository = taskRepository;}[AbpAuthorize(MyPermissions.UpdatingTasks)]public async Task UpdateTask(UpdateTaskInput input){Logger.Info("Updating a task for input: " + input);var task = await _taskRepository.FirstOrDefaultAsync(input.TaskId);if (task == null){throw new UserFriendlyException(L("CouldNotFoundTheTaskMessage"));}input.MapTo(task);} }這里我們看到了一個(gè)簡(jiǎn)單的應(yīng)用服務(wù)方法。在DDD中,表現(xiàn)層直接使用應(yīng)用服務(wù)來執(zhí)行該應(yīng)用的用例(其實(shí)就是一些操作方法)。我們還可以考慮使用Ajax調(diào)用上面的UpdateTask方法。
下面讓我們總結(jié)一下ABP的一些優(yōu)點(diǎn):
- 依賴注入:ABP使用并提供了一個(gè)健壯而又傳統(tǒng)的DI基礎(chǔ)設(shè)施。因?yàn)樯厦娴念愂窃谝粋€(gè)應(yīng)用服務(wù)中定義的,所以它會(huì)按照慣例約定短暫地(每個(gè)請(qǐng)求創(chuàng)建一次)注冊(cè)到DI容器中。它也簡(jiǎn)單地注入了所有依賴(本例中注入了IRepository)。
- 倉(cāng)儲(chǔ):ABP可以為每一個(gè)實(shí)體創(chuàng)建一個(gè)默認(rèn)的倉(cāng)儲(chǔ)(本例中是IRepository)。默認(rèn)的倉(cāng)儲(chǔ)有許多有用的方法,如本例中的 FirstOrDefault。我們也可以根據(jù)我們的需求輕易地?cái)U(kuò)展默認(rèn)倉(cāng)儲(chǔ)。倉(cāng)儲(chǔ)抽象了DBMS和ORM,并簡(jiǎn)化了數(shù)據(jù)的訪問邏輯。
- 授權(quán):ABP可以檢測(cè)權(quán)限。如果當(dāng)前的用戶沒有“updating task”的權(quán)限或者沒登錄,那么ta不能訪問UpdateTask方法。它使用聲明式的特性簡(jiǎn)化了授權(quán),而且還有其他的授權(quán)方法。
- 驗(yàn)證:ABP會(huì)自動(dòng)檢測(cè)輸入是否為null。它也基于標(biāo)準(zhǔn)的數(shù)據(jù)注解特性和自定義的驗(yàn)證規(guī)則驗(yàn)證輸入對(duì)象的所有屬性。如果請(qǐng)求不合法,那么它會(huì)拋出一個(gè)合適的驗(yàn)證異常。
- 審計(jì)日志:用戶,瀏覽器,IP地址,調(diào)用服務(wù),方法,參數(shù),調(diào)用時(shí)間,執(zhí)行時(shí)長(zhǎng)和其他的一些信息也會(huì)基于慣例和配置為每個(gè)請(qǐng)求自動(dòng)地保存。
- 工作單元(Unit of Work):在ABP中,每個(gè)應(yīng)用服務(wù)方法默認(rèn)視為一個(gè)工作單元。它會(huì)自動(dòng)創(chuàng)建一個(gè)連接并在方法的開始位置開啟一個(gè)事務(wù)。如果方法不報(bào)異常地成功完成了,那么事務(wù)會(huì)提交并且連接被釋放。即使該方法使用了不同的倉(cāng)儲(chǔ)或者方法,它們?nèi)恳捕际窃拥?#xff08;事務(wù)的)。當(dāng)事務(wù)提交時(shí),實(shí)體的所有改變都會(huì)自動(dòng)保存。因此,正如這里展示的那樣,我們甚至都不用調(diào)用**_repository.Update(task)**方法。
- 異常處理:在一個(gè)使用了ABP框架的Web應(yīng)用中,我們基本上不用處理異常。所有的異常都會(huì)默認(rèn)自動(dòng)處理。如果一個(gè)異常發(fā)生了,那么ABP會(huì)自動(dòng)地記錄它,然后返回給客戶端一個(gè)合適的結(jié)果。比如,如果這是一個(gè)Ajax請(qǐng)求,那么它會(huì)返回一個(gè)JSON到客戶端,指明發(fā)生了一個(gè)錯(cuò)誤。本例中使用了一個(gè)UserFriendlyException,這樣就隱藏了客戶端實(shí)際的異常信息。它也理解并處理客戶端的錯(cuò)誤,最后將合適的信息呈現(xiàn)給用戶。
- 日志:我們可以使用在基類中定義的Logger來寫日志。ABP默認(rèn)使用了Log4Net,但是它是可改變的或可配置的。
- 本地化(Localization):注意當(dāng)拋出異常的時(shí)候我們使用了L方法。因此,它會(huì)基于當(dāng)前用戶的文化自動(dòng)進(jìn)行本地化。當(dāng)然,我們可以在某些地方定義CouldNotFoundTheTaskMessage。
- 自動(dòng)映射:上面的最后一行代碼,我們使用了ABP的MapTo擴(kuò)展方法將輸入對(duì)象的屬性映射到實(shí)體屬性。它使用了AutoMapper庫(kù)來執(zhí)行映射。因此,我們可以基于命名慣例輕易地將屬性從一個(gè)對(duì)象上映射到另一個(gè)對(duì)象上。我的AutoMapper系列學(xué)習(xí)博客:http://www.cnblogs.com/farb/p/AutoMapperContent.html 。
- 動(dòng)態(tài)Web API層:實(shí)際上,TaskAppService 是一個(gè)簡(jiǎn)單的類(甚至不需要從ApplicationService 繼承)。我們一般會(huì)寫一個(gè)Web API Controller包裝器來將方法暴露給javascript客戶端。ABP在運(yùn)行時(shí)會(huì)自動(dòng)完成。這樣,我們可以從客戶端直接使用應(yīng)用服務(wù)方法。
- 動(dòng)態(tài)Ajax代理:ABP創(chuàng)建了javascript代理方法,它們可以調(diào)用應(yīng)用服務(wù)方法就像調(diào)用客戶端的javascript方法一樣簡(jiǎn)單。
在這么一個(gè)簡(jiǎn)單的類中,我們看到了ABP的優(yōu)勢(shì)。所有的這些任務(wù)正常情況下都是要花費(fèi)很多時(shí)間的,但是所有的這些ABP自動(dòng)幫我們完成了。
其他
除了這個(gè)簡(jiǎn)單的例子,ABP也提供了一個(gè)健壯的基礎(chǔ)設(shè)施和應(yīng)用模型。下面是ABP的一下其他特征:
- 模塊化:提供了一個(gè)健壯的基礎(chǔ)設(shè)施來生成可復(fù)用的模塊。
- 數(shù)據(jù)過濾器:提供了自動(dòng)的數(shù)據(jù)過濾來實(shí)現(xiàn)一些模式,比如軟刪除和多租戶。
- 多租戶:支持單數(shù)據(jù)庫(kù)、多客戶形式的多租戶。
- 設(shè)置管理:提供了健壯的基礎(chǔ)設(shè)施類獲得或者更改應(yīng)用,租戶和用戶級(jí)別的設(shè)置。
- 單元測(cè)試和集成測(cè)試:基于可測(cè)試性構(gòu)建,也提供了一些基類來簡(jiǎn)化單元測(cè)試和集成測(cè)試。
更多的特征,請(qǐng)認(rèn)真閱讀其他文檔。
啟動(dòng)模板
開始一個(gè)新的解決方案,創(chuàng)建層,安裝nuget包,創(chuàng)建一個(gè)簡(jiǎn)單的布局和菜單...所有的這些都是非常耗時(shí)的。
ABP提供了一個(gè)預(yù)生成的啟動(dòng)模板,有了它,創(chuàng)建一個(gè)新的解決方案更容易了。模板支持SPA(單頁(yè)應(yīng)用)和MPA(多頁(yè)應(yīng)用)。而且,我們可以選擇不同的ORM。
如何使用
ABP的源碼已經(jīng)推送到了Github上,Nuget包也已經(jīng)發(fā)布到了Nuget上。開始使用ABP最簡(jiǎn)單的方式就是使用ABP官網(wǎng)的模板創(chuàng)建項(xiàng)目,然后跟著文檔來學(xué)習(xí)。
轉(zhuǎn)載于:https://www.cnblogs.com/farb/p/ABPIntro.html
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的ABP理论学习之开篇介绍的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网络请求
- 下一篇: Xcode7在运行包含HTTP协议的程序