[开源]OSharpNS - .net core 快速开发框架 - 简介

OSharpNS全称OSharp Framework with .NetStandard2.0,是一个基于.NetStandard2.0开发的一个.NetCore快速开发框架。这个框架使用最新稳定版的.NetCore SDK(当前是.NET Core 2.2),对 AspNetCore 的配置、依赖注入、日志、缓存、实体框架、Mvc(WebApi)、身份认证、权限授权等模块进行更高一级的自动化封装,并规范了一套业务实现的代码结构与操作流程,使 .Net Core 框架更易于应用到实际项目开发中。

  • 开源地址:https://github.com/i66soft/osharp

  • 官方示例:https://www.osharp.org

  • 文档中心:https://docs.osharp.org

  • VS 插件:https://marketplace.visualstudio.com/items?itemName=LiuliuSoft.osharp

框架的工程组织结构如下:

640?wx_fmt=png

各工程简介

  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

1. 模块化的组件系统设计

OSharp框架设计了一个模块(Pack)系统,每个Pack以一个实现了模块基类(OsharpPack)的类作为入口,这个类完成本模块的服务添加(AddService)和模块初始化工作(UserPack)。一个Pack是一系列高内聚低耦合的服务组织,对象提供一个功能(如缓存功能,日志功能,数据存储功能)或完成一组业务处理(如身份认证,权限授权)。

一个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;
}
}

当前框架的模块组成如下图:

OSharp核心模块OSharp.Core.Packs.OsharpCorePackCore
依赖注入模块OSharp.Dependency.DependencyPackCore
Log4Net模块OSharp.Log4Net.Log4NetPackCore
AspNetCore模块OSharp.AspNetCore.AspNetCorePackCore
事件总线模块OSharp.EventBuses.EventBusPackCore
AutoMapper模块OSharp.AutoMapper.AutoMapperPackFramework
Hangfire后台任务模块OSharp.Hangfire.HangfirePackFramework
Redis模块OSharp.Redis.RedisPackFramework
MySqlEntityFrameworkCore模块OSharp.Entity.MySql.MySqlEntityFrameworkCorePackFramework
SqliteEntityFrameworkCore模块OSharp.Entity.Sqlite.SqliteEntityFrameworkCorePackFramework
SqlServerEntityFrameworkCore模块OSharp.Entity.SqlServer.SqlServerEntityFrameworkCorePackFramework
SqlServer-DefaultDbContext迁移模块OSharp.Site.Web.Startups.SqlServerDefaultDbContextMigrationPackFramework
MVC功能点模块OSharp.AspNetCore.Mvc.MvcFunctionPackApplication
数据实体模块OSharp.Core.EntityInfos.EntityInfoPackApplication
系统信息模块OSharp.Systems.SystemPackApplication
身份认证模块OSharp.Site.Identity.IdentityPackApplication
MVC模块OSharp.Site.Web.Startups.AspNetCoreMvcPackApplication
SignalR模块OSharp.Site.Web.Startups.SignalRPackApplication
权限安全模块OSharp.Site.Security.SecurityPackApplication
代码生成模块OSharp.Site.Web.Startups.CodeGeneratorPackApplication
SwaggerApi模块OSharp.Swagger.SwaggerPackApplication
审计模块OSharp.Site.Systems.AuditPackApplication

2. 自动化的依赖注入注册机制

空接口标注方式

框架定义了ISingletonDependency,IScopeDependency,ITransientDependency 三个空接口,对应着依赖注入的ServiceLifetime.SingletonServiceLifetime.ScopedServiceLifetime.Transient三种服务生命周期。按需要实现了空接口的服务类,将在系统初始化时被检索出来进行实现类与其接口的依赖注入服务注册。

空接口的标注方式,统一使用TryAdd来进行注入

一个示例代码如下:

public XXXService : IXXXService, ISingletonDependency
{ }

这个示例代码将在系统初始化时执行如下的注入行为:


services.TryAdd(new ServiceDescriptor(typeof(IXXXService),
typeof(XXXService), ServiceLifetime.Singleton));

