AspNetCore 請求產生 FreeSql 所有操作 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();
        }
    }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM