AspNetCore 请求产生 FreeSql 全部操做日志输出到前端

FreeSql是一个功能强大的 .NET ORM 功能库,支持 .NetFramework 4.0+、.NetCore 2.1+、Xamarin 等支持 NetStandard 全部运行平台。html

特性git

  • 支持 CodeFirst 迁移;
  • 支持 DbFirst 从数据库导入实体类,支持三种模板生成器;
  • 采用 ExpressionTree 高性能读取数据;
  • 支持深刻的类型映射,好比pgsql的数组类型,堪称匠心制做;
  • 支持丰富的表达式函数;
  • 支持导航属性查询,和延时加载;
  • 支持同步/异步数据库操做方法,丰富多彩的链式查询方法;
  • 支持读写分离、分表分库,租户设计;
  • 支持多种数据库,MySql/SqlServer/PostgreSQL/Oracle/Sqlite/达梦/MsAccess;

开源地址:https://github.com/2881099/FreeSqlgithub

第一步:定义注入类型sql

public class CurdAfterLog : IDisposable
{
    public static AsyncLocal<CurdAfterLog> Current = new AsyncLocal<CurdAfterLog>();
    public StringBuilder Sb { get; } = new StringBuilder();

    public CurdAfterLog()
    {
        Current.Value = this;
    }
    public void Dispose()
    {
        Sb.Clear();
        Current.Value = null;
    }
}

第二步:注入 CurdAfterLog数据库

services.AddSingleton<IFreeSql>(fsql);
services.AddScoped<CurdAfterLog>();

第三步:添加 CurdAfter 事件数组

fsql.Aop.CurdAfter += (s, e) =>
{
    CurdAfterLog.Current.Value?.Sb.AppendLine($"{Thread.CurrentThread.ManagedThreadId}: {e.EntityType.FullName} {e.ElapsedMilliseconds}ms, {e.Sql}");
};
便于管理 fsql.Aop.CurdAfter 应该和 new FreeSqlBuilder()..Build() 代码放在一块儿,而且该事件只绑定一次

第四步:在 Controller 中测试异步

public class ValuesController : ControllerBase
    {

        IFreeSql _fsql;
        CurdAfterLog _curdLog;
        public ValuesController(IFreeSql fsql, CurdAfterLog curdLog)
        {
            _fsql = fsql;
            _curdLog = curdLog;
        }

        public ActionResult<string> Get(int id)
        {
            var item1 = _orm.Select<Song>().Where(a => a.Id == id).First();
            var item2 = _orm.Select<Song>().Where(a => a.Id == id).First();
            return _curdLog.Sb.ToString();
        }
    }

参考资料

《新人学习指引》 \ 《Select》 \ 《Update》 \ 《Insert》 \ 《Delete》
《表达式函数》 \ 《CodeFirst》 \ 《DbFirst》 \ 《BaseEntity》
《Repository》 \ 《UnitOfWork》 \ 《过滤器》 \ 《乐观锁》 \ 《DbContext》
《读写分离》 \ 《分区分表》 \ 《租户》 \ 《AOP》 \ 《黑科技》 \ 更新日志
相关文章
相关标签/搜索