C# AOP框架入门

  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);
时间: 2024-08-25 17:15:18

C# AOP框架入门的相关文章

[Spring框架]Spring AOP基础入门总结二:Spring基于AspectJ的AOP的开发.

前言: 在上一篇中: [Spring框架]Spring AOP基础入门总结一. 中 我们已经知道了一个Spring AOP程序是如何开发的, 在这里呢我们将基于AspectJ来进行AOP 的总结和学习. 一, AspectJ的概述: AspectJ是一个面向切面的框架,它扩展了Java语言.AspectJ定义了AOP语法所以它有一个专门的编译器用来生成遵守Java字节编码规范的Class文件. Spring为了简化自身的AOP的开发,将AspectJ拿过来作为Spring自身一个AOP的开发.

[Spring框架]Spring AOP基础入门总结一.

前言:前面已经有两篇文章讲了Spring IOC/DI 以及 使用xml和注解两种方法开发的案例, 下面就来梳理一下Spring的另一核心AOP. 一, 什么是AOP 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型.利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务

Spring/AOP框架, 以及使用注解

1, 使用代理增加日志, 也是基于最原始的办法 import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class LoggingProxy { /* * 代理类, 基于接口 */ //要被代理的对象, 目标对象 private Icalculator target; //生成一个构造方法 public LoggingPr

NET Core度身定制的AOP框架

NET Core度身定制的AOP框架 多年从事框架设计开发使我有了一种强迫症,那就是见不得一个应用里频繁地出现重复的代码.之前经常Review别人的代码,一看到这样的程序,我就会想如何将这些重复的代码写在一个地方,然后采用"注入"的方式将它们放到需要的程序中.我们知道AOP是解决这类问题最理想的方案.为此,我自己写了一个AOP框架,该框架被命名为Dora.Interception.Dora.Interception已经在GitHub上开源,如果有兴趣的朋友想下载源代码或者阅读相关文档,

Shiro权限控制框架入门1:Shiro的认证流程以及基本概念介绍

前言:我在最开始学习Shiro这个框架时,在网上搜索到的一个介绍比较全面的教程是:<跟我学Shiro>系列教程.但是在我看了他写的前几篇文章后,我发现虽然他在这个系列教程中把shiro的一些特性介绍地非常全面详细,但是整个教程的叙述方式还是有很大缺陷的.文章与文章之间并没有很好地串联起来,每篇文章介绍的东西都过于分散了,如果是对shiro完全不了解的新手来看的话完全是一场噩梦.就像一个网友评价的这样: 看了看这个教程,看完之后都想放弃shiro了,完全看不懂,后来百度了很多别的资料才理解了sh

Dwz(J-UI)框架--入门

http://www.cnblogs.com/chenyongsai/p/4933982.html Dwz(J-UI)框架--入门 一.了解 概述:是中国人自己开发的基于jQuery实现的Ajax RIA开源框架. 目的:简单实用.扩展方便(在原有架构基础上扩展方便).快速开发.RIA思路.轻量级 使用:用html扩展的方式来代替javascript代码 思路:根据官网页面样例,查看官方代码包,查阅相关子页面,参阅帮助文档,添加固定的标签属性语法 优势:第一次打开页面时载入界面到客户端, 之后和

基于 .NET 的开源AOP框架评估

Rating of Open Source AOPFrameworks in .NET 基于 .NET 的开源AOP框架评估 Introduction 引言 In the days where business agility is becoming the definite needof any business / IT infrastructure, quite frequentlywe are ending up with facing scenarios where we need t

Farseer.net轻量级开源框架 入门篇:使用前说明

导航 目   录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 入门篇: 框架性能测试 下一篇:Farseer.net轻量级开源框架 入门篇: 增.删.改.查操作演示 本篇讲解使用或者学习Farseer前需要知道一些事项: 在后续很多演示中,使用了很多扩展方法.但作者并没有明确出哪些是扩展的方法.所以读者要注意.在使用框架的时候,都需要引用扩展方法的命名空间:using FS.Extend; 为了方便,扩展方法统一放到FS.Extend中,在这里特别说

Java - Struts框架教程 Hibernate框架教程 Spring框架入门教程(新版) sping mvc spring boot spring cloud Mybatis

https://www.zhihu.com/question/21142149 http://how2j.cn/k/hibernate/hibernate-tutorial/31.html?tid=63 https://www.zhihu.com/question/29444491/answer/146457757 1. Java - Struts框架教程Struts 是Apache软件基金会(ASF)赞助的一个开源项目.通过采用JavaServlet/JSP技术,实现了基于Java EEWeb