DependencyAttribute特性标注方式

空接口的标注方式,只能指定服务的注册生命周期类型,而不能进行更多的配置,因此增加了[Dependency]特性的标注方式。通过[Dependency],可以进行 服务注册的生命周期类型、是否是TryAdd方式注册、是否替换已存在的服务、是否注册自身 等配置,使用起来更加灵活方便。
一个示例代码如下:

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

这个示例代码将在系统初始化时执行如下的注入行为:


services.Replace(new ServiceDescriptor(typeof(IXXXService),
typeof(XXXService), ServiceLifetime.Singleton));

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,一个模块可由一个或多个功能点构成,模块是对外开放的特殊功能点,是进行 角色/用户功能授权 的单位。把一个模块授权给角色,角色即拥有了一个或多个功能点的操作权限。

功能权限授权流程

功能权限验证流程

  • 系统初始化时,根据每个角色Role分配到的模块Module,自动初始化每个 角色 Role - Function[]的权限对应关系并缓存

  • 游客进入系统时,自动请求所有可匿名访问FunctionAccessType.Anonymouse的模块信息并缓存到浏览器,浏览器根据这个缓存的模块集合,对前端页面的各个操作点(菜单/按钮)进行是否隐藏/禁用的状态控制

  • 注册用户登录系统时,自动请求所有可执行(包括匿名的FunctionAccessType.Anonymouse、登录的FunctionAccessType.Logined、指定角色的FunctionAccessType.RoleLimit)的模块信息并缓存到浏览器,浏览器根据这个缓存的模块集合,对前端页面的各个操作点(菜单/按钮)进行是否隐藏/禁用的状态控制

640?wx_fmt=png

  • 用户User执行一个功能点Function时,验证流程如下:

    • 用户未登录,返回401

    • 逐个验证用户拥有的角色Role,根据角色从缓存中取出Role-Function[]缓存项,Function[]包含要验证的功能点时,验证通过

    • 由分配给用户的模块Module对应的功能点,获取到User-Function[](并缓存),Function[]包含要验证的功能点时,验证通过

    • 验证未通过,返回403

    • 功能点不存在时,返回404

    • 功能点被锁定时,返回423

    • 功能点可访问性为匿名FunctionAccessType.Anonymouse验证通过

    • 功能点可访问性为需要登录FunctionAccessType.Logined时,用户未登录,返回401,已登录则验证通过

    • 功能点可访问性为需要登录FunctionAccessType.RoleLimit时,流程如下:

640?wx_fmt=png

数据权限授权流程

  • 基于 角色Role-实体EntityInfo 的一一对应关系,配置指定角色对指定数据实体的数据查询筛选规则,并持久化到数据库中

  • 数据查询筛选规则组成为 条件组FilterGroup和条件FilterRule,一个条件组 FilterGroup 包含 一个或多个条件 FilterRule 和 一个或多个 条件组FilterGroup,这样就实现了条件组和条件的无限嵌套,能满足绝大多数数据筛选规则的组装需要,如下图:

640?wx_fmt=png

数据权限验证流程

  • 系统初始化时,将所有角色-实体的数据筛选规则缓存到内存中

  • 进行数据查询的时候,根据当前用户的所有角色 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 开发的,部分界面展示如下:

后台主页:
640?wx_fmt=png

功能管理:
640?wx_fmt=png

数据实体管理:
640?wx_fmt=png

原文地址:https://www.cnblogs.com/guomingfeng/p/osharpns-intro.html

.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com 
640?wx_fmt=jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/316040.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2019年了,C#发展的怎么样了呢?

C# 8.0我估计大多数程序员对于C# 5.0之后的改进都没有什么太多的认知&#xff0c;的确从C# 5.0开始C#已经没什么太多东西可以从其他语言借鉴&#xff0c;Anders的重心也开始逐步倾斜到TypeScript&#xff0c;所以从5.0引入async之后C#语言发展速度开始减缓了。C#6引入了大量的语…

微软宣布新命令行工具 Windows Terminal 和 WSL2

