[开源]OSharpNS - .net core 快速开发框架 - 简介
OSharpNS全稱OSharp Framework with .NetStandard2.0,是一個(gè)基于.NetStandard2.0開發(fā)的一個(gè).NetCore快速開發(fā)框架。這個(gè)框架使用最新穩(wěn)定版的.NetCore SDK(當(dāng)前是.NET Core 2.2),對(duì) AspNetCore 的配置、依賴注入、日志、緩存、實(shí)體框架、Mvc(WebApi)、身份認(rèn)證、權(quán)限授權(quán)等模塊進(jìn)行更高一級(jí)的自動(dòng)化封裝,并規(guī)范了一套業(yè)務(wù)實(shí)現(xiàn)的代碼結(jié)構(gòu)與操作流程,使 .Net Core 框架更易于應(yīng)用到實(shí)際項(xiàng)目開發(fā)中。
開源地址:https://github.com/i66soft/osharp
官方示例:https://www.osharp.org
文檔中心:https://docs.osharp.org
VS 插件:https://marketplace.visualstudio.com/items?itemName=LiuliuSoft.osharp
框架的工程組織結(jié)構(gòu)如下:
各工程簡(jiǎn)介
OSharp【框架核心組件】:框架的核心組件,包含一系列快速開發(fā)中經(jīng)常用到的Utility輔助工具功能,框架各個(gè)組件的核心接口定義,部分核心功能的實(shí)現(xiàn)
OSharp.AspNetCore【AspNetCore組件】:AspNetCore組件,提供AspNetCore的服務(wù)端功能的封裝
OSharp.AutoMapper【對(duì)象映射組件】:AutoMapper 對(duì)象映射組件,封裝基于AutoMapper的對(duì)象映射實(shí)現(xiàn)
OSharp.EntityFrameworkCore【EFCore 數(shù)據(jù)組件】:EFCore數(shù)據(jù)訪問(wèn)組件,封裝EntityFrameworkCore數(shù)據(jù)訪問(wèn)功能的實(shí)現(xiàn)
OSharp.EntityFrameworkCore.MySql【EFCore MySql 數(shù)據(jù)組件】:EFCore MySql數(shù)據(jù)訪問(wèn)組件,封裝MySql的EntityFrameworkCore數(shù)據(jù)訪問(wèn)功能的實(shí)現(xiàn)
OSharp.EntityFrameworkCore.SqlServer【EFCore SqlServer 數(shù)據(jù)組件】:EFCore SqlServer數(shù)據(jù)訪問(wèn)組件,封裝SqlServer的EntityFrameworkCore數(shù)據(jù)訪問(wèn)功能的實(shí)現(xiàn)
OSharp.EntityFrameworkCore.Sqlite【EFCore Sqlite 數(shù)據(jù)組件】:EFCore Sqlite數(shù)據(jù)訪問(wèn)組件,封裝Sqlite的EntityFrameworkCore數(shù)據(jù)訪問(wèn)功能的實(shí)現(xiàn)
OSharp.EntityFrameworkCore.PostgreSql【EFCore PostgreSql 數(shù)據(jù)組件】:EFCore PostgreSql數(shù)據(jù)訪問(wèn)組件,封裝PostgreSql的EntityFrameworkCore數(shù)據(jù)訪問(wèn)功能的實(shí)現(xiàn)
OSharp.EntityFrameworkCore.Oracle【EFCore PostgreSql 數(shù)據(jù)組件】:EFCore Oracle數(shù)據(jù)訪問(wèn)組件,封裝Oracle的EntityFrameworkCore數(shù)據(jù)訪問(wèn)功能的實(shí)現(xiàn)
OSharp.Permissions【權(quán)限組件】:使用AspNetCore的Identity為基礎(chǔ)實(shí)現(xiàn)身份認(rèn)證的封裝,以Security為基礎(chǔ)實(shí)現(xiàn)以角色-功能、用戶-功能的功能權(quán)限實(shí)現(xiàn),以角色-數(shù)據(jù),用戶-數(shù)據(jù)的數(shù)據(jù)權(quán)限的封裝
OSharp.Log4Net【日志組件】:基于Log4Net的日志記錄組件
OSharp.Redis【緩存組件】:基于Redis的分布式緩存客戶端組件
OSharp.Hangfire【后臺(tái)任務(wù)組件】:封裝基于Hangfire后臺(tái)任務(wù)的服務(wù)端實(shí)現(xiàn)
OSharp.MiniProfiler【MiniProfiler組件】:基于MiniProfiler實(shí)現(xiàn)的性能監(jiān)測(cè)組件
OSharp.Swagger【SwaggerAPI組件】:基于Swagger生成MVC的Action的API測(cè)試接口信息
OSharp.Exceptionless【Exceptionless分布式日志組件】:封裝基于Exceptionless 分布式日志記錄實(shí)現(xiàn)
Nuget Packages
1. 模塊化的組件系統(tǒng)設(shè)計(jì)
OSharp框架設(shè)計(jì)了一個(gè)模塊(Pack)系統(tǒng),每個(gè)Pack以一個(gè)實(shí)現(xiàn)了模塊基類(OsharpPack)的類作為入口,這個(gè)類完成本模塊的服務(wù)添加(AddService)和模塊初始化工作(UserPack)。一個(gè)Pack是一系列高內(nèi)聚低耦合的服務(wù)組織,對(duì)象提供一個(gè)功能(如緩存功能,日志功能,數(shù)據(jù)存儲(chǔ)功能)或完成一組業(yè)務(wù)處理(如身份認(rèn)證,權(quán)限授權(quán))。
一個(gè)Pack入口類的代碼如下:
public class XXXPack : OsharpPack{
public override PackLevel Level => PackLevel.Core;
public override int Order => 2;
public override IServiceCollection AddServices(IServiceCollection services)
{
return services;
}
public override void UsePack(IServiceProvider provider)
{
IsEnabled = true;
}
}
當(dāng)前框架的模塊組成如下圖:
| 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后臺(tái)任務(wù)模塊 | 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功能點(diǎn)模塊 | OSharp.AspNetCore.Mvc.MvcFunctionPack | Application |
| 數(shù)據(jù)實(shí)體模塊 | OSharp.Core.EntityInfos.EntityInfoPack | Application |
| 系統(tǒng)信息模塊 | OSharp.Systems.SystemPack | Application |
| 身份認(rèn)證模塊 | OSharp.Site.Identity.IdentityPack | Application |
| MVC模塊 | OSharp.Site.Web.Startups.AspNetCoreMvcPack | Application |
| SignalR模塊 | OSharp.Site.Web.Startups.SignalRPack | Application |
| 權(quán)限安全模塊 | OSharp.Site.Security.SecurityPack | Application |
| 代碼生成模塊 | OSharp.Site.Web.Startups.CodeGeneratorPack | Application |
| SwaggerApi模塊 | OSharp.Swagger.SwaggerPack | Application |
| 審計(jì)模塊 | OSharp.Site.Systems.AuditPack | Application |
2. 自動(dòng)化的依賴注入注冊(cè)機(jī)制
空接口標(biāo)注方式
框架定義了ISingletonDependency,IScopeDependency,ITransientDependency?三個(gè)空接口,對(duì)應(yīng)著依賴注入的ServiceLifetime.Singleton、ServiceLifetime.Scoped、ServiceLifetime.Transient三種服務(wù)生命周期。按需要實(shí)現(xiàn)了空接口的服務(wù)類,將在系統(tǒng)初始化時(shí)被檢索出來(lái)進(jìn)行實(shí)現(xiàn)類與其接口的依賴注入服務(wù)注冊(cè)。
空接口的標(biāo)注方式,統(tǒng)一使用TryAdd來(lái)進(jìn)行注入
一個(gè)示例代碼如下:
public XXXService : IXXXService, ISingletonDependency{ }
這個(gè)示例代碼將在系統(tǒng)初始化時(shí)執(zhí)行如下的注入行為:
services.TryAdd(new ServiceDescriptor(typeof(IXXXService),
typeof(XXXService), ServiceLifetime.Singleton));
DependencyAttribute特性標(biāo)注方式
空接口的標(biāo)注方式,只能指定服務(wù)的注冊(cè)生命周期類型,而不能進(jìn)行更多的配置,因此增加了[Dependency]特性的標(biāo)注方式。通過(guò)[Dependency],可以進(jìn)行 服務(wù)注冊(cè)的生命周期類型、是否是TryAdd方式注冊(cè)、是否替換已存在的服務(wù)、是否注冊(cè)自身 等配置,使用起來(lái)更加靈活方便。
一個(gè)示例代碼如下:
public XXXService : IXXXService
{ }
這個(gè)示例代碼將在系統(tǒng)初始化時(shí)執(zhí)行如下的注入行為:
services.Replace(new ServiceDescriptor(typeof(IXXXService),
typeof(XXXService), ServiceLifetime.Singleton));
services.TryAdd(new ServiceDescriptor(typeof(XXXService),
typeof(XXXService), ServiceLifetime.Singleton));
自動(dòng)化的注冊(cè)機(jī)制
系統(tǒng)初始化時(shí),通過(guò)反射檢索程序集的方式,檢索出所有服務(wù)類型(ServiceType)與服務(wù)實(shí)現(xiàn)(ImplementationType)及生命周期類型(ServiceLifetime)的相關(guān)數(shù)據(jù),將依賴注入服務(wù)注冊(cè)到服務(wù)容器ServiceCollection中。
3. UnitOfWork-Repository模式,EFCore上下文動(dòng)態(tài)構(gòu)建
數(shù)據(jù)模塊使用了UnitOfWork-Repository的模式來(lái)設(shè)計(jì),設(shè)計(jì)了一個(gè)泛型的實(shí)體倉(cāng)儲(chǔ)接口IRepository<TEntity,TKey>,避免每個(gè)實(shí)體都需實(shí)現(xiàn)一個(gè)倉(cāng)儲(chǔ)的繁瑣操作。設(shè)計(jì)了IUnitOfWorkManager接口來(lái)管理多數(shù)據(jù)庫(kù)連接事務(wù),每個(gè)IUnitOfWork,通過(guò)IUnitOfWork模式管理DbContext的創(chuàng)建與緩存,使同連接對(duì)象的多個(gè)上下文共享事務(wù),達(dá)到多上下文的事務(wù)同步能力。
基于MVC的ActionFilter的UnitOfWorkAttribute AOP 事務(wù)自動(dòng)提交,業(yè)務(wù)中不再需要關(guān)心事務(wù)的生命周期。
系統(tǒng)初始化時(shí),通過(guò)反射檢索程序集的方式,檢索出各個(gè)實(shí)體與上下文的映射關(guān)系,向上下文中動(dòng)態(tài)添加實(shí)體類來(lái)構(gòu)建上下文類型,以達(dá)到上下文類型與業(yè)務(wù)實(shí)體解耦的目的。通過(guò)統(tǒng)一基類EntityTypeConfigurationBase<TEntity, TKey>的FluentAPI實(shí)體映射,自由配置每個(gè)實(shí)體與數(shù)據(jù)庫(kù)映射的每一個(gè)細(xì)節(jié)。
4. 基于AspNetCore的Identity的身份認(rèn)證設(shè)計(jì)系統(tǒng)
使用AspNetCore原生的用戶身份認(rèn)證框架,身份認(rèn)證相關(guān)操作統(tǒng)一使用UserManager
,RoleMamanger兩個(gè)入口,保持了原生Identity的體系強(qiáng)大性與功能完整性。重新設(shè)計(jì)了用戶存儲(chǔ)UserStore和角色存儲(chǔ)RoleStore,使用框架內(nèi)設(shè)計(jì)的IRepository<TEntity,TKey>數(shù)據(jù)倉(cāng)儲(chǔ)接口來(lái)實(shí)現(xiàn)對(duì)數(shù)據(jù)的倉(cāng)儲(chǔ)操作,使Identity身份認(rèn)證系統(tǒng)與框架完美結(jié)合,避免了使用官方的Microsoft.AspNetCore.Identity.EntityFrameworkCore造成多個(gè)上下文或者被強(qiáng)制使用Identity上下文作為系統(tǒng)數(shù)據(jù)上下文來(lái)實(shí)現(xiàn)業(yè)務(wù)造成的尷尬。
5. 設(shè)計(jì)了一個(gè)強(qiáng)大的功能權(quán)限與數(shù)據(jù)權(quán)限的授權(quán)體系
從底層開始,自動(dòng)收集了系統(tǒng)的所有業(yè)務(wù)點(diǎn)(IFunction)和數(shù)據(jù)實(shí)體(IEntityInfo),用于對(duì)系統(tǒng)的功能權(quán)限、數(shù)據(jù)權(quán)限、數(shù)據(jù)緩存、操作審計(jì) 等實(shí)用功能提供數(shù)據(jù)支持。
功能點(diǎn)Function與MVC的Area/Controller/Action一一對(duì)應(yīng),是功能權(quán)限的最小驗(yàn)證單位,基于功能點(diǎn),可以配置:
功能訪問(wèn)類型(匿名訪問(wèn)、登錄訪問(wèn)、限定角色訪問(wèn))
功能的數(shù)據(jù)緩存時(shí)間及緩存過(guò)期方式(絕對(duì)過(guò)期、相對(duì)過(guò)期)
是否開啟操作審計(jì)(XXX人員XXX時(shí)間做了XXX操作)
是否開啟數(shù)據(jù)審計(jì)(操作引起的數(shù)據(jù)變化詳情(新增、更新、刪除))
數(shù)據(jù)實(shí)體EntityInfo與數(shù)據(jù)庫(kù)中的各個(gè)數(shù)據(jù)實(shí)體一一對(duì)應(yīng),基于數(shù)據(jù)實(shí)體,可以配置:
是否開啟數(shù)據(jù)審計(jì),與Function上的同配置級(jí)別不同,如果指定實(shí)體未開放審計(jì),則不審計(jì)當(dāng)前實(shí)體。
實(shí)現(xiàn)數(shù)據(jù)權(quán)限,基于角色 - 實(shí)體的數(shù)據(jù)權(quán)限設(shè)計(jì),通過(guò)配置實(shí)現(xiàn) XXX角色是否有權(quán)訪問(wèn)XXX實(shí)體數(shù)據(jù)(的XX屬性)
設(shè)計(jì)了一個(gè)樹形結(jié)構(gòu)的業(yè)務(wù)模塊體系(Module),對(duì)應(yīng)著后端向前端(菜單/按鈕)開放的API,一個(gè)模塊可由一個(gè)或多個(gè)功能點(diǎn)構(gòu)成,模塊是對(duì)外開放的特殊功能點(diǎn),是進(jìn)行?角色/用戶功能授權(quán)?的單位。把一個(gè)模塊授權(quán)給角色,角色即擁有了一個(gè)或多個(gè)功能點(diǎn)的操作權(quán)限。
功能權(quán)限授權(quán)流程
功能權(quán)限驗(yàn)證流程
系統(tǒng)初始化時(shí),根據(jù)每個(gè)角色Role分配到的模塊Module,自動(dòng)初始化每個(gè)?角色 Role - Function[]的權(quán)限對(duì)應(yīng)關(guān)系并緩存
游客進(jìn)入系統(tǒng)時(shí),自動(dòng)請(qǐng)求所有可匿名訪問(wèn)FunctionAccessType.Anonymouse的模塊信息并緩存到瀏覽器,瀏覽器根據(jù)這個(gè)緩存的模塊集合,對(duì)前端頁(yè)面的各個(gè)操作點(diǎn)(菜單/按鈕)進(jìn)行是否隱藏/禁用的狀態(tài)控制
注冊(cè)用戶登錄系統(tǒng)時(shí),自動(dòng)請(qǐng)求所有可執(zhí)行(包括匿名的FunctionAccessType.Anonymouse、登錄的FunctionAccessType.Logined、指定角色的FunctionAccessType.RoleLimit)的模塊信息并緩存到瀏覽器,瀏覽器根據(jù)這個(gè)緩存的模塊集合,對(duì)前端頁(yè)面的各個(gè)操作點(diǎn)(菜單/按鈕)進(jìn)行是否隱藏/禁用的狀態(tài)控制
用戶User執(zhí)行一個(gè)功能點(diǎn)Function時(shí),驗(yàn)證流程如下:
用戶未登錄,返回401
逐個(gè)驗(yàn)證用戶擁有的角色Role,根據(jù)角色從緩存中取出Role-Function[]緩存項(xiàng),Function[]包含要驗(yàn)證的功能點(diǎn)時(shí),驗(yàn)證通過(guò)
由分配給用戶的模塊Module對(duì)應(yīng)的功能點(diǎn),獲取到User-Function[](并緩存),Function[]包含要驗(yàn)證的功能點(diǎn)時(shí),驗(yàn)證通過(guò)
驗(yàn)證未通過(guò),返回403
功能點(diǎn)不存在時(shí),返回404
功能點(diǎn)被鎖定時(shí),返回423
功能點(diǎn)可訪問(wèn)性為匿名FunctionAccessType.Anonymouse驗(yàn)證通過(guò)
功能點(diǎn)可訪問(wèn)性為需要登錄FunctionAccessType.Logined時(shí),用戶未登錄,返回401,已登錄則驗(yàn)證通過(guò)
功能點(diǎn)可訪問(wèn)性為需要登錄FunctionAccessType.RoleLimit時(shí),流程如下:
數(shù)據(jù)權(quán)限授權(quán)流程
基于 角色Role-實(shí)體EntityInfo?的一一對(duì)應(yīng)關(guān)系,配置指定角色對(duì)指定數(shù)據(jù)實(shí)體的數(shù)據(jù)查詢篩選規(guī)則,并持久化到數(shù)據(jù)庫(kù)中
數(shù)據(jù)查詢篩選規(guī)則組成為 條件組FilterGroup和條件FilterRule,一個(gè)條件組?FilterGroup?包含 一個(gè)或多個(gè)條件?FilterRule?和 一個(gè)或多個(gè) 條件組FilterGroup,這樣就實(shí)現(xiàn)了條件組和條件的無(wú)限嵌套,能滿足絕大多數(shù)數(shù)據(jù)篩選規(guī)則的組裝需要,如下圖:
數(shù)據(jù)權(quán)限驗(yàn)證流程
系統(tǒng)初始化時(shí),將所有角色-實(shí)體的數(shù)據(jù)篩選規(guī)則緩存到內(nèi)存中
進(jìn)行數(shù)據(jù)查詢的時(shí)候,根據(jù)當(dāng)前用戶的所有角色 Role和要查詢的實(shí)體 EntityInfo,查找出所有配置的數(shù)據(jù)篩選規(guī)則FilterGroup,轉(zhuǎn)換為數(shù)據(jù)查詢表達(dá)式Expression<Func<TEntity,bool>>,各個(gè)角色的表達(dá)式之間使用Or邏輯進(jìn)行組合
將以上生成的數(shù)據(jù)權(quán)限數(shù)據(jù)查詢表達(dá)式,使用And邏輯組合到用戶的提交的查詢條件生成的表達(dá)式中,得到最終的數(shù)據(jù)查詢表達(dá)式,提交到數(shù)據(jù)庫(kù)中進(jìn)行數(shù)據(jù)查詢,從而獲得數(shù)據(jù)權(quán)限限制下的合法數(shù)據(jù)
6. 集成 Swagger 后端API文檔系統(tǒng)
OSharp 快速啟動(dòng)模板的開發(fā)模式,集成了Swagger?API 文檔生成組件,更方便了前后端分離的開發(fā)模式中前后端開發(fā)人員的數(shù)據(jù)接口對(duì)接工作。基于Swagger的工作原理,API的輸入輸出都需使用強(qiáng)類型的數(shù)據(jù)類型,Swagger才能發(fā)揮更好的作用,而OSharp框架通過(guò)AutoMapper的ProjectTo對(duì)業(yè)務(wù)實(shí)體到輸出DTOIOutputDto提供了自動(dòng)映射功能,能有效減輕后端開發(fā)中數(shù)據(jù)對(duì)象屬性映射的工作量。
OSharp 的這個(gè)版本是基于Angular前端框架 NG-ALAIN 開發(fā)的,部分界面展示如下:
后臺(tái)主頁(yè):
功能管理:
數(shù)據(jù)實(shí)體管理:
原文地址:https://www.cnblogs.com/guomingfeng/p/osharpns-intro.html
.NET社區(qū)新聞,深度好文,歡迎訪問(wèn)公眾號(hào)文章匯總?http://www.csharpkit.com?
總結(jié)
以上是生活随笔為你收集整理的[开源]OSharpNS - .net core 快速开发框架 - 简介的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 一篇短文带您了解一下EasyCachin
- 下一篇: Web 版 VS Code (Visua