[开源] 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/FreeSql/p/10937631.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

[开源] FreeSql.AdminLTE 功能升级

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

iOS开源项目MobileProject功能点介绍

一:MobileProject简介 MobileProject项目是一个以MVC模式搭建的开源功能集合,基于Objective-C上面进行编写,意在解决新项目对于常见功能模块的重复开发,MobileProject对于项目的搭建也进行很明确的划分,各个模块职责也比较明确,MobileProject也引入的一些常用第三方插件.宏定义.工具帮助类等:整个项目也是在不断更新跟维护中,功能点也会不断更新:代码支持iOS7以后版本: 二:项目框架内容 三:功能点介绍 1:JSPatch热更新功能 相信关于J

使用CGLIB实现AOP功能与AOP概念解释

使用CGLIB实现AOP功能 在Java里面,我们要产生某个对象的代理对象,这个对象必须要有一个特点,即这个对象必须实现一个接口,动态代理技术只能基于接口进行代理.有时候我们在做开发的时候,这个对象就没有实现接口,有人可能会说,它既然没有接口,那我就给它定义一个接口,这是不行的,因为有时候我们拿到一个对象,而这个对象是服务器产生给我们的,是服务器提供给我们的,又不是我们自己写的,动不动就给它定义一个接口,给它找个爸爸,哪那行呢?但我们现在要对它进行增强,这时用动态代理技术就不行了,动态代理技术只

订单功能模块设计与实现

在商城项目中,之前我们介绍了购物车功能模块的实现,商品加入到购物车之后,就是到购物车结算,然后显示购物车的商品列表,点击去结算,然后到了未提交前的订单列表, 点击提交订单后,生成此订单,返回订单的订单号,付款金额,订单预计到达时间.订单系统是一个非常重要的系统,我们的移动端.PC端都需要订单系统,所以这里我们将订单系统单独作为一个服务来,留出接口供客户单来调用 今天我们来看下这个订单系统到底是如何实现的: 一.订单系统功能 订单系统主要包含哪些功能模块呢? 创建订单功能.查看订单列表.根据订单i

智点财务软件的功能模块介绍

智点财务软件由多个功能模块构成,包括:总账.工资管理.固定资产.资产负债表.损益表等.各模块间相对独立,各自具有完善和系统的功能,又有机地结合为一体. 智点财务软件是一个企业经营管理平台,用以解决不同满足各级管理者对信息化的不同要求:为高层经营管理者提供大量收益与风险的决策信息,辅助企业制定长远发展战略:为中层管理人员提供企业各个运作层面的运作状况,帮助做到各种事件的监控.发现.分析.解决.反馈等处理流程,帮助做到投入产出最优配比:为基层管理人员提供便利的作业环境,易用的操作方式实现工作岗位.工

易网通物流平台报表功能模块是怎样的?

目前,很多物流平台都能够直观的展示物流公司各个物流环节的处理结果和进度,对于异常情况能够及时呈现预警结果.但是,现有物流系统各物流环节之间状态参数并不能实时.方便传递.如第三方货代庄家.物流公司之间,各自建立自己的数据库,没有进行很好的集成,同时物流行业舱位价格等实时变化过快,无法提供移动终端的方式以方便物流角色进行业务操作,及保证客户所查看数据实时更新. 此外,货主.物流公司.第三方货代.船东等角色之间仍然停留在依靠传统纷繁的电话.邮件联系和查询,人力交流成本随着接单数量增加而成倍增加. 在物

如何通过反射实现动态功能模块加载

程序集包含模块,而模块包含类型,类型又包含成员.反射则提供了封装程序集.模块和类型的对象.您可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型.然后,可以调用类型的方法或访问其字段和属性. 下面我们将介绍如何通过不使用反射的方式和使用反射的方式加载功能模块.实现效果: 1.        WinForm 主程序 主程序我们使用Winform程序,VS2008 工具C#语言开发.包括工具栏.状态栏及TabControl控件.我们使用TabControl 作为功能模块容器

在#AOS开发平台# 新增了【首选项】功能模块

在#AOS开发平台# 新增了[首选项]功能模块.缺省包含:我的个人资料维护.我的偏好设置.系统安全选项.自定义菜单.我的操作日志等功能,并提供了扩展点.在二次开发时候可以通过新增设置项按钮增加业务系统所需的和当前登录操作员有关的新开发的设置页面.