[開源]OSharpNS - .net core 快速開發框架 - 簡介

来源:https://www.cnblogs.com/guomingfeng/archive/2019/05/05/osharpns-intro.html
-Advertisement-
Play Games

OSharpNS全稱OSharp Framework with .NetStandard2.0,是一個基於`.NetStandard2.0`開發的一個`.NetCore`快速開發框架。這個框架使用最新穩定版的`.NetCore SDK`(當前是.NET Core 2.2),對 AspNetCore... ...


什麼是OSharp

OSharpNS全稱OSharp Framework with .NetStandard2.0,是一個基於.NetStandard2.0開發的一個.NetCore快速開發框架。這個框架使用最新穩定版的.NetCore SDK(當前是.NET Core 2.2),對 AspNetCore 的配置、依賴註入、日誌、緩存、實體框架、Mvc(WebApi)、身份認證、許可權授權等模塊進行更高一級的自動化封裝,並規範了一套業務實現的代碼結構與操作流程,使 .Net Core 框架更易於應用到實際項目開發中。

框架工程組織

框架的工程組織結構如下:

框架工程組織結構

各工程簡介

  1. OSharp【框架核心組件】:框架的核心組件,包含一系列快速開發中經常用到的Utility輔助工具功能,框架各個組件的核心介面定義,部分核心功能的實現
  2. OSharp.AspNetCore【AspNetCore組件】:AspNetCore組件,提供AspNetCore的服務端功能的封裝
  3. OSharp.AutoMapper【對象映射組件】:AutoMapper 對象映射組件,封裝基於AutoMapper的對象映射實現
  4. OSharp.EntityFrameworkCore【EFCore 數據組件】:EFCore數據訪問組件,封裝EntityFrameworkCore數據訪問功能的實現
  5. OSharp.EntityFrameworkCore.MySql【EFCore MySql 數據組件】:EFCore MySql數據訪問組件,封裝MySql的EntityFrameworkCore數據訪問功能的實現
  6. OSharp.EntityFrameworkCore.SqlServer【EFCore SqlServer 數據組件】:EFCore SqlServer數據訪問組件,封裝SqlServer的EntityFrameworkCore數據訪問功能的實現
  7. OSharp.EntityFrameworkCore.Sqlite【EFCore Sqlite 數據組件】:EFCore Sqlite數據訪問組件,封裝Sqlite的EntityFrameworkCore數據訪問功能的實現
  8. OSharp.EntityFrameworkCore.PostgreSql【EFCore PostgreSql 數據組件】:EFCore PostgreSql數據訪問組件,封裝PostgreSql的EntityFrameworkCore數據訪問功能的實現
  9. OSharp.EntityFrameworkCore.Oracle【EFCore PostgreSql 數據組件】:EFCore Oracle數據訪問組件,封裝Oracle的EntityFrameworkCore數據訪問功能的實現
  10. OSharp.Permissions【許可權組件】:使用AspNetCore的Identity為基礎實現身份認證的封裝,以Security為基礎實現以角色-功能、用戶-功能的功能許可權實現,以角色-數據,用戶-數據的數據許可權的封裝
  11. OSharp.Log4Net【日誌組件】:基於Log4Net的日誌記錄組件
  12. OSharp.Redis【緩存組件】:基於Redis的分散式緩存客戶端組件
  13. OSharp.Hangfire【後臺任務組件】:封裝基於Hangfire後臺任務的服務端實現
  14. OSharp.MiniProfiler【MiniProfiler組件】:基於MiniProfiler實現的性能監測組件
  15. OSharp.Swagger【SwaggerAPI組件】:基於Swagger生成MVC的Action的API測試介面信息
  16. OSharp.Exceptionless【Exceptionless分散式日誌組件】:封裝基於Exceptionless 分散式日誌記錄實現

Nuget Packages

