C# AOP框架 KingAOP 基础用法与日志切面实现

桃夭
桃夭
发布时间:2026-10-14 | 5人浏览过
原创

在 C# 开发中,利用 AOP(面向切面编程)技术可以显著降低业务逻辑与非核心功能(如日志记录、权限验证)之间的耦合度。KingAOP 是一个轻量级的开源 AOP 框架,本文将展示如何通过自定义切面和动态代理,快速实现方法执行前后的日志拦截。

KingAOP 项目结构预览

1 项目结构

定义业务实体与日志切面类

要实现基于 KingAOP 的 AOP 功能,首先需要定义需要被切入的业务数据实体,以及负责处理横切关注点(如日志记录)的 Aspect 类。

第1步:定义 User 实体类

在命名空间 AOPDemo.Logging 下创建一个简单的 User 类,包含 ID、姓名、密码、登录状态等属性,用于模拟业务数据传输对象:

namespace AOPDemo.Logging
{
    class User
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public string Pwd { get; set; }
        public string IP { get; set; }
        public string State { get; set; }
        public System.DateTime LoginTime { get; set; }
    }
}

第2步:编写 LoggingAspect 切面逻辑

KingAOP 提供了 OnMethodBoundaryAspect 基类,开发者可通过重写其方法生命周期钩子来实现拦截。我们创建一个名为 LoggingAspect 的类,主要实现两个关键方法:

  • OnEntry:方法执行前调用,用于打印进入方法的参数信息。
  • OnExit:方法执行后调用,用于打印离开方法的日志。

以下代码展示了如何拼接日志字符串并提取参数详情:

using System;
using System.Text;
using KingAOP.Aspects;

namespace AOPDemo.Logging
{
    internal class LoggingAspect : OnMethodBoundaryAspect
    {
        public override void OnEntry(MethodExecutionArgs args)
        {
            string logData = CreateLogData("Entering", args);
            Console.WriteLine(logData);
        }

        public override void OnExit(MethodExecutionArgs args)
        {
            string logData = CreateLogData("Leaving", args);
            Console.WriteLine(logData);
        }

        /// <summary>
        /// AOP对于登录日志逻辑,只需在此进行修改即可,无需修改被切面的处理类
        /// </summary>
        private string CreateLogData(string methodStage, MethodExecutionArgs args)
        {
            var str = new StringBuilder();
            str.AppendLine();
            str.AppendLine(string.Format(methodStage + " {0} ", args.Method));
            foreach (var argument in args.Arguments)
            {
                var argType = argument.GetType();

                str.Append(argType.Name + ": ");

                if (argType == typeof(string) || argType.IsPrimitive)
                {
                    str.Append(argument);
                }
                else
                {
                    foreach (var property in argType.GetProperties())
                    {
                        str.AppendFormat("{0} = {1}; ",
                            property.Name, property.GetValue(argument, null));
                    }
                }
            }
            return str.ToString();
        }
    }
}

应用切面与实现 Dynamic Meta Object

定义了切面后,需要将其应用到具体的业务逻辑类中。在 KingAOP 中,这需要目标类实现 IDynamicMetaObjectProvider 接口,并通过 [LoggingAspect] 特性标注需要拦截的方法。

第3步:实现 Login 类

创建 Login 类,该类必须实现 IDynamicMetaObjectProvider 接口的 GetMetaObject 方法,这是 KingAOP 进行织入(Weaving)的关键入口。在需要日志记录的业务方法 LoginValdate 上添加 [LoggingAspect] 特性标记:

using System.Dynamic;
using System.Linq.Expressions;
using KingAOP;
namespace AOPDemo.Logging
{
    /// <summary>
    /// 登录逻辑处理,只需添加一个LoggingAspect即可实现日志功能,达到逻辑和通用处理的逻辑分离
    /// </summary>
    internal class Login : IDynamicMetaObjectProvider
    {
        //添加登录切面
        [LoggingAspect]
        public void LoginValdate(User entity)
        {
            //只需进行业务逻辑处理,无需进行日志处理
            if (entity.Name == "jack" && entity.Pwd == "wang")
            {
                entity.State = "Logged";
            }
            else
            {
                entity.State = "Error";
            }
        }

        /// <summary>
        /// IDynamicMetaObjectProvider的实现
        /// </summary>
        /// <param name="parameter"></param>
        /// <returns></returns>
        public DynamicMetaObject GetMetaObject(Expression parameter)
        {
            //need for AOP weaving
            return new AspectWeaver(parameter, this);
        }
    }
}

此时,切面逻辑已绑定至 Login 类。以下是该类与其他组件关系的结构示意图:

调试与运行

由于 KingAOP 依赖于动态代理机制,建议在测试时配合使用 dynamic 关键字来实例化操作对象,以确保 AOP 织入生效。

第4步:执行测试代码

在控制台或单元测试中调用上述逻辑,传入一个模拟的用户实体。观察输出结果,可以看到方法进入(Entering)和退出(Leaving)时的详细参数日志:

//测试感觉KingAOP必须有一个dynamic才能切面
Logging.Login test = new Logging.Login();
dynamic entity = new Logging.User { Name = "Jon", ID = 99,Pwd="wang",State="",LoginTime=System.DateTime.Now};
test.LoginValdate(entity);

总结

通过上述步骤,我们成功利用 KingAOP 实现了无侵入式的日志记录功能。这种基于特性的 AOP 方案使得业务代码专注于核心逻辑,而将重复的系统级关注点抽离到独立的切面类中,极大地提升了代码的可维护性与复用性。以上就是 C# AOP框架 KingAOP 基础用法的详细内容,更多关于 C# AOP 开发资料的关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表