C# AOP框架入门

时间:2021-07-29 10:27:39

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

1 项目结构

C# AOP框架入门

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);
}
}
}

C# AOP框架入门

调试代码如下:

             //测试感觉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框架入门的更多相关文章

  1. C&num; AOP框架入门(转)

    出处:https://www.cnblogs.com/isaboy/p/Csharp_AOP_Log.html AOP面向切面编程(Aspect Oriented Programming),是通过预编 ...

  2. &lbrack;Spring框架&rsqb;Spring AOP基础入门总结二&colon;Spring基于AspectJ的AOP的开发&period;

    前言: 在上一篇中: [Spring框架]Spring AOP基础入门总结一. 中 我们已经知道了一个Spring AOP程序是如何开发的, 在这里呢我们将基于AspectJ来进行AOP 的总结和学习 ...

  3. &lbrack;Spring框架&rsqb;Spring AOP基础入门总结一&period;

    前言:前面已经有两篇文章讲了Spring IOC/DI 以及 使用xml和注解两种方法开发的案例, 下面就来梳理一下Spring的另一核心AOP. 一, 什么是AOP 在软件业,AOP为Aspect ...

  4. Spring框架入门之AOP

    Spring框架入门之AOP 一.Spring AOP简单介绍 AOP AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented ...

  5. JavaWeb框架&lowbar;Struts2&lowbar;&lpar;一&rpar;-----&gt&semi;Struts2 框架入门

    1.  框架入门 2.1  Struts2简介 (1). Struts2是一种基于MVC模式的的轻量级Web开发框架. MVC模式:MVC全名是Model View Controller,是模型(mo ...

  6. Spring Security框架入门

    1.Spring Security框架入门 1.1 Spring Security简介 Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框 ...

  7. CI框架入门1

    CI框架入门: 1.url的特点             2.目录结构/布局             3.MVC分别在哪里,如何依葫芦画瓢             4.安全性             ...

  8. 【原创】NIO框架入门&lpar;四&rpar;:Android与MINA2、Netty4的跨平台UDP双向通信实战

    概述 本文演示的是一个Android客户端程序,通过UDP协议与两个典型的NIO框架服务端,实现跨平台双向通信的完整Demo. 当前由于NIO框架的流行,使得开发大并发.高性能的互联网服务端成为可能. ...

  9. 【原创】NIO框架入门&lpar;三&rpar;:iOS与MINA2、Netty4的跨平台UDP双向通信实战

    前言 本文将演示一个iOS客户端程序,通过UDP协议与两个典型的NIO框架服务端,实现跨平台双向通信的完整Demo.服务端将分别用MINA2和Netty4进行实现,而通信时服务端你只需选其一就行了.同 ...

随机推荐

  1. TextInputLayout setError&lpar;&rpar; setErrorEnable&lpar;&rpar;

    public void afterTextChanged(Editable s) { if (textInputLayout.getEditText().getText().toString().le ...

  2. margin和padding的区别

    目前web2.0已经越来被人们认可,因为喜欢搞web开发的人员不得不硬着头皮去学习web2.0的标准,其中很重要的一条就是新的布局规则,div+css.以前基本上是用table布局的,这种传统的方式简 ...

  3. Interleaving String leetcode java

    题目: Given s1, s2, s3, find whether s3 is formed by the interleaving of s1 and s2. For example, Given ...

  4. python 安装pip的时候出现UnicodeEncodeError错误

    另外 Python 中一个比较常见的问题是编码问题,若遇到类似"UnicodeEncodeError: 'ascii' codec can't encode character u'\u62 ...

  5. common lisp wiki

    CLiki: index   http://www.cliki.net/

  6. mysql无法启动,一直处于启动状态解决【Mac osx 】

    最近,遇到一个问题,就是mac 使用homebrew 安装了mysql,今天使用mysql.server start,mysql无法启动了,restart还找不到pid,说明服务并没有启动! 错误如下 ...

  7. 变量内容的删除、取代与替换 (Optional)

    变量除了可以直接设置来修改原本的内容之外,有没有办法通过简单的动作来将变量的内容进行微调呢? 举例来说,进行变量内容的删除.取代与替换等!是可以的!我们可以通过几个简单的小步骤来进行变量内容的微调喔! ...

  8. Demystify Git

    Git虽然很时髦,但是不好学,不好用. 关键是不好理解. 本文用最通俗易懂又直观的方式,帮助大家理解git, git的内部组织, 基本概念,还有常用 的工作流程. 本文来自墙外. 习某某说:&quot ...

  9. oracle加密传输

    参考文章: http://blog.itpub.net/24052272/viewspace-2129175/ oracle在传输过程中,正常是明文传输的,例如SQL以及执行的结果. 看看做的测试: ...

  10. Azure 虚拟机诊断设置问题排查

    Azure 为用户提供了可以自己配置的性能监控功能:Azure 诊断扩展.但是在具体配置中,经常会遇到各种各样的问题.不了解监控的工作机制常常给排查带来一定难度.这里我们整理了关于 Azure 虚拟机 ...