距離上一篇OpenAuth.net的文章已經有5個多月了,在這段時間里項目得到了很多朋友的認可,開源中國上面的Star數接近300,於是堅定了我做下去的信心。最近稍微清閑點,正式推出1.0版,併在阿裡雲上部署了一個線上演示(文章結尾處給出線上演示鏈接)。相比剛開始時的版本,現在整個架構已經穩定,系統 ...
距離上一篇OpenAuth.net的文章已經有5個多月了,在這段時間里項目得到了很多朋友的認可,開源中國上面的Star數接近300,於是堅定了我做下去的信心。最近稍微清閑點,正式推出1.0版,併在阿裡雲上部署了一個線上演示(文章結尾處給出線上演示鏈接)。相比剛開始時的版本,現在整個架構已經穩定,系統功能性,代碼可讀性維護性都有質的飛躍。
本文主要介紹系統結構及未來一段時間的開發計劃。
項目簡介
本項目採用經典DDD架構(用沃恩.弗農大神的話,其實這是DDD-Lite)思想進行開發的一套符合國情的基於用戶和角色的RBAC系統,系統的產生原因及與眾不同的地方可以參考:領域驅動設計實戰—基於DDDLite的許可權管理OpenAuth.net,這裡就不過多介紹。項目地址:
https://git.oschina.net/yubaolee/OpenAuth.Net
演示地址在文章結尾處給出:)
當前項目功能:
- 模塊許可權 實現模塊的自定義及許可權分配;
- 菜單許可權 實現菜單的自定義及許可權分配;
- 資源許可權 實現資源的自定義及許可權分配,主要是為了給第三方應用提供服務;
- 實現用戶分配角色,也可以直接給用戶分配模塊/菜單;
- 基於ASP.NET Identity登錄;
- 實現一個簡單的進出庫管理的例子,在例子中使用admin,test登錄或直接以“開發者賬號”登錄,看到的結果是不同的;
項目這一年裡都發生了什麼?
準確的說應該是5個月來發生了什麼,因為項目正式發佈剛剛5個多月的時間。最高興的應該是入選了:開源中國2015 年度新增開源軟體排名 TOP 100 在新入選的5977個項目中位列第69。也算為C#那可憐的開源份額做點貢獻了!
系統架構
首先到底什麼是經典DDD架構?
DDD:領域驅動設計,以領域業務為核心的設計。什麼?這是屁話,很多書上都介紹過?
那我就從代碼的角度來解釋就是:丫就是你的XXXBLL模塊不要引用諸如XXXDAL/XXXHELPER等模塊並且能夠實現系統的業務邏輯,基本就是了。如下圖:
基於上面的結構創建本項目。所有的依賴關係在界面OpenAuth.Mvc項目中由AutoFac進行IOC控制,如下圖:
OpenAuth.Domain 系統領域層,當前領域層主要有下麵三部分組成:
- 領域對象:系統核心對象;
- 領域介面:當前主要是資料庫訪問的倉儲介面,具體的實現在OpenAuth.Repository中實現;
- 領域服務:系統的多對象交互業務處理。由於當前的業務複雜度比較低,業務主要是以領域服務的形式出現。如項目中的“進出庫管理服務”:
using System; using System.Linq; using System.Linq.Expressions; using OpenAuth.Domain.Interface; namespace OpenAuth.Domain.Service { /// <summary> /// 領域服務 /// <para>進出庫管理服務</para> /// </summary> public class StockManagerService { private IStockRepository _repository; private IOrgRepository _orgRepository; private AuthoriseService _authoriseService; public StockManagerService(IStockRepository repository, IOrgRepository orgRepository, AuthoriseService service) { _repository = repository; _orgRepository = orgRepository; _authoriseService = service; } /// <summary> /// 根據部門ID得到進出庫信息 /// </summary> public dynamic Load(string username, int orgId, int pageindex, int pagesize) { _authoriseService.GetUserAccessed(username); if (_authoriseService.Orgs.Count == 0) //用戶沒有任何可見機構 { return new { total = 0, pageCurrent = pageindex }; } var orgIds = _authoriseService.Orgs.Select(u => u.Id).ToArray(); //用戶可訪問的機構ID var orgs = _orgRepository.GetSubWithOwn(orgId) //點擊的節點與用戶可訪問的機構合併 .Where(u => orgIds.Contains(u.Id)) .Select(u => u.Id).ToArray(); var keys = _authoriseService.Resources.Select(r => r.Key); //用戶可訪問的資源的KEY列表 //由於庫存Stock表開始沒有設計資源有關的欄位,暫時用User欄位代替 Expression<Func<Stock, bool>> exp = u => orgs.Contains(u.OrgId) && (u.User == "" || keys.Contains(u.User)); var stocks = _repository.Find(pageindex, pagesize, "", exp); int total = _repository.GetCount(exp); return new { total = total, list = stocks, pageCurrent = pageindex }; } public Stock Find(int id) { var stock = _repository.FindSingle(u => u.Id == id); if (stock == null) return new Stock(); return stock; } public void Delete(int id) { _repository.Delete(id); } public void AddOrUpdate(Stock stock) { if (stock.Id == 0) { _repository.Add(stock); } else { _repository.Update(stock); } } } }
OpenAuth.Repository 系統倉儲層,實現領域模型中定義的介面
OpenAuth.App 應用層,為界面提供介面
OpenAuth.Mvc 採用基於jquery與bootstrap的B-JUI界面,1.0版中全面實現HTML,javascript,MVC後端代碼的分離。如進出庫管理載入的執行流程如下:
OpenAuth.UnitTest 單元測試
Infrastructure 與項目無關的通用工具集合
近期規劃
功能:
5月份完成許可權繼承機制;
6月份增加完整的自定義流程事例;
性能:
添加完成的緩存機制;
結構:
根據反饋情況,把結構向真正的DDD方向調整。實現CQRS,適當時候添加AES等機制;
線上演示
線上地址:http://115.28.10.123:1314 (為安全起見,關閉了部分POST請求,如確實有演示修改的請求請留言)
首次發佈QQ群:484498493