微软在 Build 2019 已经宣布推出名为Windows Terminal的新款命令行工具 , 这款工具可以访问多种环境的中心位置。例如可以直接访问PowerShell、CMD.EXE、Windows Linux子系统等等&#xff0c;开发者使用此工具可以简化工作。这款新工具支持多选项卡同时连接多个环境或服务器&a…

CF1305E Kuroni and the Score Distribution

CF1305E Kuroni and the Score Distribution 题意&#xff1a; 题解&#xff1a; 一开始想这个题&#xff0c;想法是一开始顺着填1&#xff0c;2&#xff0c;3…然后多删少补 如果1&#xff0c;2&#xff0c;3&#xff0c;4…这样顺延的填&#xff0c;对于akka_{k}kak​k可以…

微软 Build 2019:Windows 10 隐退,IE 重生,Azure 成主角

019 年 5 月 6 日&#xff0c;一年一度的微软 Build 开发者大会正式到来。作为本次大会最为重磅的 Keynote 环节&#xff0c;微软 CEO Satya Nadella 的开场演讲无疑展示了这家巨头对于未来科技发展趋势的洞察和判断&#xff0c;并且也能够让人更加清晰地看到微软在 Azure 云计…

普通人看Build 2019 值得留心的亮点有哪些?

一场Keynote下来&#xff0c;是不是对纳德拉那套“Azure&#xff0c;azure&#xff0c;azure”&#xff0c;云云云的套路感觉有些乏味呢&#xff1f;当然这也不是你的问题&#xff0c;原本Build大会就是为开发者而设的&#xff0c;将近两个小时下来没看到什么能让自己眼前一亮的…

Build 2019:微软正式宣布 .NET 5

今天&#xff0c;我们宣布 .NET Core 3.0 之后的下一个版本将是 .NET 5 。这将是 .NET 系列的下一个重要版本。将来只会有一个 .NET &#xff0c;您将能够使用它来开发 Windows&#xff0c;Linux&#xff0c;macOS&#xff0c;iOS&#xff0c;Android&#xff0c;tvOS&#xff…

LGV定理

老早就听说&#xff0c;一直没学&#xff0c;今天遇到一个LGV比较裸的题&#xff0c;特地学习一下 选自oi-wiki 定义&#xff1a; e(u,v)表示u到v这条路径上所有边的边权之积(路径计数时&#xff0c;可以将边权都设为1),很多路径统计问题就是用到这一点 引理&#xff1a; 答案…

2019牛客多校Monotonic Matrix

Monotonic Matrix 题意&#xff1a; 问有多少个n * m的矩阵A满足一下情况&#xff1a;答案mod 1e97 矩阵A的所有元素∈{0,1,2}Ai,j<Ai1,jA_{i,j}<A_{i1,j}Ai,j​<Ai1,j​Ai,j<Ai,j1A_{i,j}<A_{i,j1}Ai,j​<Ai,j1​ 题解&#xff1a; 我们先看看这个式子…

WPF框架教程 | 从0到1:使用Caliburn.Micro(WPF和MVVM)开发简单的计算器

之前时间一直在使用Caliburn.Micro这种应用了MVVM模式的WPF框架做开发&#xff0c;是时候总结一下了。Caliburn.Micro(https://blog.csdn.net/lzuacm/article/details/78886436)是一个轻量级的WPF框架&#xff0c;简化了WPF中的不少用法&#xff0c;推荐做WPF开发时优先使用。真…

微软全都要!Win10引入真Linux内核

继将 Bash shell、原生 OpenSSH、WSL 引入 Windows&#xff0c;以及在微软商店提供 Ubuntu、SUSE Linux 和 Fedora 等发行版&#xff0c;正在举办的 Microsoft Build 2019 大会上&#xff0c;微软又宣布了一个重大的决定 —— 将完整的 Linux 内核引入 Windows 10。按照微软的说…

Kafka基本知识整理

