[开源] FreeSql AOP 功能模块 - FreeSql

FreeSql 是一个功能强大的 .NETStandard 库,用于对象关系映射程序(O/RM),支持 .NETCore 2.1+ 或 .NETFramework 4.6.1+(QQ群:4336577)。

据了解,用户使用很少问问题,编码过程中,因业务阻塞,情有可原;因框架使用问题阻塞,得不偿失。我们的口号:做 .net 最方便的 ORM!愿每一位开发者嘴角上扬?!

整体功能

  • IFreeSql 是核心,提供原始用法;

  • FreeSql.DbContext 是扩展包,提供面向对象的用法(像EF);

  • FreeSql.Repository 也是扩展包,提供仓储+工作单元用法(实际上和 DbContext 是一个扩展包);

  • FreeSql.Connection.Extensions 也是扩展包,提供像 Dapper 一样的用法;

源码地址:https://github.com/2881099/FreeSql,可从这里链向上面介绍的各个仓库。

fsql= new FreeSql.FreeSqlBuilder()
.UseConnectionString(FreeSql.DataType.Sqlite, @"Data Source=|DataDirectory|\document.db;Attachs=xxxtb.db;Pooling=true;Max Pool Size=10")
.UseAutoSyncStructure(true)
.Build();

今天上场的是 AOP 已有的功能介绍,未来为会根据用户需求不断增强。

审计 CRUD

马云说过,996是修福报。对于多数程序员来说,加班是好事。。。起码不是闲人,不会下岗。

当如果因为某个 sql 骚操作耗时很高,没有一个相关的审计功能,排查起来可以说无从下手,福报与你紧紧相随(哈哈)。

FreeSql 支持简单的类似功能:

fsql.Aop.CurdAfter = (s, e) => {
if (e.ElapsedMilliseconds > 200) {


}
};

是的,只需要一个事件,就可以对全局起到作用。

除了 CurdAfter,还有一个 CurdBefore (在执行 sql 之前触发)。

审计迁移脚本

FreeSql 自带迁移功能,那么迁移的 SQL 语句长啥样,你可能会好奇。

  • 比如创建表时;

  • 比如添加字段时;

  • 比如修改表名、修改字段名时;

  • 又比如字段类型更改之后时;

这些操作在 FreeSql.CodeFirst 实现下基本不需要理会,而且我们只推荐在开发环境使用自动迁移的功能,正式环境可使用其他工具替代此操作。

但我们仍然可能需要对项目做完整的日志记录。

fsql.Aop.SyncStructureBefore、fsql.Aop.SyncStructureAfter 这两个事件将排上用场。

自定义实体特性

