zoukankan      html  css  js  c++  java
  • KingAOP拦截方案

    KingAOP

    using KingAOP.Aspects;
    using System;
    using System.Collections.Generic;
    using System.Diagnostics;
    using System.Dynamic;
    using System.Linq;
    using System.Reflection;
    using System.Runtime.Remoting.Contexts;
    using System.Runtime.Remoting.Messaging;
    using System.Text;
    using System.Threading.Tasks;
    using System.Linq.Expressions;
    using KingAOP;
    
    namespace ConsoleApplication5
    {
        /// <summary>
        /// aop日志拦截示例 使用KingAOP
        /// </summary>
        class Program
        {
            static void Main(string[] args)
            {
                Login test = new Login();
                dynamic entity = new User { ID = 99, Name = "Jon", Pwd = "wang", State = "", LoginTime = System.DateTime.Now };
                test.LoginValdate(entity);
                Console.Read();
            }
        }
        public class User
        {
            public int ID { get; set; }
            public string Name { get; set; }
            public string Pwd { get; set; }
            public string State { get; set; }
            public System.DateTime LoginTime { get; set; }
        }
    
        /// <summary>
        /// 创建一个日志切面处理类
        /// </summary>
        public class LoggingAspect : OnMethodBoundaryAspect
        {
            public override void OnEntry(MethodExecutionArgs args)
            {
                string logData = CreateLogData("entering", args);
                Console.WriteLine(logData);
            }
    
            public override void OnException(MethodExecutionArgs args)
            {
                string logData = CreateLogData("exception", args);
                Console.WriteLine(logData);
            }
    
            public override void OnSuccess(MethodExecutionArgs args)
            {
                string logData = CreateLogData("success", args);
                Console.WriteLine(logData);
            }
    
            public override void OnExit(MethodExecutionArgs args)
            {
                string logData = CreateLogData("exiting", args);
                Console.WriteLine(logData);
            }
    
            /// <summary>
            /// AOP处理登录日志逻辑,只需在此进行修改即可,无需修改被切面的处理类
            /// </summary>
            /// <param name="methodStage"></param>
            /// <param name="args"></param>
            /// <returns></returns>
            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();
            }
        }
    
        /// <summary>
        /// 该类需要继承IDynamicMetaObjectProvider,因为KingAOP是基于动态类型进行操作和绑定的,如不继承是不会进入到刷选器中的相应事件里
        /// 登录功能,只需添加一个LoggingAspect即可实现日志功能,达到业务逻辑和通用处理逻辑的分离
        /// </summary>
        public 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的GetMetaObject方法
            /// </summary>
            /// <param name="parameter"></param>
            /// <returns></returns>
            public DynamicMetaObject GetMetaObject(Expression parameter)
            {
                return new AspectWeaver(parameter, this);
            }
    
          
        }
    }
    

      

  • 相关阅读:
    基于边缘计算网关的桥梁结构安全监测应用
    5G工业网关的边缘计算
    5G工业网关和5G工业路由器差异对比分析
    大型网站架构系列:消息队列(二)
    大型网站架构系列:分布式消息队列(一)
    [转]线程安全类的设计
    [转]runloop原理
    [转]深入理解RunLoop
    [转]iOS保持界面流畅的技巧和AsyncDisplay介绍
    [转]面试时如何优雅的谈论OC
  • 原文地址:https://www.cnblogs.com/wuguangwei/p/10950821.html
Copyright © 2011-2022 走看看