FreeSql (三十二)Aop
FreeSql AOP 已有的功能介紹,未來(lái)為會(huì)根據(jù)用戶需求不斷增強(qiáng)。
審計(jì) CRUD
馬云說(shuō)過(guò),996是修福報(bào)。對(duì)于多數(shù)程序員來(lái)說(shuō),加班是好事。。。起碼不是閑人,不會(huì)下崗。
當(dāng)如果因?yàn)槟硞€(gè) sql 騷操作耗時(shí)很高,沒有一個(gè)相關(guān)的審計(jì)功能,排查起來(lái)可以說(shuō)無(wú)從下手,福報(bào)與你緊緊相隨(哈哈)。
FreeSql 支持簡(jiǎn)單的類似功能:
fsql.Aop.CurdAfter = (s, e) => {if (e.ElapsedMilliseconds > 200) {//記錄日志//發(fā)送短信給負(fù)責(zé)人} };是的,只需要一個(gè)事件,就可以對(duì)全局起到作用。
除了 CurdAfter,還有一個(gè) CurdBefore (在執(zhí)行 sql 之前觸發(fā))。
審計(jì)屬性值
實(shí)現(xiàn)插入/更新時(shí)統(tǒng)一處理某些值,比如某屬性的雪花算法值、創(chuàng)建時(shí)間值、甚至是業(yè)務(wù)值。
fsql.Aop.AuditValue += (s, e) => {if (e.Column.CsType == typeof(long) && e.Property.GetCustomAttribute<SnowflakeAttribute>(false) != null&& e.Value?.ToString() == 0)e.Value = new Snowflake().GetId(); };class Order {[Snowflake]public long Id { get; set; }//... }當(dāng)屬性的類型是 long,并且標(biāo)記了 [Snowflake],并且當(dāng)前值是 0,那么在插入/更新時(shí)它的值將設(shè)置為雪花id值。
說(shuō)明:SnowflakeAttribute 是使用者您來(lái)定義,new Snowflake().GetId() 也是由使用者您來(lái)實(shí)現(xiàn)
如果命名規(guī)范,可以在 aop 里判斷,if (e.Property.Name == "createtime") e.Value = DateTime.Now;
審計(jì)遷移腳本
FreeSql 自帶遷移功能,那么遷移的 SQL 語(yǔ)句長(zhǎng)啥樣,你可能會(huì)好奇。
比如創(chuàng)建表時(shí);
比如添加字段時(shí);
比如修改表名、修改字段名時(shí);
又比如字段類型更改之后時(shí);
這些操作在 FreeSql.CodeFirst 實(shí)現(xiàn)下基本不需要理會(huì),而且我們只推薦在開發(fā)環(huán)境使用自動(dòng)遷移的功能,正式環(huán)境可使用其他工具替代此操作。
但我們?nèi)匀豢赡苄枰獙?duì)項(xiàng)目做完整的日志記錄。
fsql.Aop.SyncStructureBefore、fsql.Aop.SyncStructureAfter 這兩個(gè)事件將排上用場(chǎng)。
自定義實(shí)體特性
比如項(xiàng)目?jī)?nèi)已經(jīng)使用了其它 orm,如 efcore,這樣意味著實(shí)體中可能存在 [Key],但它與 FreeSql [Column(IsPrimary = true] 不同。
Q: FreeSql 實(shí)體特性為啥這么別扭?
A: 為了考慮一致性用法,全部封裝在 ColumnAttribute 下,這樣用戶使用起來(lái),不用到處 using 或者 回憶特性應(yīng)該用哪個(gè)名字,如自增 [Column(IsIdentity = true)] 即可。
FreeSql 提供 AOP 自定義特性功能,實(shí)現(xiàn)與多個(gè) orm 共同擁有一套實(shí)體特性,可避免重復(fù)定義特性。
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 的實(shí)體特性就可以和 EFCore 那樣設(shè)定了。其他自增、樂(lè)觀鎖等,依葫蘆畫瓢便是。
自定義表達(dá)式
FreeSql 內(nèi)部表達(dá)式支持非常豐富,對(duì)各大數(shù)據(jù)庫(kù)的兼容度也做得很好。
有關(guān)表達(dá)式支持到的程度,可點(diǎn)擊查看詳細(xì)wiki:https://github.com/2881099/FreeSql/wiki/%E8%A1%A8%E8%BE%BE%E5%BC%8F%E5%87%BD%E6%95%B0
即便如此豐富,也仍然無(wú)法滿足用戶需求,FreeSql 對(duì)外開放了自定義表達(dá)式解析接口:
fsql.Aop.ParseExpression = (s, e) => {if (e.Expression.NodeType == Call && e.Expression.Name == "get_Item")e.Result = "1111"; };這個(gè)解析有點(diǎn)復(fù)雜,當(dāng) e.Expression 很復(fù)雜的時(shí)候,我們還提供了 e.FreeParse 方法,使用它相當(dāng)于調(diào)用 FreeSql 內(nèi)置表達(dá)式解析引擎,輔助您進(jìn)行解析。
Aop.Where
FreeSql 提供的 ISelect、IDelete、IUpdate 三大對(duì)象,都可以使用 .Where(lambda) 操作,也可以是 .Where(sql) 操作。
Aop.Where 的定位是可攔截 Where 條件。
fsql.Aop.Where = (s, e) => {if (e.Parameter[0]?.ToString() == "1")e.IsCancel = true; };Aop.ToList
監(jiān)控 ToList 返回的的數(shù)據(jù),用于攔截重新裝飾。
所有通過(guò) FreeSql.Select 查詢返回的時(shí)候,都可以在這個(gè)事件上進(jìn)行重新裝飾。
系列文章導(dǎo)航
(一)入門
(二)自動(dòng)遷移實(shí)體
(三)實(shí)體特性
(四)實(shí)體特性 Fluent Api
(五)插入數(shù)據(jù)
(六)批量插入數(shù)據(jù)
(七)插入數(shù)據(jù)時(shí)忽略列
(八)插入數(shù)據(jù)時(shí)指定列
(九)刪除數(shù)據(jù)
(十)更新數(shù)據(jù)
(十一)更新數(shù)據(jù) Where
(十二)更新數(shù)據(jù)時(shí)指定列
(十三)更新數(shù)據(jù)時(shí)忽略列
(十四)批量更新數(shù)據(jù)
(十五)查詢數(shù)據(jù)
(十六)分頁(yè)查詢
(十七)聯(lián)表查詢
(十八)導(dǎo)航屬性
(十九)多表查詢
(二十)多表查詢 WhereCascade
(二十一)查詢返回?cái)?shù)據(jù)
(二十二)Dto 映射查詢
(二十三)分組、聚合
(二十四)Linq To Sql 語(yǔ)法使用介紹
(二十五)延時(shí)加載
(二十六)貪婪加載 Include、IncludeMany、Dto、ToList
(二十七)將已寫好的 SQL 語(yǔ)句,與實(shí)體類映射進(jìn)行二次查詢
(二十八)事務(wù)
(二十九)Lambda 表達(dá)式
(三十)讀寫分離
(三十一)分區(qū)分表
(三十二)Aop
(三十三)CodeFirst 類型映射
(三十四)CodeFirst 遷移說(shuō)明
(三十五)CodeFirst 自定義特性
轉(zhuǎn)載于:https://www.cnblogs.com/FreeSql/p/11531471.html
總結(jié)
以上是生活随笔為你收集整理的FreeSql (三十二)Aop的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 一个关于winform多线程的教程(pd
- 下一篇: 在客户端为UltraWebGrid增加行