【开源】OSharpNS,轻量级.net core快速开发框架发布

OSharpNS简介

OSharp Framework with .NetStandard2.0(OSharpNS)是OSharp的以.NetStandard2.0为目标框架,在AspNetCore的现有组件 Microsoft.Extensions.DependencyInjectionMicrosoft.Extensions.Configuration
Microsoft.Extensions.LoggingMicrosoft.Extensions.CachingMicrosoft.EntityFrameworkCore等 上进行构建的快速开发框架。

框架目标人群

本框架适用于中小型项目,一(两)年以上开发经验,对依赖注入,ORM,缓存,日志,发布订阅模式有一定理解的开发人员

框架组件组织

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.Permissions【权限组件】:使用AspNetCore的Identity为基础实现身份认证的封装,以Security为基础实现以角色-功能、用户-功能的功能权限实现,以角色-数据,用户-数据的数据权限的封装

OSharpNS特性

1. 模块化的组件设计

框架设计了一个模块(Pack)的系统,所有实现了模块基类(OsharpPack)的类都视为一个独立的模块,一个模块可以独立添加服务(AddServices),并可在初始化时应用服务(UsePack)进行模块初始化。

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

框架定义了ISingletonDependencyIScopeDependencyITransientDependency三个空接口对应DependencyInjection中的三种服务生命周期,系统初始化时,通过反射检索程序集的方式,检索出所有服务类型(ServiceType)与服务实现(ImplementationType)及生命周期类型(ServiceLifetime)的相关数据,对依赖注入的ServiceCollection进行全自动初始化。

3. UnitOfWork-Repository模式,EFCore上下文动态构建

  1. 数据模块使用了UnitOfWork-Repository的模式来设计,设计了一个泛型的实体仓储接口IRepository<TEntity,TKey>,避免每个实体都需实现一个仓储的繁琐操作。设计了IUnitOfWork接口来管理事务,通过UnitOfWork模式管理DbContext的创建,使同上下文类型同数据库连接字符串的上下文使用相同DbConnection对象来创建,达到多上下文的事务同步能力。

  2. 基于MVC的ActionFilterUnitOfWorkAttribute AOP 事务自动提交,业务中不再需要关心事务的生命周期。

  3. 系统初始化时,通过反射检索程序集的方式,检索出各个实体与上下文的映射关系,向上下文中动态添加实体类来构建上下文类型,以达到上下文类型与业务实体解耦的目的。通过统一基类EntityTypeConfigurationBase<TEntity, TKey>的FluentAPI实体映射,自由配置每个实体与数据库映射的每一个细节。

4. 基于AspNetCore的Identity的身份认证设计系统

  1. 使用AspNetCore原生的用户身份认证框架,身份认证相关操作统一使用UserManager<TUser>RoleMamanger<TRole>两个入口,保持了原生Identity的体系强大性与功能完整性。

  2. 重新设计了用户存储UserStore和角色存储RoleStore,使用框架内设计的IRepository<TEntity,TKey>数据仓储接口来实现对数据的仓储操作,使Identity身份认证系统与框架完美结合,避免了使用官方的Microsoft.AspNetCore.Identity.EntityFrameworkCore造成多个上下文或者被强制使用Identity上下文作为系统数据上下文来实现业务造成的尴尬。

5. 设计了一个强大的功能权限与数据权限的授权体系

  1. 从底层开始,自动收集了系统的所有业务点(IFunction)和数据实体(IEntityInfo),用于对系统的功能权限、数据权限、数据缓存、操作审计 等实用功能提供数据支持。

  2. 功能点Function与MVC的Area/Controller/Action一一对应,是功能权限的最小验证单位,基于功能点,可以配置:

    1. 功能访问类型(匿名访问、登录访问、限定角色访问)

    2. 功能的数据缓存时间及缓存过期方式(绝对过期、相对过期)

    3. 是否开启操作审计(XXX人员XXX时间做了XXX操作)

    4. 是否开启数据审计(操作引起的数据变化详情(新增、更新、删除))

  3. 数据实体EntityInfo与数据库中的各个数据实体一一对应,基于数据实体,可以配置:

    1. 是否开启数据审计,与Function上的同配置级别不同,如果指定实体未开放审计,则不审计当前实体。

    2. [未实现] 数据权限,基于角色 - 实体的数据权限设计,通过配置实现 XXX角色是否有权访问XXX实体数据(的XX属性)

  4. 设计了一个树形结构的业务模块体系(Module),对应着后端向前端开放的操作点(菜单/按钮),一个模块可由一个或多个功能点构成,模块是对外开放的特殊功能点,是进行角色/用户功能授权的单位。把一个模块授权给角色,角色即拥有了一个或多个功能点的操作权限。

  5. 功能权限授权流程

    1. [自动] 创建MVC的各个Area/Controller/Action的功能点Function信息,存储到数据库

    2. [自动] 创建树形模块Module信息,并创建模块与功能点(一个或多个)的分配关系,存储到数据库

    3. 将模块Module分配给角色Role

    4. 将角色Role分配给用户User

    5. 可将模块Module分配给用户User,解决特权问题

    6. 这样用户即可根据拥有的角色,自动拥有模块对应着的所有功能点的功能权限

  6. 功能权限验证流程

    1. 功能点不存在时,返回404

    2. 功能点被锁定时,返回423

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

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

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

    6. 用户未登录,返回401

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

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

    9. 验证未通过,返回403

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

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

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

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

  7. [未实现] 数据权限授权流程

  8. [未实现] 数据权限验证流程

