FreeSql aop功能介绍

前言

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) //自动迁移(CodeFirst)
    .Build();

AOP 功能

今天上场的是 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!

原文地址:https://www.cnblogs.com/kellynic/p/10917268.html

时间: 2024-07-29 15:11:02

FreeSql aop功能介绍的相关文章

[开源] FreeSql AOP 功能模块

前言 FreeSql 是一个功能强大的 .NETStandard 库,用于对象关系映射程序(O/RM),支持 .NETCore 2.1+ 或 .NETFramework 4.6.1+(QQ群:4336577). 据了解,用户使用很少问问题,编码过程中,因业务阻塞,情有可原:因框架使用问题阻塞,得不偿失.我们的口号:做 .net 最方便的 ORM!愿每一位开发者嘴角上扬??! 整体功能 IFreeSql 是核心,提供原始用法: FreeSql.DbContext 是扩展包,提供面向对象的用法(像E

C# Unity依赖注入利用Attribute实现AOP功能

使用场景? 很多时候, 我们定义一个功能, 当我们要对这个功能进行扩展的时候, 按照常规的思路, 我们一般都是利用OOP的思想, 在原有的功能上进行扩展. 那么有没有一种东西, 可以实现当我们需要扩展这个功能的时候, 在不修改原来的功能代码的情况下实现, 这就是下面要说的到Unity. 1.准备工作 为项目添加NuGet包, 搜索Unity并且安装. 在使用的项目中添加Unity的相关引用 using Microsoft.Practices.Unity.InterceptionExtension

SpringBoot中使用LoadTimeWeaving技术实现AOP功能

目录 1. 关于LoadTimeWeaving 1.1 LTW与不同的切面织入时机 1.2 JDK实现LTW的原理 1.3 如何在Spring中实现LTW 2. Springboot中使用LTW实现AOP的例子 3. 参考资料 1. 关于LoadTimeWeaving 1.1 LTW与不同的切面织入时机 AOP--面向切面编程,通过为目标类织入切面的方式,实现对目标类功能的增强.按切面被织如到目标类中的时间划分,主要有以下几种: 1.运行期织入 这是最常见的,比如在运行期通过为目标类生成动态代理

[开源] FreeSql.AdminLTE 功能升级

前言 FreeSql 发布至今已经有9个月,功能渐渐完善,自身的生态也逐步形成,早在几个月前写过一篇文章<ORM 开发环境之利器:MVC 中间件 FreeSql.AdminLTE>,您可以先阅读上一篇文章内容了解来龙去脉,再回到这里观看. 我个人非常喜欢小规模团队的"单打独斗",有的时候即使在大公司,也是做着3-5个人团队的小项目,相信不少人有类似的经历. 从上一篇文章可以看出,早先的 FreeSql.AdminLTE 只不过是花瓶,应用场景非常有限,仅仅在开发环境时管理测试数据的用途,这之后

Exchange2016正式版功能介绍及全新安装配置

Exchange2016功能介绍及全新安装配置 说到Exchange服务相信很多人都在关注,微软在2015年更新了很多服务,从功能上来说确实做了很多优化及提升,具体就不多说了,微软在2015年10月1日发布了Exchange2016正式版,版本还是分为标准版和企业版,此次发布为多语言版本 同样微软在2015年发布了那些新产品呢 : 我们还是说说Exchange2016,从安装及官网文档上看微软从Exchange2010到Exchange2016角色上缩减了很多,从Exchange2010的Mai

Python中生成器和迭代器的功能介绍

生成器和迭代器的功能介绍 1. 生成器(generator) 1. 赋值生成器 1. 创建 方法:x = (variable for variable in iterable) 例如:x = (i for i in range(10)) print(x) >>> <generator object <genexpr> at 0x00000000006B85C8> 返回值:generator #使用元祖推导式的时候回变成一个生成器. 2. 调用 方法:x.__nex

友盟新功能介绍:在线参数-备用

作为开发者您是否也碰到过这些挠头问题: 刚上线不久的应用就要修改说明文字?应用添加广告后,如何平衡用户流失和广告收入情况?如何对游戏中的道具进行合理定价? 为帮助开发者告别频繁地更新应用版本,更好的比较版本之间的用户行为及习惯,友盟针对Android开发者新推出在线参数功能.通过在线参数功能,开发者可以远程动态修改应用中的参数值,灵活调整运营策略.iOS版本近期推出. 获得更多信息和体验在线参数功能请访问www.umeng.com 什么是在线参数 在线参数是友盟推出的新功能,可以让您动态修改应用

Python中set的功能介绍

Set的功能介绍 1.集合的两种函数(方法) 1. 集合的内置函数 交集 格式:x.__and__(y)等同于x&y 例如:s1 = {'a',1,} s2 = {'b',1,} s3 = {'b','d'} print(s1.__and__(s2)) >>> {1} print(s1.__and__(s3)) >>> set() 返回值:set #y只能是集合,当两个集合没有交集时,返回值为空集合. 判断是否是包含关系 格式:x.__contains__(y)

EXCEL基础内容学习笔记(二)Excel文档的基本组成与功能介绍

一.基本组成 (一)工作簿.工作表与单元格 (1)工作簿:一个Excel文档即为一个工作簿. (2)工作表:工作簿中的每个表. (3)单元格:打开Excel文档,在工作表中单击,出现的加粗四边形即为单元格.单元格由行和列组成,命名时由行和列说明,称为单元格名称或地址. 一个工作簿中有若干个工作表,每个工作表有许多单元格组成. 二.功能介绍 (1)标题栏:Excel文档最上端. (2)选项卡 (3)工作区:每一个打开的选项卡都含有若干工作区. (4)名称框:所选择的单元格的名字. (5)编辑栏:可