包名稱 Nuget版本 下載數
OSharpNS.Core OSharpNS.Core OSharpNS.Core
OSharpNS.AspNetCore OSharpNS.AspNetCore OSharpNS.AspNetCore
OSharpNS.AutoMapper OSharpNS.AutoMapper OSharpNS.AutoMapper
OSharpNS.EntityFrameworkCore OSharpNS.EntityFrameworkCore OSharpNS.EntityFrameworkCore
OSharpNS.EntityFrameworkCore.SqlServer OSharpNS.EntityFrameworkCore.SqlServer OSharpNS.EntityFrameworkCore.SqlServer
OSharpNS.EntityFrameworkCore.MySql OSharpNS.EntityFrameworkCore.MySql OSharpNS.EntityFrameworkCore.MySql
OSharpNS.EntityFrameworkCore.Sqlite OSharpNS.EntityFrameworkCore.Sqlite OSharpNS.EntityFrameworkCore.Sqlite
OSharpNS.EntityFrameworkCore.PostgreSql OSharpNS.EntityFrameworkCore.PostgreSql OSharpNS.EntityFrameworkCore.PostgreSql
OSharpNS.EntityFrameworkCore.Oracle OSharpNS.EntityFrameworkCore.Oracle OSharpNS.EntityFrameworkCore.Oracle
OSharpNS.Permissions OSharpNS.Permissions OSharpNS.Permissions
OSharpNS.Log4Net OSharpNS.Log4Net OSharpNS.Log4Net
OSharpNS.Redis OSharpNS.Redis OSharpNS.Redis
OSharpNS.Hangfire OSharpNS.Hangfire OSharpNS.Hangfire
OSharpNS.Exceptionless OSharpNS.Exceptionless OSharpNS.Exceptionless
OSharpNS.MiniProfiler OSharpNS.MiniProfiler OSharpNS.MiniProfiler
OSharpNS.Swagger OSharpNS.Swagger OSharpNS.Swagger
OSharpNS OSharpNS OSharpNS
OSharpNS.Template.Mvc_Angular OSharpNS.Template.Mvc_Angular OSharpNS.Template.Mvc_Angular

OSharp框架特性

1. 模塊化的組件系統設計

OSharp框架設計了一個模塊(Pack)系統,每個Pack以一個實現了模塊基類(OsharpPack)的類作為入口,這個類完成本模塊的服務添加(AddService)和模塊初始化工作(UserPack)。一個Pack是一系列高內聚低耦合的服務組織,對象提供一個功能(如緩存功能,日誌功能,數據存儲功能)或完成一組業務處理(如身份認證,許可權授權)。

一個Pack入口類的代碼如下:

public class XXXPack : OsharpPack
{
    /// <summary>
    /// 獲取 模塊級別
    /// </summary>
    public override PackLevel Level => PackLevel.Core;

    /// <summary>
    /// 獲取 模塊啟動順序,模塊啟動的順序先按級別啟動,級別內部再按此順序啟動
    /// </summary>
    public override int Order => 2;

    /// <summary>
    /// 將模塊服務添加到依賴註入服務容器中
    /// </summary>
    /// <param name="services">依賴註入服務容器</param>
    /// <returns></returns>
    public override IServiceCollection AddServices(IServiceCollection services)
    {
        // TODO: 在這裡添加本模塊涉及的各種依賴註入服務

        return services;
    }

    /// <summary>
    /// 應用模塊服務
    /// </summary>
    /// <param name="provider">服務提供者</param>
    public override void UsePack(IServiceProvider provider)
    {
        // TODO: 在這裡進行模塊的初始化操作

        IsEnabled = true;
    }
}

當前框架的模塊組成如下圖:

名稱 類型 級別
OSharp核心模塊 OSharp.Core.Packs.OsharpCorePack Core
依賴註入模塊 OSharp.Dependency.DependencyPack Core
Log4Net模塊 OSharp.Log4Net.Log4NetPack Core
AspNetCore模塊 OSharp.AspNetCore.AspNetCorePack Core
事件匯流排模塊 OSharp.EventBuses.EventBusPack Core
AutoMapper模塊 OSharp.AutoMapper.AutoMapperPack Framework
Hangfire後臺任務模塊 OSharp.Hangfire.HangfirePack Framework
Redis模塊 OSharp.Redis.RedisPack Framework
MySqlEntityFrameworkCore模塊 OSharp.Entity.MySql.MySqlEntityFrameworkCorePack Framework
SqliteEntityFrameworkCore模塊 OSharp.Entity.Sqlite.SqliteEntityFrameworkCorePack Framework
SqlServerEntityFrameworkCore模塊 OSharp.Entity.SqlServer.SqlServerEntityFrameworkCorePack Framework
SqlServer-DefaultDbContext遷移模塊 OSharp.Site.Web.Startups.SqlServerDefaultDbContextMigrationPack Framework
MVC功能點模塊 OSharp.AspNetCore.Mvc.MvcFunctionPack Application
數據實體模塊 OSharp.Core.EntityInfos.EntityInfoPack Application
系統信息模塊 OSharp.Systems.SystemPack Application
身份認證模塊 OSharp.Site.Identity.IdentityPack Application
MVC模塊 OSharp.Site.Web.Startups.AspNetCoreMvcPack Application
SignalR模塊 OSharp.Site.Web.Startups.SignalRPack Application
許可權安全模塊 OSharp.Site.Security.SecurityPack Application
代碼生成模塊 OSharp.Site.Web.Startups.CodeGeneratorPack Application
SwaggerApi模塊 OSharp.Swagger.SwaggerPack Application
審計模塊 OSharp.Site.Systems.AuditPack Application