6. 集成 Swagger 后端API文档系统

OSharpNS 快速启动模板的开发模式,集成了Swagger API 文档生成组件,更方便了前后端分离的开发模式中前后端开发人员的数据接口对接工作。基于Swagger的工作原理,API的输入输出都需使用强类型的数据类型,Swagger才能发挥更好的作用,而OSharpNS框架通过AutoMapperProjectTo对业务实体到输出DTOIOutputDto提供了自动映射功能,能有效减轻后端开发中数据对象属性映射的工作量。

快速启动

OSharpNS框架制作了一个基于dotnet cli命令行工具的快速启动模板,下面演示如何来使用这个模板快速创建一个基于OSharpNS框架的初始化项目。

1. 安装最新版本 dotnetcore sdk

OSharpNS当前版本(0.2.1-beta05)使用了 dotnetcore 当前最新版本 2.1.1,所以对应的 dotnetcore sdk 需要安装到对应版本 >=v2.1.301。

2. 安装OSharpNS的 dotnet new 项目模板

在任意空白目录,打开cmd或者powershell命令行窗口,执行命令

dotnet new -i OSharpNS.Template.Mvc_Angular

执行后,将能看到osharp_xxx系列的命令已安装到列表中

640?wx_fmt=png

3. 执行 osharp_cmd 命令,获取项目一键安装脚本

dotnet new osharp_cmd

执行后,将得到一个名为cmd_build.bat的批处理脚本文件

640?wx_fmt=png

4. 运行脚本文件,生成项目初始化代码

直接执行cmd_build.bat脚本代码,将会提示 请输入项目名称,推荐形如 “公司.项目”的模式:,此名称将用作解决方案名称、工程名称起始部分、代码中的namespace起始部分。例如输入Liuliu.Demo,将生成如下代码结构:

640?wx_fmt=png

5. 用VS打开解决方案

打开解决方案后,各个工程之间的引用关系已配置好,osharp框架的类库已引用 nuget.org 上的相应版本,并将自动还原好。项目结构如图所示:

640?wx_fmt=png

项目代码结构说明:

  • Liuliu.Demo.Core: 业务核心工程,顶层文件夹以业务模块内聚,每个文件夹按职责划分文件夹,通常可包含传输对象Dtos、实体类型Entities、事件处理Events等,业务接口IXxxContract与业务实现IXxxService放在外边,如果文件数量多的话也可以建文件夹存放。

  • Liuliu.Demo.EntityConfiguration: EFCore实体映射工程,用于配置各个业务实体映射到数据库的映射细节。文件夹也推荐按模块内聚。

  • Liuliu.Demo.Web: 网站的Hosting项目,按常规方式使用即可

项目启动配置

  • 按实际环境修改配置文件appsetting.Development.json中的OSharp:DbContexts:[SqlServer|MySql]中的配置信息,ConnectionString为数据库连接串,AutoMigrationEnabled为是否开启自动迁移

  • 如未开启AutoMigrationEnabled的自动迁移功能,还需要在nuget 控制台手动执行迁移操作

Update-Database

  • 配置好后,即可正常启动端口号为7001的项目,启动后开发模式将进入Swagger的后端Api接口的文档页。

6. Angular6的前端项目启动

前端项目使用了ng-alainkendoui作为UI进行开发的,需要熟悉nodejs,angular6等技术。

