当前位置: 首页 > news >正文

Rougamo.Fody 实现一个AOP日志

使用 Rougamo.Fody 实现 AOP 日志,并定义一个 ILog 接口供 SDK 使用,具体日志实现由调用方提供。这是一个非常标准的解耦设计模式,适用于中间件、SDK、插件等场景。


✅ 整体架构目标

组件

说明

ILog

定义日志接口,供内部使用

NullLog

默认空实现,避免未注入时抛异常

LogAttribute

基于 Rougamo.Fody 的切面类,用于方法拦截并记录日志

MyService

示例 类,展示如何在业务逻辑中使用日志

调用方

提供具体的日志实现(如 Serilog、NLog 等)


📦 第一步:安装依赖包

bashdotnet add package Rougamo.Fody

安装后会自动创建 FodyWeavers.xml 文件,内容为 <Rougamo />,确保存在。


🧩 第二步:定义 ILog 和默认实现

1. 定义接口

csharppublic interface ILog
{void Debug(string message, params object[] args);void Info(string message, params object[] args);void Warn(string message, params object[] args);void Error(Exception exception, string message, params object[] args);
}

2. 默认无输出实现(Null Object Pattern)

csharpinternal class NullLog : ILog
{public void Debug(string message, params object[] args) { }public void Info(string message, params object[] args) { }public void Warn(string message, params object[] args) { }public void Error(Exception exception, string message, params object[] args) { }
}

🛠️ 第三步:创建基于 Rougamo.Fody 的日志切面

csharpusing Rougamo;
using System;
using System.Reflection;[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class)]
public class LogAttribute : MoAttribute
{private static ILog _log = new NullLog();public static void SetLogger(ILog logger){_log = logger ?? new NullLog();}public override void OnEntry(MethodBase method, object?[]? args){_log.Debug("Entering {DeclaringType}.{MethodName}({Parameters})",method.DeclaringType?.Name,method.Name,string.Join(", ", args ?? Array.Empty<object>()));}public override void OnExit(MethodBase method, object?[]? args, object? result){_log.Debug("Exiting {DeclaringType}.{MethodName}, 返回值: {Result}",method.DeclaringType?.Name,method.Name,result);}public override void OnException(MethodBase method, object?[]? args, Exception exception){_log.Error(exception, "异常 {DeclaringType}.{MethodName}: {Message}",method.DeclaringType?.Name,method.Name,exception.Message);}
}

📌 第四步:在 库中使用 [Log] 切面

示例  类:

csharp[Log]
public class MyService
{public int Divide(int a, int b){return a / b;}public void DoSomething(){Console.WriteLine("执行业务逻辑");}
}

🧪 第五步:调用方注入日志实现(例如使用 Serilog)

1. 安装 Serilog 包(可选)

bashdotnet add package Serilog
dotnet add package Serilog.Sinks.Console

2. 实现适配器

csharpusing Serilog;public class SerilogAdapter : ILog
{private readonly ILogger _logger;public SerilogAdapter(ILogger logger) => _logger = logger;public void Debug(string message, params object[] args) =>_logger.Debug(message, args);public void Info(string message, params object[] args) =>_logger.Information(message, args);public void Warn(string message, params object[] args) =>_logger.Warning(message, args);public void Error(Exception exception, string message, params object[] args) =>_logger.Error(exception, message, args);
}

3. 初始化日志并设置给切面

csharpvar serilogLogger = new LoggerConfiguration().WriteTo.Console().CreateLogger();// 注入日志实现到切面
LogAttribute.SetLogger(new SerilogAdapter(serilogLogger));// 测试调用
var service = new MyService();
service.Divide(10, 0); // 触发异常,日志应被记录

📌 总结

功能

实现方式

方法拦截

Rougamo.Fody + LogAttribute

日志抽象接口

ILog

默认无日志实现

NullLog

具体日志实现

调用方可注入(如 SerilogAdapter)

支持类/方法标注

✅ 支持


注意

最后如果你准备使用肉夹馍,并且你准备使用肉夹馍开发一个供他人使用的NuGet组件,那么你需要把项目文件(.csproj)中Rougamo.Fody的引用改成下面这样,不然你发布的NuGet其他人引用后将需要额外引用Fody,否则将无法进行代码织入

<PackageReference Include="Rougamo.Fody" Version="1.0.1" IncludeAssets="all" PrivateAssets="contentfiles;analyzers" /

相关文章:

  • 简单介绍C++中 string与wstring
  • EZDML:一款国产免费的数据库建模工具
  • 十一(3) 类,加深对拷贝构造函数的理解
  • 【求出100~500之间所有每位数的乘积大于每位数的和的数。】2022-4-16
  • C语言中提供的第三方库之哈希表实现
  • React父子组件通信:Props怎么用?如何从父组件向子组件传递数据?
  • 用大白话解释一下“高基数特征”
  • Oracle数据库对IPv6的支持情况
  • GC1808高性能24位立体声音频ADC芯片解析
  • 深度剖析Diffusion与Transformer在图像生成中的计算逻辑与融合之道
  • 【性能篇I】为应用加速:整合 Redis 实现高速缓存
  • 第2篇:BLE 广播与扫描机制详解
  • 免布线+双向通信——电力载波技术重塑楼宇自控能效管理
  • nnUNet V2修改网络——暴力替换网络为UNet++
  • 代购商城系统怎么选?从业务痛点看系统核心价值
  • plantuml画uml图
  • 新的日期与时间API:告别 `Date` 和 `Calendar`,迎接更现代的日期与时间处理!
  • 【Fifty Project - D35】
  • ABB 605系列
  • 高效总结多篇文献的AI工具推荐:如何用AI批量整理文献综述与笔记?
  • 郑州公司做网站/百度电脑版网址
  • 海外网站入口/网站设计培训
  • 网站关键词优化推广哪家快/百度注册入口
  • 网站建设服务合同书/最近时事热点
  • 手游传奇开服网站/盐城seo推广
  • 深圳做网站排名哪家专业/7个湖北seo网站推广策略