abp及實戰框架概述
接觸abp也快一年了,有過大半年的abp專案開發經驗,目前專案中所用的abp框架版本為0.10.3,最新的abp框架已經到了1.4,並且支援了asp.net core。關於abp框架有哪些特性、有什麼好處我這裡就不講了。如果你對abp不太瞭解請先去 Abp官網 瞭解或者參考我的學習之路里面的連結。在這系列的文章裡面我會把我在實戰中的經驗、碰到的坑分享出來。希望跟大家一起學習討論。
學習之路
一年前在部落格園裡面看到了陽光銘睿 的 http://www.cnblogs.com/mienreal/p/4528470.html 一系列文章使我對abp框架產生了興趣。從此開始了abp框架的探索之路。後來在找資料的過程中發現 tkb至簡 的部落格寫的也非常不錯,他也翻譯了官網的英文文件 http://www.cnblogs.com/farb/category/762156.html ,要入門的話看下這一系列的文章非常好。如果想研究原始碼可以參考下 http://www.cnblogs.com/1zhk/category/798531.html 這一系列的文章。
Abp在github上的原始碼地址為:https://github.com/aspnetboilerplate。
框架概述
這個框架版本主要用的技術有 mvc5.0、web api、EF 6.1 。
一、整體框架概述
Topeveyr.Core:主要存放業務實體以及倉儲介面。
Application資料夾:這裡面有兩個應用服務層,當時是想做讀寫分離的,一個讀一個寫。但是底層的資料訪問層沒有實現讀寫分離。(全完實現讀寫分離還沒找到解決方案)
Topevery.EntityFramework.Oracle:主要存放實體對映檔案、倉儲實現類。
Topevery.Web:web介面。
Topevery.WebApi:api介面。
Topevery.Infrastructure:框架中跟業務無關的公共類。
Topevery.WF.Framework:流程業務相關專案。
Topevery.Abp:封裝了abp類的公共類。
TimeServices:定時服務類庫。
Dapper:一款輕量級orm框架。主要是為了支援EF操作Oracled包而加進來的。如果是其他資料庫可以忽略該專案。為了更好的統一,以後應該全部換成儲存過程。
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而只要引用介面即可,具體的介面實現是在執行的時候注入。具體程式碼如下:
1 public interface IDbContextHelper 2 { 3 /// <summary> 4 /// 獲取序列值 5 /// </summary> 6 /// <typeparam name="T"></typeparam> 7 /// <param name="sequenceName"></param> 8 /// <returns></returns> 9 T GetSequenceValueByName<T>(string sequenceName) where T : struct; 10 11 /// <summary> 12 /// 獲取序列值(預設int) 13 /// </summary> 14 /// <param name="sequenceName"></param> 15 /// <returns></returns> 16 int GetSequenceValueByName(string sequenceName); 17 }View Code
1 public class DbContextHelper:IDbContextHelper,ITransientDependency 2 { 3 /// <summary> 4 /// 資料訪問類 5 /// </summary> 6 private volatile DbContext _dbContext ; 7 8 /// <summary> 9 /// 鎖幫助物件 10 /// </summary> 11 private readonly object _lockObject = new object(); 12 13 /// <summary> 14 /// 15 /// </summary> 16 private DbContext TopeveryDbContext 17 { 18 get 19 { 20 if (_dbContext == null) 21 { 22 lock (_lockObject) 23 { 24 if (_dbContext == null) 25 _dbContext = IocManager.Instance.Resolve<TopeveryDbContext>(); 26 } 27 } 28 return _dbContext; 29 } 30 } 31 32 /// <summary> 33 /// 得到序列的字串 34 /// </summary> 35 /// <param name="sequenceName"></param> 36 /// <returns></returns> 37 private string GetSequenceSqlByName(string sequenceName) 38 { 39 return "select " + sequenceName + ".nextval from dual"; 40 } 41 42 /// <summary> 43 /// 獲取序列值 44 /// </summary> 45 /// <typeparam name="T"></typeparam> 46 /// <param name="sequenceName"></param> 47 /// <returns></returns> 48 public T GetSequenceValueByName<T>(string sequenceName) where T : struct 49 { 50 string sql = GetSequenceSqlByName(sequenceName); 51 return TopeveryDbContext.Database.SqlQuery<T>(sql).First(); 52 } 53 54 55 /// <summary> 56 /// 獲取序列值(預設int) 57 /// </summary> 58 /// <param name="sequenceName"></param> 59 /// <returns></returns> 60 public int GetSequenceValueByName(string sequenceName) 61 { 62 return GetSequenceValueByName<int>(sequenceName); 63 } 64 }View Code
今天就講這麼多了。
原始碼地址:https://github.com/yuanbeier/JMGF.git
相關推薦
abp及實戰框架概述
接觸abp也快一年了,有過大半年的abp專案開發經驗,目前專案中所用的abp框架版本為0.10.3,最新的abp框架已經到了1.4,並且支援了asp.net core。關於abp框架有哪些特性、有什麼好處我這裡就不講了。如果你對abp不太瞭解請先去 Abp官網
Java日誌框架解析及實戰分析
轉載自: https://zhuanlan.zhihu.com/p/24272450 https://zhuanlan.zhihu.com/p/24275518 作為Java程式設計師,幸運的是,Java 擁有功能和效能都非常強大的日誌庫;不幸的是,這樣的日誌庫有不止一個——相信每個人都曾經迷失在JUL(J
spring框架概述及六大核心功能介紹
元件/框架設計 侵入式設計 引入了框架,對現有的類的結構有影響;即需要實現或繼承某些特定類。 例如:Struts框架 非侵入式設計 引入了框架,對現有的類結構沒有影響。 例如:Hi
Reactor構架模式及框架概述
本文轉載自:http://www.cnblogs.com/hzbook/archive/2012/07/19/2599698.html Reactor框架是ACE各個框架中最基礎的一個框架,其他框架都或多或少地用到了Reactor框架。本文分析Reactor構架模式的基本
Mocking的概念及常見Mocking框架概述
在單元測試中,測試一個物件的API往往需要依賴其他物件構成的環境。例如,測試物件是A,但是A的正常工作需要物件B, C提供支援。而物件B, C的初始化又有一個複雜的過程。Mocking為單元測試提供了一個方案,直接設定模擬的物件B, C,在測試物件A時使用模擬出來的物件B,
DNS tunnel的原理及實戰
cer 並且 酒店 約定 網上 tunnel 得到 什麽 簡單介紹 DNS tunnel的原理及實戰 摘自:http://netsec.ccert.edu.cn/zhengming/2011/11/01/%E8%BD%AC%E8%BD%BD%EF%BC%9Adns-tunn
Azure Stack技術深入淺出系列3: Azure Stack運維工具Azure Stack Tools的使用及實戰
azure stack 雲計算 微軟 azure源自 Azure 的 Azure stack 作為一款業界唯一的和領先的公有雲平臺一致的混合雲平臺,能夠幫助企業客戶從自有數據中心交付 Azure 雲服務。作為《Azure Stack 技術深入淺出系列》的第三篇文章,本文將介紹 Azure Stack 部署完成
深入理解IOC模式及Unity框架
理解 rain 框架 播放器 url 播放 builder 說明 title 深入理解IOC模式及Unity框架 研究了下,有幾篇博客確實已經說得很清楚了 1、IoC模式:http://www.cnblogs.com/qqlin/archive/
Java三大主流框架概述
連接 cti 轉換 增刪 關閉連接 三種 流行 api 關閉 Java三大主流框架概述 郵箱:[email protected]/* */ Struts、Hibernate和Spring是我們Java開發中的常用關鍵,他們分別針對不同的應用場景給出最合適的解決方
異常及File類概述
異常 error exception file filenamefileter io流 一、異常 1、異常分類: Throwable:Throwable類是 Java 語言中所有錯誤或異常的超類。它只有兩個子類 Error:屬於嚴重問題,只能避免;如內存溢出(OutOfMemor
命令框架概述
bat 顯示 設定 條件 範例 框架概述 fcm src blog 你可以使用命令框架服務向設備上正在運行的應用程序發送命令。 例如,Predix雲中的EdgeManager設備管理應用程序能夠向任何使用命令框架服務設備的單獨的應用程序發送命令。 為了傳遞EdgeManag
nginx狀態模塊詳解及實戰
linuxnginx status介紹 nginx軟件的功能模塊中有一個ngx_http_stub_status_module模塊,這個模塊的主要功能是記錄nginx的基本訪問狀態信息,讓使用者了解nginx的工作狀態,例如:連接數等信息。要想使用狀態模塊,在編譯nginx時必須增加http_stub_
MyBatis框架概述
實現 property 五個 上下 sources insert truct version except MyBatis是一個優秀的持久層框架,它對jdbc的操作數據庫的過程進行封裝,使開發者只需要關註SQL本身,而不需要花費精力去處理例如註冊驅動、創建connectio
Fiddler抓包【1】_介紹及界面概述
緩存 沒有 user 編輯器 主菜單 selected ble bar 文件格式 一、 主要抓包工具介紹與對比 1、Wireshark :通用抓包工具,抓取信息量龐大,需要過濾才能得到有用信息,只抓HTTP請求有點大財小用。 2、Firebug、HttpWatch等We
keepalived高可用集群技術介紹及實戰演練
keepalived一、Keepalived是什麽 Keepalived的作用是檢測服務器的狀態,如果有一臺web服務器宕機,或工作出現故障,Keepalived將檢測到,並將有故障的服務器從系統中剔除,同時使用其他服務器代替該服務器的工作,當服務器工作正常後Keepalived自動將服務器加入到服務器群中,
Struts2框架概述
什麽是 下載 理解 設計模式的 處理 項目 con apach 復雜 Struts2-day01 一、 框架概述 什麽是框架,為什麽使用框架,框架優點 框架(framework)是一個基本概念上的結構,用於去解決或者處理復雜的問題 框架,即framewo
Mysql DBA 高級運維學習筆記-生產場景mysql主從復制讀寫分離授權方案及實戰
pin 同時 row rpo from 可能 change sql sla 當配置好MySQL主從復制以後所有對數據內容的更新就必須在主庫上進行。那麽為什麽所有的更新都要在主服務器上進行呢?這是因為數據復制時單向的,只有在主庫上更新,才能避免用戶對主服務器上數據庫內容的更新
以前寫的兩本書《安全之路:Web滲透技術及實戰案例解析(第2版)》和《黑客攻防實戰加密與解密》
Web滲透技術及實戰案例解析 黑客攻防實戰加密與解密 應一些朋友的要求,我重新將書封面和購買地址發一下說明一下:www.antian365.com原來域名轉移到國外去了。現在國家對境外域名在國內訪問必須實名制,進行備份啥的,情況你懂的。最近正在制作《黑客攻防實戰加密與解密》的視頻課程,對黑客攻防過程遇
區塊鏈及技術棧概述
區塊鏈 比特幣 區塊鏈 本質: 一種記賬方法 術語: 節點: 每個節點維護著自己的一個賬本 維護原則: 獨立記賬,節點間記賬的內容保持一致 共識算法: 節點間保持一致的方法 挖礦: 各節點為爭搶打包數據的權力的行為,掙得權力打包數據可獲得獎勵
Linux usb gadget框架概述
strong usb driver site 總結 class cpp 感悟 字符 很幸運,在公司開發了gadget相關驅動,總結下來,大大小小開發了四個與gadget相關的驅動,字符驅動、g_multi、g_ether、g_zero,在這裏把自己對gadget的開發中