安装 NodeJS ,搭建前端技术环境

  • 安装最新版本 NodeJS:angular6需要最新版本的 NodeJS,请到 NodeJS官方网站 下载最新版本的NodeJS进行安装。

  • 设置npm的淘宝镜像仓库:由于npm的国外仓储会很慢,所以最好把npm仓库地址指定国内镜像,推荐淘宝镜像:

npm config set registry https://registry.npm.taobao.org

  • 下载安装 Visual Studio Code:前端最好用的IDE,官方下载

使用 VS Code 打开 Angular 前端项目

  • 定位到项目的目录src/ui/ng-alain,在空白处点右键,使用 VS Code 打开项目,可看到如下结构:

640?wx_fmt=png

  • Ctrl+Tab快捷键,调出VS Code的命令行控制台,输入NodeJS包安装命令:

    npm install

  • 包安装完成后,输入项目启动命令:

    npm start

此命令将会执行如下命令:ng serve --port 4201 --proxy-config proxy.config.json --open,其中--proxy-config proxy.config.json对前端项目发起的API请求进行了代理,所有以 /api/开头的请求,都会转发到服务端项目中进行处理,代理的实际配置如下:

{"/api": {"target": "http://localhost:7001","secure": false}
}

至此,项目启动完成,后续可以进行用户注册的工作,请注意:

系统的第一个注册用户,将自动拥有系统最高权限的超级管理员权限

最终效果如下图所示:

640?wx_fmt=png


项目开发进度

截止到目前,OSharpNS 框架的完成程度已经很高了,计划中的功能点,除了数据权限未完成,其余均已得到较高水准的实现,具体功能点完成进度如下所示:

  • [ ] OSharpNS Framework

    • [x] 身份认证Identity

    • [ ] 权限授权Security

    • [x] 系统System

    • [x] 用户添加昵称NickName属性,并添加默认验证器

    • [x] 重写UserStore,RoleStore,使用现有IRepository进行数据存储

    • [ ] 实现角色-实体用户-实体的数据权限配置

    • [ ] 实现角色-实体用户-实体的数据权限过滤

    • [x] 实现功能权限各个业务实体的数据存储

    • [x] 实现在系统初始化时,遍历反射程序集,自动初始化功能点、数据实体、业务模块等信息并持久化到数据库

    • [x] 实现系统初始化时,将功能点,数据实体,角色功能权限等信息缓存到内存中

    • [x] 实现角色-功能点用户-功能点的功能权限验证

    • [x] 功能权限

    • [ ] 数据权限

    • [x] 实现键值对数据字典功能

    • [x] AspNet

    • [x] MVC

    • [ ] SignalR

    • [x] 实现框架启动入口app.UseOSharp(),调用Pack模块管理器OSharpPackManager启动各个功能模块(OSharpPack)

    • [x] 实现基于当前请求的ServiceLocator的Scoped对象的解析

    • [x] 实现JSON请求的404处理中间件

    • [x] 实现JSON请求的异常信息到JSON操作结果与异常日志记录中间件

    • [x] 添加Api专用控制器基类ApiController,AreaApiController

    • [x] 实现MVC功能点处理器

    • [x] 实现MVC业务模块处理器

    • [x] 实现基于MVC的功能权限AOP拦截验证

    • [x] 实现基于MVC的事务提交AOP拦截提交

    • [x] 不同的映射类型,通过实现Profile来实现映射注册

    • [x] 实现通过遍历程序集,查找实现了IMapTuple接口的Profile来自动注册映射策略

    • [x] 定义MapToAttributeMapFromAttribute类型,用以标注Mapping的Source与Target类型,使用时在要映射的类型上标注如[MapTo(typeof(TTarget))][MapFrom(typeof(TSource))]特性,框架初始化时自动查找相应的类型进行CreateMap映射注册

    • [x] 实现运行时上下文类型初始化及自动加载相关实体类型的功能

    • [x] 实现Repository仓储的数据存储功能

    • [x] 实现UnitOfWork的多上下文管理及同DbConnection的上下文事务同步

    • [x] 添加常用Utility辅助工具类

    • [x] 添加框架配置Options定义

    • [x] 定义Entity数据访问相关接口

    • [x] 定义依赖注入模块相关接口

    • [x] 定义并实现EventBus事件总线的设计

    • [x] 定义Mapper对象映射模块相关接口

    • [x] 定义实体信息EntityInfo及初始化,用于给各个实体进行数据日志审计配置及数据权限设计

    • [x] 定义功能点信息Function及初始化,用于收集各个业务功能点(如MVC的Action),用于对功能进行缓存配置、操作日志审计、功能权限设计

    • [x] 定义Permissions权限模块的相关接口

    • [x] 实现框架依赖注入服务启动入口,调用各个功能模块(Pack)添加各模块的服务映射

    • [x] 实现ServiceLocator服务定位模式的依赖注入对象的解析

    • [ ] OSharp

    • [x] OSharp.EntityFrameworkCore

    • [x] OSharp.AutoMapper

    • [ ] OSharp.AspNetCore

    • [ ] OSharp.Permissions

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

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

