zoukankan      html  css  js  c++  java
  • C# AOP框架入门(转)

    出处:https://www.cnblogs.com/isaboy/p/Csharp_AOP_Log.html

    AOP面向切面编程(Aspect Oriented Programming),是通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。Spring框架用的核心技术就是AOP,是函数式编程的一种衍生范型。利用AOP的好处就是可以对业务逻辑进行隔离,降低耦合度,提高程序的可重用性,同时提高了开发的效率。开源的AOP也有不少,我这里用的KingAOP.

    1 项目结构

     2 定义一个日志记录的实体类User和LoggingAspect切面日志类

    复制代码
     1 namespace AOPDemo.Logging
     2 {
     3     class User
     4     {
     5         public int ID { get; set; }
     6         public string Name { get; set; }
     7         public string Pwd{get;set;}
     8         public string IP { get; set; }
     9         public string State { get; set; }
    10         public System.DateTime LoginTime { get; set; }
    11 
    12     }
    13 }
    复制代码
    复制代码
     1 using System;
     2 using System.Text;
     3 using KingAOP.Aspects;
     4 
     5 namespace AOPDemo.Logging
     6 {
     7     internal class LoggingAspect : OnMethodBoundaryAspect
     8     {
     9         public override void OnEntry(MethodExecutionArgs args)
    10         {
    11             string logData = CreateLogData("Entering", args);
    12             Console.WriteLine(logData);
    13         }
    14 
    15         public override void OnExit(MethodExecutionArgs args)
    16         {
    17             string logData = CreateLogData("Leaving", args);
    18             Console.WriteLine(logData);
    19         }
    20         /// <summary>
    21         /// AOP对于登录日志逻辑,只需在此进行修改即可,无需修改被切面的处理类
    22         /// </summary>
    23         /// <param name="methodStage"></param>
    24         /// <param name="args"></param>
    25         /// <returns></returns>
    26         private string CreateLogData(string methodStage, MethodExecutionArgs args)
    27         {
    28             var str = new StringBuilder();
    29             str.AppendLine();
    30             str.AppendLine(string.Format(methodStage + " {0} ", args.Method));
    31             foreach (var argument in args.Arguments)
    32             {
    33                 var argType = argument.GetType();
    34 
    35                 str.Append(argType.Name + ": ");
    36 
    37                 if (argType == typeof(string) || argType.IsPrimitive)
    38                 {
    39                     str.Append(argument);
    40                 }
    41                 else
    42                 {
    43                     foreach (var property in argType.GetProperties())
    44                     {
    45                         str.AppendFormat("{0} = {1}; ",
    46                             property.Name, property.GetValue(argument, null));
    47                     }
    48                 }
    49             }
    50             return str.ToString();
    51         }
    52     }
    53 }
    复制代码

     3 Login类

    该类必须实现IDynamicMetaObjectProvider的GetMetaObject方法,同时在需要切面的方法上用属性[LoggingAspect]进行标注,LoggingAspect属性也就是我们上面定义的LoggingAspect切片处理类.

    复制代码
     1 using System.Dynamic;
     2 using System.Linq.Expressions;
     3 using KingAOP;
     4 namespace AOPDemo.Logging
     5 {
     6     /// <summary>
     7     /// 登录逻辑处理,只需添加一个LoggingAspect即可实现日志功能,达到逻辑和通用处理的逻辑分离
     8     /// </summary>
     9     internal class Login : IDynamicMetaObjectProvider
    10     {
    11         //添加登录切面
    12         [LoggingAspect] 
    13         public void LoginValdate(User entity)
    14         {
    15             //只需进行业务逻辑处理,无需进行日志处理
    16             if (entity.Name == "jack" &&  entity.Pwd == "wang")
    17             {
    18                 entity.State = "Logged";
    19             }
    20             else
    21             {
    22                 entity.State = "Error";
    23             }
    24             
    25 
    26         }
    27         /// <summary>
    28         /// IDynamicMetaObjectProvider的实现
    29         /// </summary>
    30         /// <param name="parameter"></param>
    31         /// <returns></returns>
    32         public DynamicMetaObject GetMetaObject(Expression parameter)
    33         {
    34             //need for AOP weaving
    35             return new AspectWeaver(parameter, this);
    36         }
    37     }
    38 }
    复制代码

    调试代码如下:

    1             //测试感觉KingAOP必须有一个dynamic才能切面
    2             Logging.Login test = new Logging.Login();
    3             dynamic entity = new Logging.User { Name = "Jon", ID = 99,Pwd="wang",State="",LoginTime=System.DateTime.Now};
    4             test.LoginValdate(entity);
    水平有限,望各位园友不吝赐教!如果觉得不错,请点击推荐和关注! 
    出处:http://www.cnblogs.com/isaboy/ 
    声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    强化学习框架RLlib教程003:Training APIs的使用(二)基础pythonAPI
    强化学习框架RLlib教程002:Training APIs(一)快速入门与配置项
    强化学习框架RLlib教程001:Ray和RLlib介绍
    强化学习原理源码解读004:A3C (Asynchronous Advantage Actor-Critic)
    强化学习原理源码解读003:Actor-Critic和A2C
    强化学习原理源码解读002:DQN
    强化学习原理源码解读001:Policy Gradient
    部署服务包卡住不打日志排查问题
    [转]Angular Reactive Forms -- Model-Driven Forms响应式表单
    AWS DMS MySql数据同步Elasticsearch
  • 原文地址:https://www.cnblogs.com/smileberry/p/9945532.html
Copyright © 2011-2022 走看看