2. 自動化的依賴註入註冊機制

空介面標註方式

框架定義了ISingletonDependencyIScopeDependencyITransientDependency 三個空介面,對應著依賴註入的ServiceLifetime.SingletonServiceLifetime.ScopedServiceLifetime.Transient三種服務生命周期。按需要實現了空介面的服務類,將在系統初始化時被檢索出來進行實現類與其介面的依賴註入服務註冊。

空介面的標註方式,統一使用TryAdd來進行註入

一個示例代碼如下:

public XXXService : IXXXService, ISingletonDependency
{ }

這個示例代碼將在系統初始化時執行如下的註入行為:

// 空介面的標註方式,統一使用TryAdd來進行註入
services.TryAdd(new ServiceDescriptor(typeof(IXXXService), 
    typeof(XXXService), ServiceLifetime.Singleton));

DependencyAttribute特性標註方式

空介面的標註方式,只能指定服務的註冊生命周期類型,而不能進行更多的配置,因此增加了[Dependency]特性的標註方式。通過[Dependency],可以進行 服務註冊的生命周期類型、是否是TryAdd方式註冊、是否替換已存在的服務、是否註冊自身 等配置,使用起來更加靈活方便。
一個示例代碼如下:

[Dependency(ServiceLifetime.Singleton, ReplaceExisting = true, AddSelf = true)]
public XXXService : IXXXService
{ }

這個示例代碼將在系統初始化時執行如下的註入行為:

// replace
services.Replace(new ServiceDescriptor(typeof(IXXXService), 
    typeof(XXXService), ServiceLifetime.Singleton));
// add self
services.TryAdd(new ServiceDescriptor(typeof(XXXService), 
    typeof(XXXService), ServiceLifetime.Singleton));

自動化的註冊機制

系統初始化時,通過反射檢索程式集的方式,檢索出所有服務類型(ServiceType)與服務實現(ImplementationType)及生命周期類型(ServiceLifetime)的相關數據,將依賴註入服務註冊到服務容器ServiceCollection中。

3. UnitOfWork-Repository模式,EFCore上下文動態構建

  • 數據模塊使用了UnitOfWork-Repository的模式來設計,設計了一個泛型的實體倉儲介面IRepository<TEntity,TKey>,避免每個實體都需實現一個倉儲的繁瑣操作。設計了IUnitOfWorkManager介面來管理多資料庫連接事務,每個IUnitOfWork,通過IUnitOfWork模式管理DbContext的創建與緩存,使同連接對象的多個上下文共用事務,達到多上下文的事務同步能力。
  • 基於MVC的ActionFilter的UnitOfWorkAttribute AOP 事務自動提交,業務中不再需要關心事務的生命周期。
  • 系統初始化時,通過反射檢索程式集的方式,檢索出各個實體與上下文的映射關係,向上下文中動態添加實體類來構建上下文類型,以達到上下文類型與業務實體解耦的目的。通過統一基類EntityTypeConfigurationBase<TEntity, TKey>的FluentAPI實體映射,自由配置每個實體與資料庫映射的每一個細節。

4. 基於AspNetCore的Identity的身份認證設計系統

  • 使用AspNetCore原生的用戶身份認證框架,身份認證相關操作統一使用UserManager,RoleMamanger兩個入口,保持了原生Identity的體系強大性與功能完整性。
  • 重新設計了用戶存儲UserStore和角色存儲RoleStore,使用框架內設計的IRepository<TEntity,TKey>數據倉儲介面來實現對數據的倉儲操作,使Identity身份認證系統與框架完美結合,避免了使用官方的Microsoft.AspNetCore.Identity.EntityFrameworkCore造成多個上下文或者被強制使用Identity上下文作為系統數據上下文來實現業務造成的尷尬。