640?wx_fmt=jpeg

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

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

相关文章

【模拟】字符串展开

字符串展开 题目大意&#xff1a; 一串缩写的字符串&#xff0c;将它缩写前的输出来&#xff08;详情见原题&#xff09; 原题 解题思路&#xff1a; 直接模拟每一个字符即可 代码&#xff1a; #include<cstdio> #include<string> #include<cstring> #…

2018-2019 ACM—ICPC SEERC 题解

2018 - 2019 SEERC 题解 比赛发出来太新了,网上根本就搜不到题解,补题补的太难受了. 在这里分享一篇我自己写的题解,也方便别人补题. 题目链接 http://codeforces.com/gym/101964/attachments/download/7814/seerc-2018.pdf A.Numbers 不留坑,这题不会. B.Broken Watch 题解…

【DP】过桥

过桥 题目大意&#xff1a; 有n个人要过一条桥&#xff0c;每个人都有自己的过桥时间&#xff0c;一条桥同时只能有2个人过&#xff08;过桥时间求较慢的一人&#xff09;&#xff0c;且要有人拿着手电筒才能过&#xff0c;只有一个手电筒&#xff0c;且不能扔手电筒&#xf…

.NET Core完成向RyuJIT的迁移

.NET Core CLR团队宣布&#xff0c;他们的.NET Core平台现在已经是完全基于其下一代即时编译器RyuJIT。有人可能不知道&#xff0c;在.NET Core中&#xff0c;编译器&#xff08;Roslyn&#xff09;会把C#代码编译成CIL&#xff08;公共中间语言&#xff09;字节码。接下来&…

【DP】【BFS】迷之阶梯

迷之阶梯 题目大意&#xff1a; 有n层阶梯&#xff0c;如果上面一层离这一层只有1个单位高度&#xff0c;就可以直接上去&#xff0c;也可以下去一层&#xff0c;当下去k层时&#xff0c;可以向上飞2k{2}^{k}2k个单位高度&#xff0c;当然要找到一个小于等于这个高度的阶梯落…

COMCMS_CORE 起步篇,如何运行和部署

前言&#xff1a;关于最近开源后&#xff0c;不少朋友问&#xff0c;怎么我下载下来&#xff0c;运行不了。或者怎么没有左边菜单。货不对板&#xff1f;还是我吃了数据&#xff1f;感言&#xff1a;开源不容易&#xff0c;更不容易的是&#xff0c;明明毫无保留&#xff0c;还…

UVALive7670 Asa's Chess Problem,上下界费用流,另类解法

Asa’s Chess Problem 先阐述一下带上下界的边怎么建. 带上下界的建图方法 设我要建一条边(u→v)(u\rightarrow v)(u→v),流量上界为upupup,下界为downdowndown,费用为costcostcost.则我需要建两条边. 为保证一定会有downdowndown的流量流过去,我们可以建立一条u→vu \right…

ASP.NET Core WebApi使用Swagger生成api说明文档看这篇就够了

引言在使用asp.net core 进行api开发完成后&#xff0c;书写api说明文档对于程序员来说想必是件很痛苦的事情吧&#xff0c;但文档又必须写&#xff0c;而且文档的格式如果没有具体要求的话&#xff0c;最终完成的文档则完全取决于开发者的心情。或者详细点&#xff0c;或者简单…

.NET Core微服务之基于Exceptionless实现分布式日志记录

一、Exceptionless极简介绍Exceptionless 是一个开源的实时的日志收集框架&#xff0c;它可以应用在基于 ASP.NET&#xff0c;ASP.NET Core&#xff0c;Web API&#xff0c;Web Forms&#xff0c;WPF&#xff0c;Console&#xff0c;ASP.NET MVC 等技术开发的应用程序中&#x…

.netcore 整合 log4net