比如项目内已经使用了其它 orm,如 efcore,这样意味着实体中可能存在 [Key],但它与 FreeSql [Column(IsPrimary = true] 不同。

Q: FreeSql 实体特性为啥这么别扭?

A: 为了考虑一致性用法,全部封装在 ColumnAttribute 下,这样用户使用起来,不用到处 using 或者 回忆特性应该用哪个名字,如自增 [Column(IsIdentity = true)] 即可。

FreeSql 提供 AOP 自定义特性功能,实现与多个 orm 共同拥有一套实体特性,可避免重复定义特性。

fsql.Aop.ConfigEntity = (s, e) => {
var attr = e.EntityType.GetCustomAttributes(
typeof(System.ComponentModel.DataAnnotations.Schema.TableAttribute), false).FirstOrDefault()
as System.ComponentModel.DataAnnotations.Schema.TableAttribute;
if (attr != null)
e.ModifyResult.Name = attr.Name;
};

fsql.Aop.ConfigEntityProperty = (s, e) => {
if (e.Property.GetCustomAttributes(
typeof(System.ComponentModel.DataAnnotations.KeyAttribute), false).Any())
e.ModifyResult.IsPrimary = true;
};

就这样,FreeSql 的实体特性就可以和 EFCore 那样设定了。其他自增、乐观锁等,依葫芦画瓢便是。

自定义表达式

FreeSql 内部表达式支持非常丰富,对各大数据库的兼容度也做得很好。

有关表达式支持到的程度,可点击查看详细wiki:https://github.com/2881099/FreeSql/wiki/%E8%A1%A8%E8%BE%BE%E5%BC%8F%E5%87%BD%E6%95%B0

即便如此丰富,也仍然无法满足用户需求,FreeSql 对外开放了自定义表达式解析接口:

fsql.Aop.ParseExpression = (s, e) => {
if (e.Expression.NodeType == Call && e.Expression.Name == "get_Item")
e.Result = "1111";
};

这个解析有点复杂,当 e.Expression 很复杂的时候,我们还提供了 e.FreeParse 方法,使用它相当于调用 FreeSql 内置表达式解析引擎,辅助您进行解析。

Aop.Where

FreeSql 提供的 ISelect、IDelete、IUpdate 三大对象,都可以使用 .Where(lambda) 操作,也可以是 .Where(sql) 操作。

Aop.Where 的定位是可拦截 Where 条件。

fsql.Aop.Where = (s, e) => {
if (e.Parameter[0]?.ToString() == "1")
e.IsCancel = true;
};

Aop.ToList

监控 ToList 返回的的数据,用于拦截重新装饰。

所有通过 FreeSql.Select 查询返回的时候,都可以在这个事件上进行重新装饰。

下载地址:https://github.com/2881099/FreeSql

优势:5种数据库支持彻底,1500+单元测试,文档功能齐全

欢迎更多人加入我们阵营!我们一起做 .NETCore 最方便的 ORM!


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

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

相关文章

Atcoder ARC062F - AtCoDeerくんとグラフ色塗り / Painting Graphs with AtCoDeer

Atcoder ARC062F - AtCoDeerくんとグラフ色塗り / Painting Graphs with AtCoDeer 题目描述 简要题意:给定一个有标号的无向图,你可以给每条边染上KKK种颜色之一,求本质不同的图的染色方案(两个图本质不同定义为不能通过若干次环…

各大主流K8S服务全方位能力比对

大家好,趁打开流量主的东风,特此贡献一篇长文,分析一下目前国内国外几大著名云厂商的kubernetes服务,以飨诸君。文起之前,先聊态度。 我本人是十分看好k8s的发展的,为何? 理因古往今来&#xff…

CF868F Yet Another Minimization Problem

CF868F Yet Another Minimization Problem 题目描述 Solution 一开始可以很容易地写出一个dpdpdp式子: 设fi,jf_{i,j}fi,j​表示前iii个数分成jjj段的最小代价,有: fi,jmin⁡k1i−1fk,j−1Ck1,if_{i,j}\min_{k1}^{i-1}f_{k,j-1}C_{k1,i} f…

.NET Core 的Generic Host 之Generic Host Builder

通用Host(Generic Host) 与 web Host 不同的地方就是通用Host解耦了Http请求管道,使得通用Host拥有更广的应用场景。比如:消息收发、后台任务以及其他非http的工作负载。这些场景都可以通过使用通用Host拥有横切(Cross-cutting)的…

loj#2143. 「SHOI2017」组合数问题

loj#2143. 「SHOI2017」组合数问题 题目描述 Solution 考虑转化一下我们要求的东西。 ∑i0n(nkikr)∑i0n(nki)[i≡r(modk)]\sum_{i0}^{n}\binom{nk}{ikr}\sum_{i0}^{n}\binom{nk}{i}[i \equiv r \;\;(mod\;\;k)]∑i0n​(ikrnk​)∑i0n​(ink​)[i≡r(modk)] 这个式子是什么…

.NET Core微服务 权限系统+工作流(二)工作流系统

一、前言接上一篇 .NET Core微服务 权限系统工作流(一)权限系统 ,再来一发工作流,我在接触这块开发的时候一直好奇它的实现方式,翻看各种工作流引擎代码,探究其实现方式,个人总结出来一个核心要…

LuoguP5504 [JSOI2011]柠檬

LuoguP5504 [JSOI2011]柠檬 题目描述 Solution 容易发现一个性质:每一段划分区间的首尾两个元素相同。 因为倘若不相同的话其中至少一个元素也就不产生贡献,将其划分在其他区间一定不会变劣。 因此就可以写出一个简单的O(n2)O(n^2)O(n2)的dpdpdp。 f…

开源分布式Job系统,调度与业务分离-如何创建一个计划HttpJob任务

项目介绍:Hangfire:是一个开源的job调度系统,支持分布式JOB!!Hangfire.HttpJob 是我针对Hangfire开发的一个组件,该组件和Hangfire本身是独立的。可以独立更新Hangfire版本不影响!该组件已被Hangfire官方采纳&#xff…

LuoguP5366 [SNOI2017]遗失的答案

LuoguP5366 [SNOI2017]遗失的答案 题目描述 Solution 可以先简化问题,特判LLL不是GGG倍数的情况。 然后令n⌊nG⌋n\lfloor \frac{n}{G} \rfloorn⌊Gn​⌋,L⌊LG⌋L\lfloor \frac{L}{G} \rfloorL⌊GL​⌋。 现在相当于求出1...n1...n1...n中选择若干数&#xff0c…

Angular 8正式发布!

Angular 团队今天宣布推出 Angular 8 正式版。作为一个期待已久的重大版本更新,Angular 8 为框架、Angular Material 和命令行界面工具 Angular CLI 带来了大量的改进和新功能。团队表示 Angular 8 显著减少了在现代浏览器中应用程序的启动时间、提供了用于定制 CLI…

[JLOI2016]成绩比较

[JLOI2016]成绩比较 题目描述 Solution 考虑dpdpdp。 令fi,jf_{i,j}fi,j​表示前iii个科目中有jjj个人被碾压的方案数。 转移显然为: fi,j∑k≥jfi−1,k∗(kj)∗(n−k−1Ri−(k−j)−1)∗(∑t1Uitn−Ri(Ui−t)Ri−1)f_{i,j}\sum_{k\geq j}f_{i-1,k}*\binom{k}{j}…

.NET Core 3.0 webapi集成Swagger 5.0

在项目中引用Swashbuckle.AspNetCore和Swashbuckle.AspNetCore.Filters两个dll&#xff0c;在Startup中的ConfigureServices相关配置代码如下 两个重点&#xff1a;1、options.DocumentFilter<HiddenApiFilter>();定义那些接口方法被隐藏2、启用oauth2安全授权访问…

CF848C Goodbye Souvenir

CF848C Goodbye Souvenir 题目描述 Solution 考虑拆贡献&#xff0c;把最后一次的下标减去第一次的下标的和拆成每一个点与和它数字相同的上一个点的差的和&#xff0c;也就是∑i−pre[i]\sum i-pre[i]∑i−pre[i]。 这样转化之后&#xff0c;每一次询问一个区间[l,r][l,r]…

站点部署,IIS配置优化指南

通常把站点发布到IIS上运行正常后&#xff0c;很少会去考虑IIS提供的各种参数&#xff0c;如何配置才是最适合当前站点运行需要的&#xff1f;这篇文章&#xff0c;从基本设置、回收机制、性能、并发、安全性等IIS设置讲解应当如何优化。先来“IIS应用程序池”优化后的参数配置…

Atcoder Keyence Programming Contest 2020 D - Swap and Flip

Atcoder Keyence Programming Contest 2020 D - Swap and Flip 题目描述 Solution 写了一个简单的O(2nn(nw))O(2^nn(nw))O(2nn(nw))的状压DP做法&#xff0c;正解似乎是O(2nn2)O(2^nn^2)O(2nn2)的&#xff0c;但也能过。 设我们的方案是At1,At2,...,AtnA_{t_1},A_{t_2},...,…

张高兴的.NET Core IoT 入门指南:(四)使用 SPI 进行通信

什么是 SPI和上一篇文章的 I2C 总线一样&#xff0c;SPI&#xff08;Serial Peripheral Interface&#xff0c;串行外设接口&#xff09;也是设备与设备间通信方式的一种。SPI 是一种全双工&#xff08;数据可以两个方向同时传输&#xff09;的串行通信总线&#xff0c;由摩托罗…

P3206 [HNOI2010]城市建设

P3206 [HNOI2010]城市建设 题目描述 无向图上修改边权&#xff0c;动态维护MSTMSTMST&#xff0c;求每次修改后的MST的权值和。 Solution 有一个简单好想的做法——LCTLCTLCT线段树分治。 考虑每次加边&#xff0c;若形成了一个环&#xff0c;则把环上最大的一条边删掉&…

ASP.NET Core 中使用IHttpClientFactory发出HTTP请求

1.HttpClient类使用存在的问题HttpClient类的使用所存在的问题&#xff0c;百度搜索的文章一大堆&#xff0c;好多都是单纯文字描述&#xff0c;让人感觉不太好理解&#xff0c;为了更好理解HttpClient使用存在的问题&#xff0c;下面让我们通过代码跟示例来描述。using(var cl…

链式反应

链式反应 题目描述 不想看题面&#xff0c;其实就是给定p(x)p(x)p(x)&#xff0c;有f′(x)f(x)2p(x)1f(x)f(x)^2p(x)1f′(x)f(x)2p(x)1&#xff0c;求fff这个多项式的幂级数形式前nnn项。 Solution 式子可以写成fn∑i,j[0<ij<n]fifjpn−i−j−1f_n\sum_{i,j}[0<ij…

linux 安装 powershell

linux 安装 powershellIntropowershell 已经推出了一个 Powershell Core&#xff0c; 版本号对应 Powershell 6.x&#xff0c;可以跨平台&#xff0c;支持 Linux 和 mac. 这使得对于熟练使用 Powershell 进行开发运维的一些开发者来说无疑是个福音。PowerShell 和 PowerShell C…