5. 設計了一個強大的功能許可權與數據許可權的授權體系

  • 從底層開始,自動收集了系統的所有業務點(IFunction)和數據實體(IEntityInfo),用於對系統的功能許可權、數據許可權、數據緩存、操作審計 等實用功能提供數據支持。
  • 功能點Function與MVC的Area/Controller/Action一一對應,是功能許可權的最小驗證單位,基於功能點,可以配置:
    • 功能訪問類型(匿名訪問、登錄訪問、限定角色訪問)
    • 功能的數據緩存時間及緩存過期方式(絕對過期、相對過期)
    • 是否開啟操作審計(XXX人員XXX時間做了XXX操作)
    • 是否開啟數據審計(操作引起的數據變化詳情(新增、更新、刪除))
  • 數據實體EntityInfo與資料庫中的各個數據實體一一對應,基於數據實體,可以配置:
    • 是否開啟數據審計,與Function上的同配置級別不同,如果指定實體未開放審計,則不審計當前實體。
    • 實現數據許可權,基於角色 - 實體的數據許可權設計,通過配置實現 XXX角色是否有權訪問XXX實體數據(的XX屬性)
  • 設計了一個樹形結構的業務模塊體系(Module),對應著後端向前端(菜單/按鈕)開放的API,一個模塊可由一個或多個功能點構成,模塊是對外開放的特殊功能點,是進行 角色/用戶功能授權 的單位。把一個模塊授權給角色,角色即擁有了一個或多個功能點的操作許可權。

功能許可權授權流程

  • [自動] 創建MVC的各個Area/Controller/Action的功能點Function信息,存儲到資料庫
  • [自動] 創建樹形模塊Module信息,並創建模塊與功能點(一個或多個)的分配關係,存儲到資料庫
  • 將模塊Module分配給角色Role
  • 將角色Role分配給用戶User
  • 可將模塊Module分配給用戶User,解決特權問題
  • 這樣用戶即可根據擁有的角色,自動擁有模塊對應著的所有功能點的功能許可權

功能許可權驗證流程

  • 系統初始化時,根據每個角色Role分配到的模塊Module,自動初始化每個 角色 Role - Function[]的許可權對應關係並緩存
  • 游客進入系統時,自動請求所有可匿名訪問FunctionAccessType.Anonymouse的模塊信息並緩存到瀏覽器,瀏覽器根據這個緩存的模塊集合,對前端頁面的各個操作點(菜單/按鈕)進行是否隱藏/禁用的狀態控制
  • 註冊用戶登錄系統時,自動請求所有可執行(包括匿名的FunctionAccessType.Anonymouse、登錄的FunctionAccessType.Logined、指定角色的FunctionAccessType.RoleLimit)的模塊信息並緩存到瀏覽器,瀏覽器根據這個緩存的模塊集合,對前端頁面的各個操作點(菜單/按鈕)進行是否隱藏/禁用的狀態控制

  • 用戶User執行一個功能點Function時,驗證流程如下:
    • 功能點不存在時,返回404
    • 功能點被鎖定時,返回423
    • 功能點可訪問性為匿名FunctionAccessType.Anonymouse驗證通過
    • 功能點可訪問性為需要登錄FunctionAccessType.Logined時,用戶未登錄,返回401,已登錄則驗證通過
    • 功能點可訪問性為需要登錄FunctionAccessType.RoleLimit時,流程如下:
      • 用戶未登錄,返回401
      • 逐個驗證用戶擁有的角色Role,根據角色從緩存中取出Role-Function[]緩存項,Function[]包含要驗證的功能點時,驗證通過
      • 由分配給用戶的模塊Module對應的功能點,獲取到User-Function[](並緩存),Function[]包含要驗證的功能點時,驗證通過
      • 驗證未通過,返回403

數據許可權授權流程

  • 基於 角色Role-實體EntityInfo 的一一對應關係,配置指定角色對指定數據實體的數據查詢篩選規則,並持久化到資料庫中
  • 數據查詢篩選規則組成為 條件組FilterGroup和條件FilterRule,一個條件組 FilterGroup 包含 一個或多個條件 FilterRule 和 一個或多個 條件組FilterGroup,這樣就實現了條件組和條件的無限嵌套,能滿足絕大多數數據篩選規則的組裝需要,如下圖:

