AOP面向切面编程(Aspect Oriented Programming),是通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。Spring框架用的核心技术就是AOP,是函数式编程的一种衍生范型。利用AOP的好处就是可以对业务逻辑进行隔离,降低耦合度,提高程序的可重用性,同时提高了开发的效率。开源的AOP也有不少,我这里用的KingAOP.
1 项目结构
2 定义一个日志记录的实体类User和LoggingAspect切面日志类
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; } }
}
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>
/// <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();
}
}
}
3 Login类
该类必须实现IDynamicMetaObjectProvider的GetMetaObject方法,同时在需要切面的方法上用属性[LoggingAspect]进行标注,LoggingAspect属性也就是我们上面定义的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);
}
}
}
调试代码如下:
//测试感觉KingAOP必须有一个dynamic才能切面
Logging.Login test = new Logging.Login();
dynamic entity = new Logging.User { Name = "Jon", ID = ,Pwd="wang",State="",LoginTime=System.DateTime.Now};
test.LoginValdate(entity);
C# AOP框架入门的更多相关文章
-
C# AOP框架入门(转)
出处:https://www.cnblogs.com/isaboy/p/Csharp_AOP_Log.html AOP面向切面编程(Aspect Oriented Programming),是通过预编 ...
-
[Spring框架]Spring AOP基础入门总结二:Spring基于AspectJ的AOP的开发.
前言: 在上一篇中: [Spring框架]Spring AOP基础入门总结一. 中 我们已经知道了一个Spring AOP程序是如何开发的, 在这里呢我们将基于AspectJ来进行AOP 的总结和学习 ...
-
[Spring框架]Spring AOP基础入门总结一.
前言:前面已经有两篇文章讲了Spring IOC/DI 以及 使用xml和注解两种方法开发的案例, 下面就来梳理一下Spring的另一核心AOP. 一, 什么是AOP 在软件业,AOP为Aspect ...
-
Spring框架入门之AOP
Spring框架入门之AOP 一.Spring AOP简单介绍 AOP AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented ...
-
JavaWeb框架_Struts2_(一)----->;Struts2 框架入门
1. 框架入门 2.1 Struts2简介 (1). Struts2是一种基于MVC模式的的轻量级Web开发框架. MVC模式:MVC全名是Model View Controller,是模型(mo ...
-
Spring Security框架入门
1.Spring Security框架入门 1.1 Spring Security简介 Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框 ...
-
CI框架入门1
CI框架入门: 1.url的特点 2.目录结构/布局 3.MVC分别在哪里,如何依葫芦画瓢 4.安全性 ...
-
【原创】NIO框架入门(四):Android与MINA2、Netty4的跨平台UDP双向通信实战
概述 本文演示的是一个Android客户端程序,通过UDP协议与两个典型的NIO框架服务端,实现跨平台双向通信的完整Demo. 当前由于NIO框架的流行,使得开发大并发.高性能的互联网服务端成为可能. ...
-
【原创】NIO框架入门(三):iOS与MINA2、Netty4的跨平台UDP双向通信实战
前言 本文将演示一个iOS客户端程序,通过UDP协议与两个典型的NIO框架服务端,实现跨平台双向通信的完整Demo.服务端将分别用MINA2和Netty4进行实现,而通信时服务端你只需选其一就行了.同 ...
随机推荐
-
TextInputLayout setError() setErrorEnable()
public void afterTextChanged(Editable s) { if (textInputLayout.getEditText().getText().toString().le ...
-
margin和padding的区别
目前web2.0已经越来被人们认可,因为喜欢搞web开发的人员不得不硬着头皮去学习web2.0的标准,其中很重要的一条就是新的布局规则,div+css.以前基本上是用table布局的,这种传统的方式简 ...
-
Interleaving String leetcode java
题目: Given s1, s2, s3, find whether s3 is formed by the interleaving of s1 and s2. For example, Given ...
-
python 安装pip的时候出现UnicodeEncodeError错误
另外 Python 中一个比较常见的问题是编码问题,若遇到类似"UnicodeEncodeError: 'ascii' codec can't encode character u'\u62 ...
-
common lisp wiki
CLiki: index http://www.cliki.net/
-
mysql无法启动,一直处于启动状态解决【Mac osx 】
最近,遇到一个问题,就是mac 使用homebrew 安装了mysql,今天使用mysql.server start,mysql无法启动了,restart还找不到pid,说明服务并没有启动! 错误如下 ...
-
变量内容的删除、取代与替换 (Optional)
变量除了可以直接设置来修改原本的内容之外,有没有办法通过简单的动作来将变量的内容进行微调呢? 举例来说,进行变量内容的删除.取代与替换等!是可以的!我们可以通过几个简单的小步骤来进行变量内容的微调喔! ...
-
Demystify Git
Git虽然很时髦,但是不好学,不好用. 关键是不好理解. 本文用最通俗易懂又直观的方式,帮助大家理解git, git的内部组织, 基本概念,还有常用 的工作流程. 本文来自墙外. 习某某说:" ...
-
oracle加密传输
参考文章: http://blog.itpub.net/24052272/viewspace-2129175/ oracle在传输过程中,正常是明文传输的,例如SQL以及执行的结果. 看看做的测试: ...
-
Azure 虚拟机诊断设置问题排查
Azure 为用户提供了可以自己配置的性能监控功能:Azure 诊断扩展.但是在具体配置中,经常会遇到各种各样的问题.不了解监控的工作机制常常给排查带来一定难度.这里我们整理了关于 Azure 虚拟机 ...