C# 静态代码织入AOP组件之肉夹馍

写在前面

关于肉夹馍组件的官方介绍说明:

Rougamo是一个静态代码织入的AOP组件,同为AOP组件较为常用的有Castle、Autofac、AspectCore等,与这些组件不同的是,这些组件基本都是通过动态代理+IoC的方式实现AOP,是运行时完成的,而Rougamo是编译时直接修改目标方法织入IL代码的。如果你还知道一个AOP组件"PostSharp",那么Rougamo就是类似Postsharp的一个组件,Postsharp是一个成熟稳定的静态代码织入组件,但PostSharp是一款商业软件,一些常用的功能在免费版本中并不提供。

老规矩从NuGet 安装组件 Rougamo.Fody

代码实现

以下是最基础的一个应用肉夹馍AOP组件的实现代码

 注入代码主体[LoggingAttribute]:

    public class LoggingAttribute : MoAttribute{private static readonly NLog.Logger Logger = NLog.LogManager.GetCurrentClassLogger();public override void OnEntry(MethodContext context){// 从context对象中能取到包括入参、类实例、方法描述等信息Logger.Info("方法执行前");}public override void OnException(MethodContext context){Logger.Error("方法执行异常", context.Exception);            }public override void OnSuccess(MethodContext context){Logger.Info("方法执行成功后");}public override void OnExit(MethodContext context){Logger.Info("方法退出时,不论方法执行成功还是异常,都会执行");}}// 3.应用Attributepublic class Service{[Logging]public static int Sync(Model model){return model.Id;}[Logging]public async Task<Data> Async(int id){return await Task.Run(() =>{var data = new Data();data.Id = id;return data;});}}public class Model{public int Id { get; set; }public string Name { get; set; }}public class Data{public int Id { get; set; }}

调用代码:

    public static void Main(string[] args){Console.WriteLine("Start...");var config = new NLog.Config.LoggingConfiguration();// Targets where to log to: File and Consolevar logfile = new NLog.Targets.FileTarget("logfile") { FileName = "file.txt" };var logconsole = new NLog.Targets.ConsoleTarget("logconsole");// Rules for mapping loggers to targets            config.AddRule(LogLevel.Info, LogLevel.Fatal, logconsole);config.AddRule(LogLevel.Debug, LogLevel.Fatal, logfile);// Apply config           LogManager.Configuration = config;var service = new Service();var data = service.Async(1);var id = Service.Sync(new Model() { Id = 1, Name = "DemoModel" });Console.WriteLine($"Data Id: {data.Id}, Model Id: {id}");Console.ReadLine();}

调用示例

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/622554.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux系统中线程(Thread)解读以及对IO性能的影响

线程是操作系统调度的基本单位&#xff0c;是进程中能够独立执行指令流的子任务。在线程模型中&#xff0c;多个线程共享同一进程的地址空间和其他资源&#xff0c;使得它们可以直接访问相同的内存区域&#xff0c;这样大大简化了数据共享和通信的复杂性。线程有以下几个关键特…

【Web】CTFSHOW PHP特性刷题记录(全)

知其然知其所以然&#xff0c;尽量把每种特性都详细讲明白。 目录 web89 web90 web91 web92 web93 web94 web95 web96 web97 web98 web99 web100 web101 web102 web103 web104 web105 web106 web107 web108 web109 web110 web111 web112 web113 web…

高级分布式系统-第12讲 分布式控制经典理论

控制器基础 分布式控制系统的设计&#xff0c;是指在给定系统性能指标的条件下&#xff0c;设计出控制器的控制规律和相应的数字控制算法。 PID控制器 根据偏差的比例&#xff08;Proportional&#xff09;、积分&#xff08;Integral&#xff09;、微分&#xff08;Derivati…

SQL_DCL_管理用户

DCL英文全称 Data Control Language(数据控制语言&#xff0c;用来管理数据库用户&#xff0c;控制数据库的访问权限。 1.查询用户 USE MY SQL; SELECT * FROM USER; 2.创建用户 CREATE USER 用户名主机名 IDENTIFIED BY密码; 3.修改用户密码 ALTER USER 用户名 主机名 …

Android修改Spinner默认文字颜色

要修改Spinner&#xff08;下拉选择框&#xff09;的默认文字颜色&#xff0c;你可以使用自定义的Spinner适配器&#xff0c;并重写getView()方法来设置文字颜色。以下是一个示例&#xff1a; 创建一个自定义的Spinner适配器类&#xff08;继承自ArrayAdapter) class CustomSp…

工作压力测试

每个职场人都会遇到工作压力&#xff0c;在企业人力资源管理的角度来看&#xff0c;没有工作压力是人力资源的低效&#xff0c;适当的工作压力可以促使员工不断进取&#xff0c;然而每个人的抗压能力是不同的&#xff0c;同样的工作量和工作难度&#xff0c;不同的人在面对相同…

编程探秘:Python深渊之旅-----云端部署(六)

为了提高可访问性和性能&#xff0c;团队决定将他们的应用部署到云平台。龙带领团队探索不同的云服务提供商和部署策略。 龙&#xff08;自信地&#xff09;&#xff1a;将我们的应用部署到云端是一个明智的决策。云计算不仅提供可扩展性&#xff0c;还能让我们的应用全天候运…

ORB-SLAM2重要函数总结(1)——特征点、地图点、关键帧

ORB-SLAM2重要函数总结&#xff08;1&#xff09; ORBFeature IC_Angle通过遍历特征点周围的像素&#xff0c;利用灰度质心法来计算特征点的角度朝向。具体地&#xff0c;它根据像素值和像素坐标的加权和来计算方向角度&#xff0c;使特征点具有旋转不变性。computeOrientati…

k8s实战从入门到上天系列第一篇:K8s微服务实战内容开篇介绍

前言 我们使用开源ruoyi微服务基本使用&#xff0c;基于基本的微服务实践。我们来讲解k8s的实战内容。 第一章&#xff1a;开源ruoyi微服务简介基本使用 第二章&#xff1a;k8s基本知识回顾、k3s集群搭建和基本使用 第三章&#xff1a;微服务镜像构建 第四章&#xff1a;中间件…

漏洞复现--GitLab 任意用户密码重置漏洞(CVE-2023-7028)

免责声明&#xff1a; 文章中涉及的漏洞均已修复&#xff0c;敏感信息均已做打码处理&#xff0c;文章仅做经验分享用途&#xff0c;切勿当真&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直…

【MySQL】多表查询 综合练习

多表查询笔记 综合练习 # 1.显示所有员工的姓名&#xff0c;部门号和部门名称。 SELECT e.last_name,e.department_id,d.department_name FROM employees e LEFT JOIN departments d ON e.department_id d.department_id;SELECT e.last_name,e.department_id,d.department…

class_4:car类

#include <iostream> using namespace std; class Car{ public://成员数据string color; //颜色string brand; //品牌string type; //车型int year; //年限//其实也是成员数据&#xff0c;指针变量&#xff0c;指向函数的变量&#xff0c;并非真正的成员函数void (*…

Win10(CPU)+ Anaconda3 + python3.9安装pytorch

1. 安装Anaconda3 1.1 下载Anaconda3 可以在官网下载Anaconda3-2022.05-Windows-x86_64.exe&#xff0c;这个版本对应的是python3.9。 1.2 安装Anaconda3 此步骤比较简单&#xff0c;双击.exe文件&#xff0c;一步一步执行即可&#xff0c;有不确定的可以自行百度&#xff…

BM25(Best Matching 25)算法基本思想

BM25&#xff08;Best Matching 25&#xff09;是一种用于信息检索&#xff08;Information Retrieval&#xff09;和文本挖掘的算法&#xff0c;它被广泛应用于搜索引擎和相关领域。BM25 基于 TF-IDF&#xff08;Term Frequency-Inverse Document Frequency&#xff09;的思想…

使用Spring Boot集成中间件:Elasticsearch基础->提高篇

使用Spring Boot集成中间件&#xff1a;Elasticsearch基础->提高篇 导言 Elasticsearch是一个开源的分布式搜索和分析引擎&#xff0c;广泛用于构建实时的搜索和分析应用。在本篇博客中&#xff0c;我们将深入讲解如何使用Spring Boot集成Elasticsearch&#xff0c;实现数…

C++ 对象模型 | 关于对象

一、C 对象模型 1、对象内存布局 在C中&#xff0c;有两种数据成员&#xff1a;static和nonstatic&#xff0c;以及三种成员方法static、nonstatic、virtual&#xff0c;下面从虚函数、非虚函数、静态成员变量、非静态成员变量等维度来分析&#xff0c;类对象的内存布局。例如…

多线程(1)

1.实现多线程 1.1简单了解多线程【理解】 是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多个线程&#xff0c;提升性能。 1.2并发和并行【理解】 并行&#xff1a;在同一时刻&#xff0c;有多个指令在多个CPU上…

【打卡】牛客网:BM87 合并两个有序的数组

思想&#xff1a; 简单粗暴的方法是先合并、再排序。没有技术含量。 此外&#xff0c;很容易想到是用归并方法。问题是对A[]从前往后赋值&#xff0c;会覆盖A[]中有用的数值。 模板的巧妙之处是&#xff0c;从后往前赋值&#xff0c;完美避开覆盖问题。 我看了模板的之后写…

js let和var的区别

在JavaScript中&#xff0c;let和var都是用来声明变量的关键字&#xff0c;但它们之间存在一些重要的区别&#xff1a; 作用域&#xff1a;var声明的变量具有函数作用域或全局作用域&#xff0c;这意味着它们的作用域范围在函数内或全局范围内。相比之下&#xff0c;let声明的…

Centos创建一个Python虚拟环境

在 CentOS 上创建一个 Python 虚拟环境&#xff0c;可以使用 virtualenv 工具。以下是创建和激活虚拟环境的基本步骤&#xff1a; 1.安装virtualenv 如果还没有安装 virtualenv&#xff0c;可以使用以下命令安装&#xff1a; sudo yum install python3-virtualenv请注意&…