首先Kafka是一个分布式消息队列中间件&#xff0c;Apache顶级项目&#xff0c;https://kafka.apache.org/ 高性能、持久化、多副本备份、横向扩展。生产者Producer往队列里发送消息&#xff0c;消费者Consumer从队列里消费消息&#xff0c;然后进行业务逻辑。应用场景主要有&…

牛客练习赛89——牛牛小数点(未解决)

牛牛小数点 题意&#xff1a; 题解&#xff1a; 本题先说结论&#xff1a; 对于一个数x2a∗5b∗px2^a*5^b*px2a∗5b∗p 如果p1,也就是质因子只有2和5&#xff0c;则x是不循环小数&#xff0c;即f(x)0如果p!1,则x是循环的&#xff0c;且循环开始于小数点后第1max{p2,p5p_{2},…

针对.NET Core, Xamarin以及.NET的自动类型安全Rest库: Refit

本文大部分内容是针对Refit官网的翻译。官网地址&#xff1a; https://github.com/reactiveui/refitRefit是一个类似于Retrofit的Restful Api库&#xff0c;使用它&#xff0c;你可以将你的Restful Api定义在接口中。例如&#xff1a;public interface IGitHubApi { [Get(&quo…

用ProGet搭建本地私有NuGet仓库

搭建ProGet下载官网下载Windows版本的Inedo Hub &#xff08;https://inedo.com/proget/download&#xff09;下载下来的软件名&#xff1a; ProGetInstaller.exe安装点击ProGetInstaller.exe&#xff0c;出现如下安装界面Registration 选项选择 Free ;SQL Sever 选项选择 Spec…

CQRS架构下Equinox开源项目分析

一.DDD分层架构介绍本篇分析CQRS架构下的Equinox开源项目。该项目在github上star占有2.4k。便决定分析Equinox项目来学习下CQRS架构。再讲CQRS架构时&#xff0c;先简述下DDD风格&#xff0c;在DDD分层架构中&#xff0c;一般包含表现层、应用程序层(应用服务层)、领域层(领域服…

仿B站(一) 目的分析以及创建 WebAPI + Angular7 项目

前言&#xff1a;本系列文章主要为对所学 Angular 框架的一次微小的实践&#xff0c;对 b站页面作简单的模仿。本系列文章主要参考资料&#xff1a;微软文档&#xff1a;    https://docs.microsoft.com/zh-cn/aspnet/core/getting-started/?viewaspnetcore-2.1&tabsw…

Mac中搭建Kubernetes

Kubernetes是Google和RadHat公司共同主导的开源容器编排项目&#xff0c;功能非常强大&#xff0c;也非常的火热和流行&#xff0c;但同时里面也有很多的概念和名词需要我们去学习和理解。学习任何一个技术先需要把基础环境搭建起来&#xff0c;本篇就介绍怎样在Mac中启动单节点…

树莓派也跑Docker和.NET Core

树莓派就是一个卡片大小的迷你电脑。有了电脑&#xff0c;我们当然得先安装系统。系统下载https://www.raspberrypi.org/downloads/raspbian/ &#xff0c;我选择的Raspbian Stretch Lite&#xff0c;不带界面的最小安装。下载win32diskimager&#xff08;烧录系统&#xff09;…

开源]OSharpNS 步步为营系列 - 1. 业务模块设计

OSharpNS全称OSharp Framework with .NetStandard2.0&#xff0c;是一个基于.NetStandard2.0开发的一个.NetCore快速开发框架。这个框架使用最新稳定版的.NetCore SDK&#xff08;当前是.NET Core 2.2&#xff09;&#xff0c;对 AspNetCore 的配置、依赖注入、日志、缓存、实体…

CF1479A Searching Local Minimum

CF1479A Searching Local Minimum 题意&#xff1a; 题解&#xff1a; 先说结论&#xff1a; 若l&#xff0c;r满足&#xff1a; al−1>al,ar<ar1a_{l-1}>a_{l},a_{r}<a_{r1}al−1​>al​,ar​<ar1​al,al1,....,ara_{l},a_{l1},....,a_{r}al​,al1​,....…