当前位置: 首页 > 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" /
http://www.xdnf.cn/news/949087.html

相关文章:

  • UI框架-通知组件
  • TMC2226超静音步进电机驱动控制模块
  • 高抗扰度汽车光耦合器的特性
  • 渗透实战PortSwigger Labs指南:自定义标签XSS和SVG XSS利用
  • sshd代码修改banner
  • 开发一套外卖系统软件需要多少钱?
  • 简单介绍C++中 string与wstring
  • 动手学深度学习13.3. 目标检测和边界框-笔记练习(PyTorch)
  • 神经网络学习-神经网络简介【Transformer、pytorch、Attention介绍与区别】
  • 盲盒一番赏小程序:引领盲盒新潮流
  • [免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】
  • 分布式光纤声振传感技术原理与瑞利散射机制解析
  • 学习 Hooks【Plan - June - Week 2】
  • 华为云上的K8S怎么使用对象存储配置pod文件持久化。
  • Ubuntu 20.04 联网设置指南
  • python读取SQLite表个并生成pdf文件
  • mac 安装homebrew (nvm 及git)
  • 机器学习×第五卷:线性回归入门——她不再模仿,而开始试着理解你
  • 阿里云服务状态监控:实时掌握云服务健康状况
  • 八股文——JVM
  • LabVIEW超声频率跟踪
  • 积分商城小程序分销裂变系统框架设计
  • LLM - LlamaFactory 的大模型推理 踩坑记录
  • 算法思想之广度优先搜索(BFS)及示例(亲子游戏)
  • 云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
  • 安卓贝利自动点击器高级版下载安装教程
  • Win系统权限提升篇UAC绕过DLL劫持未引号路径可控服务全检项目
  • SSRF由浅入深
  • 【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
  • SAP Fiori UI5 开发环境搭建和部署(含增强开发)