接觸abp也快一年了,有過大半年的abp專案開發經驗,目前專案中所用的abp框架版本為0.10.3,最新的abp框架已經到了1.4,並且支援了asp.net core。關於abp框架有哪些特性、有什麼好處我這裡就不講了。如果你對abp不太了解請先去 abp官網 了解或者參考我的學習之路裡面的鏈結。在這系列的文章裡面我會把我在實戰中的經驗、碰到的坑分享出來。希望跟大家一起學習討論。
一年前在裡面看到了陽光銘睿 的 一系列文章使我對abp框架產生了興趣。從此開始了abp框架的探索之路。後來在找資料的過程中發現 tkb至簡 的部落格寫的也非常不錯,他也翻譯了官網的英文文件 ,要入門的話看下這一系列的文章非常好。如果想研究原始碼可以參考下 這一系列的文章。
這個框架版本主要用的技術有 mvc5.0、web api、ef 6.1 。
topeveyr.core:主要存放業務實體以及倉儲介面。
topevery.entityframework.oracle:主要存放實體對映檔案、倉儲實現類。
topevery.web:web介面。
topevery.webapi:api介面。
topevery.infrastructure:框架中跟業務無關的公共類。
topevery.abp:封裝了abp類的公共類。
timeservices:定時服務類庫。
zero資料夾:這裡面的三個專案分別對應abp的應用服務層、核心層、資料訪問層。這個專案主要用來操作一些基礎資訊表以及公共模組。比如,使用者、角色、許可權、部門等。
整體框架設計裡面,我覺得「模組」的比較重要,這裡就講一講我對模組的理解。每個單獨類庫或者應用程式即是乙個模組。當需要用到ioc容器、abp啟動配置或者是在應用程式啟動的時候做一些設定就需要用到abp裡面的模組。模組類可以被依賴。模組類在應用程式啟動的時候被執行,並且按依賴的關係進行執行。即沒有被依賴的模組最後執行。模組有四個方法,preinitialize()、initialize()、postinitialize()、shutdown()。前三個方法是在應用程式啟動的時候執行的,最後乙個方法是在應用程式關閉的時候執行的。模組方法的執行順序是先執行完所有模組的preinitialize(),再執行所有模組的initialize(),最後執行所有模組的postinitialize()。
整體框架模組的依賴設計圖如下:
本框架大概思路是根據abp的示例**而來。我只是參照原來的框架做了一些擴充套件。相同的框架設計就不講了。講一講不同之處。在本框架裡面的zero專案跟官方abp.zero不同。abp.zero裡面基本上都是提供抽象類,要具體例項化必須得在相應的業務類庫裡面繼承才能用。本框架裡的zero專案直接提供對外的服務介面。topevery.zero是應用服務介面。topevery.zero.core存放實體倉儲介面。topevery.zero.entityframework.oracel是資料訪問抽象層,該類庫裡面有繼承了abpdbcontext的抽象類。由於本框架用的是oracle,目前還沒有找到ef操作自增長型別的解決方案。所以目前插入資料的時候解決思路是先獲取序列再插入資料。
獲取序列的話有兩種解決方案。一種是在倉儲的基類裡面新增公共方法,這種方案的優勢可以很好的整合依賴注入,並且可以做到事務控制。但這種方案的劣勢是所有的實體類都必須有對應的倉儲基類。另外一種方案是新增乙個資料訪問dbcontext。這個方案的優勢在於可以在應用服務的基類裡面新增乙個獲取序列的公共方法。劣勢是序列的獲取和其他資料的操作不能一起做事務控制。
我在框架裡面採用的是第二種方案。整體思路是在 topevery.zero.entityframework.oracle 專案中新增 idbcontexthelper 介面,該介面有兩個獲取序列的方法。在topevery.entityframework.oracle 專案中新增 dbcontexthelper,該類繼承 idbcontexthelper 介面,並且有個 dbcontext 的變數,用來訪問資料庫。為啥要這樣設計?因為解耦。所有 zero 裡面的的專案都不需要直接引用具體的dbcontexthelper而只要引用介面即可,具體的介面實現是在執行的時候注入。具體**如下:
1view codepublic
inte***ce
idbcontexthelper
2
1view codepublic
class
dbcontexthelper:idbcontexthelper,itransientdependency227
}28return
_dbcontext;29}
30}3132
///33
///得到序列的字串
34///
35///
36///
37private
string getsequencesqlbyname(string
sequencename)
3841
42///
43///
獲取序列值
44///
45///
46///
47///
48public t getsequencevaluebyname(string sequencename) where t : struct
4953
5455
///56
///獲取序列值(預設int)
57///
58///
59///
60public
int getsequencevaluebyname(string
sequencename)
6164 }
今天就講這麼多了。
ABP框架 嵌入資源
文件目錄 本節內容 新增到嵌入式資源管理器 使用嵌入式檢視 使用嵌入式資源 重寫嵌入檔案 簡介 abp提供了乙個易用的方式,在你的web應用裡嵌入razor檢視 cshtml檔案 和其它資源 css,js,img.檔案 你可以使用這個功能建立包含ui功能的外掛程式 模組.建立嵌入檔案 首先,我們應當...
ABP框架 1 1 ABP總體介紹 入門介紹
abp是 asp.net boilerplate project asp.net樣板專案 的簡稱。asp.net boilerplate是乙個用佳實踐和流行技術開發現代web應用程式的新起點,它旨在成為乙個通用的web應用程式基礎 框架和專案模板。asp.net boilerplate 基於ddd的...
ABP框架學習 角色建立
實現乙個類似於abp.zero的專案。在完成專案的過程中學習abp框架知識。我們對專案做功能分析。歸類出下以功能功知識點。1.角色 2.測試專案 3.使用者 4.許可權 5.組織 6.登陸 7.選單 8.日誌 9.錯誤處理 10.併發處理 11.用佇列方式解決高併發請求。角色功能非常的簡單。主要用做...