數據許可權驗證流程

  • 系統初始化時,將所有角色-實體的數據篩選規則緩存到記憶體中
  • 進行數據查詢的時候,根據當前用戶的所有角色 Role和要查詢的實體 EntityInfo,查找出所有配置的數據篩選規則FilterGroup,轉換為數據查詢表達式Expression<Func<TEntity,bool>>,各個角色的表達式之間使用Or邏輯進行組合
  • 將以上生成的數據許可權數據查詢表達式,使用And邏輯組合到用戶的提交的查詢條件生成的表達式中,得到最終的數據查詢表達式,提交到資料庫中進行數據查詢,從而獲得數據許可權限制下的合法數據

6. 集成 Swagger 後端API文檔系統

OSharp 快速啟動模板的開發模式,集成了Swagger API 文檔生成組件,更方便了前後端分離的開發模式中前後端開發人員的數據介面對接工作。基於Swagger的工作原理,API的輸入輸出都需使用強類型的數據類型,Swagger才能發揮更好的作用,而OSharp框架通過AutoMapperProjectTo對業務實體到輸出DTOIOutputDto提供了自動映射功能,能有效減輕後端開發中數據對象屬性映射的工作量。

界面展示

OSharp 的這個版本是基於Angular前端框架 NG-ALAIN 開發的,部分界面展示如下:

後臺主頁:

功能管理:

數據實體管理:


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 註冊Microsoft密鑰 sudo rpm -Uvh https://packages.microsoft.com/config/rhel/7/packages-microsoft-prod.rpm 安裝.NET SDK 其他版本請參照微軟官方,這裡僅本人記錄。 https://dotnet.mi ...
  • TimeSpan的屬性和方法: 下麵的列表涵蓋了其中的一部分: 屬性: Add:與另一個TimeSpan值相加。 Days: 返回用天數計算的TimeSpan值。Hours: 返回用小時計算的TimeSpan值Milliseconds: 返回用毫秒計算的TimeSpan值。Minutes: 返回用分 ...
  • 視頻與PR:https://github.com/terrajobst/minsk/blob/master/docs/episode-02.md 作者是 Immo Landwerth(https://twitter.com/terrajobst),微軟 .NET 團隊的項目經理。 這一集的主要內容: ...
  • 前言我們之前研究過為什麼Unity的UI可以合批,是因為使用了相同的材質進行渲染,UI上不同圖片渲染是通過把圖片打成一張圖集後,使用Image組件對頂點填充了不同的UV值實現的。那麼有沒有什麼辦法可以讓3D的物體也像UI一樣,使用相同材質,但是可以表現出不一樣的樣子呢(比如顏色/位置等)?我們知道u ...
  • 一、 "Lambda 表達式"(lambda expression)是一個匿名函數,Lambda表達式基於數學中的λ演算得名,直接對應於其中的lambda抽象(lambda abstraction),是一個匿名函數,即沒有函數名的函數。Lambda表達式可以表示閉包(註意和數學傳統意義上的不同)。 ...
  • 自從.net core出現的時候,就知道c#的代碼居然能後運行到Linux上面,以前都沒想過居然這麼牛逼,所以很早就想學習怎樣部署上去,直到現在.net core都出現2.2了,才花時間去接觸,說實話,第一次接觸,太多的坑在這個上邊了,途中還走了很多彎路...現在把最後總結的流程簡單的記錄下來 一 ...
  • 最近做了一個查錯工具,運用了winform文件操作的知識,做了幾點總結,不全面,只總結了幾點項目里用過的知識(關於以下內容只是個人的理解和總結,不對的地方請多指教,有補充的可以評論留言大家一起討論學習)。 一:基礎知識 1.根據文件路徑得到文件夾對象:DirectoryInfo di = new D ...
  • 前文 本文只對筆者學習掌握的一般的拖動問題的實現方法進行整理和討論,包括視窗、控制項等內容的拖動。 希望本文能對一些尋找此問題的解決方法的人和一些剛入門的人一些幫助。筆者為WPF初學者,能得到各位的批評指正也是榮幸萬分。有更好更多的方法,勞煩與我分享,不勝感激。 本文的各種實現方法其他博客中也都有提及 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...