1.背景前两天&#xff0c;曾经的一个同事咨询我&#xff0c;怎样将log4net以中间件的形式整合到core里边去。我不假思索的回答&#xff0c;这种问题应该有人做过吧&#xff0c;他说没有。于是&#xff0c;我去博客园搜了下&#xff0c;发现还真没有&#xff0c;全部都是传统.NE…

Asp.Net Core中利用Seq组件展示结构化日志功能

在一次.Net Core小项目的开发中&#xff0c;掌握的不够深入&#xff0c;对日志记录并没有好好利用&#xff0c;以至于一出现异常问题&#xff0c;都得跑动服务器上查看&#xff0c;那时一度怀疑自己肯定没学好&#xff0c;不然这一块日志不可能需要自己扒服务器日志来查看&…

Apache SkyWalking的架构设计【译文】

Apache SkyWalking提供了一个功能强大并且很轻量级的后端。在此&#xff0c;将介绍为什么采用以下方式来设计它&#xff0c;以及它又是如何工作的。架构图对于APM而言&#xff0c;agent或SDKs仅是如何使用libs的技术细节。手动或自动的形式与架构无关&#xff0c;因此在本文中&…

通俗易懂,什么是.NET?什么是.NET Framework?什么是.NET Core?

什么是.NET&#xff1f;什么是.NET Framework?本文将从上往下&#xff0c;循序渐进的介绍一系列相关.NET的概念&#xff0c;先从类型系统开始讲起&#xff0c;我将通过跨语言操作这个例子来逐渐引入一系列.NET的相关概念&#xff0c;这主要包括&#xff1a;CLS、CTS(CLI)、FCL…

.Net Core小技巧 - Hosted Services + Quartz实现定时任务调度

背景之前一直有朋友问&#xff0c;.Net Core Linux环境有没有类似Windows服务的东西。其实是有的&#xff0c;我了解的方法有两种&#xff1a;#1 创建一个ASP.Net Core的Web项目&#xff08;如Web API&#xff09;&#xff0c;然后通过添加中间件&#xff08;Middleware&#…

在.NET Core微服务中使用HostBuilder和Generic Host

基于控制台的服务中探索一个简单模式&#xff0c;以解决跨领域问题。“通用” Host和HostBuilder是随.NET Core 2.1发布而发布的新功能组件的组件。它们的一个用例是通过提供用于添加横切关注点&#xff08;例如依赖注入&#xff0c;配置和日志记录&#xff09;的模式来简化基于…

EntityFramework Core进行读写分离最佳实践方式,了解一下?

本来打算写ASP.NET Core MVC基础系列内容&#xff0c;博客评论有园友提出讲讲读写分离&#xff0c;这个问题提的好。大多数情况下&#xff0c;对于园友在评论中提出的问题&#xff0c;如果是值得深究或者大多数同行比较关注的问题我都会私下去看看&#xff0c;然后进行对应解答…

小X的加法难题

小X的加法难题 题目大意&#xff1a; 一个AB的式子&#xff0c;但之间有一些没用的空格&#xff0c;要你求出结果 原题&#xff1a; 解题思路&#xff1a; 字符输入&#xff0c;有数字就存起来&#xff0c;用加号和换行符来分开 代码&#xff1a; #include<cstdio>…

【桶排】小 X 的密码破译

小 X 的密码破译 题目大意&#xff1a; 有一堆式子&#xff0c;去重再排序后&#xff0c;按规则求出结果 原题&#xff1a; 解题思路&#xff1a; 把每一个求出来的数丢到桶里&#xff0c;然后跑一遍就可以了 代码&#xff1a; #include<cstdio> using namespace s…

Uva12325 Zombie's Treasure Chest [二分区间+模拟退火]

Zombie’s Treasure Chest 题目链接 https://cn.vjudge.net/problem/UVA-12325 题意 两种物品无穷多个,第一种物品重量s1s_1s1​,价值v1v_1v1​,第二种物品重量s2s_2s2​,价值v2v_2v2​,背包重nnn,求能装的最大价值之和. 数据全都是2e92e92e9.也就是两种物品的完全背包. 题…

Identity Server 4 预备知识 -- OpenID Connect 简介

我之前的文章简单的介绍了OAuth 2.0 (在这里: 要用Identity Server 4 -- OAuth 2.0 超级简介, 还不是很全.这篇文章我要介绍一下 OpenID Connect.OAuth 2.0 不是身份认证协议OAuth 2.0 不是身份认证(Authentication)协议. 为什么有人会认为OAuth 2.0具有身份认证的功能? 这是因…