Spring AOP 应该是比较出名的了,今天说的是C#里的AOP,C#的AOP实现的方式有很多种,现在就先介绍静态代理的实现方案;

模拟场景:我们在删除用户,或者更新用户的时候进行数据原始备份,这样的话需要在删除操作进行之前进行一些数据相应的操作,但是我们又不想在删除操作里面做一些与删除无关的操作,这样使用AOP就解决这个问题了;更新操作也一样。

下面是示例代码(省略引用):

1、首先是实体类

namespace AOP_Test1
{
//实体类
public class User
{
public int id { get; set; }
public String name { get; set; }
public String password { get; set; }
//重写方法
public override string ToString()
{
return "id:" + id + ";name:" + name + ";password:" + password;
}
}
}

2、数据操作接口

namespace AOP_Test1
{
//接口,数据操作
public interface IUser
{
void delete(User user);
void update(User user);
}
}

3、接口实现

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace AOP_Test1
{
//IUser接口实现
public class IUserImpl:IUser
{
public void delete(User user) {
System.Console.WriteLine("删除用户");
}
public void update(User user) {
System.Console.WriteLine("更新用户");
}
}
}

4、对IUser进行装饰

namespace AOP_Test1
{
//IUser装饰类
public class IUserDecorator : IUser
{
public IUser iuser { get; set; }
public IUserDecorator(IUserImpl iUserImpl)
{
iuser = iUserImpl;
} //删除
public void delete(User user)
{
beforeDelete(user);
iuser.delete(user);
afterDelete(); }
protected void beforeDelete(User user)
{ Console.WriteLine(DateTime.Now + ":删除之前进行数据备份:");
Console.WriteLine("备份数据:" + user.ToString());
}
protected void afterDelete()
{
Console.WriteLine("删除操作完成.");
} //更新
public void update(User user)
{
beforeUpdate(user);
user.name = "TanWeijie";
iuser.update(user);
afterUpdate(user);
} protected void beforeUpdate(User user)
{ Console.WriteLine(DateTime.Now + ":更新之前进行数据备份:");
Console.WriteLine("更新前数据:" + user.ToString());
}
protected void afterUpdate(User user)
{
Console.WriteLine("更新操作完成.");
Console.WriteLine("更新后数据:" + user.ToString());
}
}
}

5、测试:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace AOP_Test1
{
class Program
{
static void Main(string[] args)
{
User user = new User();
user.id = 1;
user.name = "Tan";
user.password = "123456"; IUser iuser = new IUserDecorator(new IUserImpl());
iuser.delete(user);
Console.WriteLine();
iuser.update(user);
}
}
}

6、测试结果:

【敬请批评指正】

【.NET中AOP的实现方案】静态代理的更多相关文章

  1. 浅析Spring中AOP的实现原理——动态代理

    一.前言   最近在复习Spring的相关内容,刚刚大致研究了一下Spring中,AOP的实现原理.这篇博客就来简单地聊一聊Spring的AOP是如何实现的,并通过一个简单的测试用例来验证一下.废话不 ...

  2. 从静态代理,jdk动态代理到cglib动态代理-一文搞懂代理模式

    从代理模式到动态代理 代理模式是一种理论上非常简单,但是各种地方的实现往往却非常复杂.本文将从代理模式的基本概念出发,探讨代理模式在java领域的应用与实现.读完本文你将get到以下几点: 为什么需要 ...

  3. Java静态代理与动态代理实现

    一.什么是代理 代理是一种设计模式,它提供了一种通过代理访问目标对象的方式.在应用代理之前,我们调用对象的过程如下: 客户端直接调用对象并获取返回值.而应用了代理之后,我们调用对象的过程变成如下: 客 ...

  4. 8、Spring教程之静态代理/动态代理

    为什么要学习代理模式,因为AOP的底层机制就是动态代理! 代理模式: 静态代理 动态代理 学习aop之前 , 我们要先了解一下代理模式! 静态代理 静态代理角色分析 抽象角色 : 一般使用接口或者抽象 ...

  5. java静态代理与动态代理简单分析

    原创作品,可以转载,但是请标注出处地址http://www.cnblogs.com/V1haoge/p/5860749.html 1.动态代理(Dynamic Proxy) 代理分为静态代理和动态代理 ...

  6. java:java静态代理与动态代理简单分析

    java静态代理与动态代理简单分析 转载自:http://www.cnblogs.com/V1haoge/p/5860749.html 1.动态代理(Dynamic Proxy) 代理分为静态代理和动 ...

  7. java中代理,静态代理,动态代理以及spring aop代理方式,实现原理统一汇总

    若代理类在程序运行前就已经存在,那么这种代理方式被成为 静态代理 ,这种情况下的代理类通常都是我们在Java代码中定义的. 通常情况下, 静态代理中的代理类和委托类会实现同一接口或是派生自相同的父类. ...

  8. Spring学习总结(二)——静态代理、JDK与CGLIB动态代理、AOP+IoC

    一.为什么需要代理模式 假设需实现一个计算的类Math.完成加.减.乘.除功能,如下所示: package com.zhangguo.Spring041.aop01; public class Mat ...

  9. AOP静态代理解析1-标签解析

    AOP静态代理使用示例见Spring的LoadTimeWeaver(代码织入) Instrumentation使用示例见java.lang.instrument使用 AOP的静态代理主要是在虚拟机启动 ...

随机推荐

  1. 4、Redis中对List类型的操作命令

    写在前面的话:读书破万卷,编码如有神 -------------------------------------------------------------------- ------------ ...

  2. POJ 3320 Jessica's Reading Problem 尺取法/map

    Jessica's Reading Problem Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7467   Accept ...

  3. Effective JavaScript Item 35 使用闭包来保存私有数据

    本系列作为EffectiveJavaScript的读书笔记. JavaScript的对象系统从其语法上而言并不鼓舞使用信息隐藏(Information Hiding).由于当使用诸如this.name ...

  4. dmesg命令的使用

    dmesg命令用于打印Linux系统开机启动信息,kernel会将开机信息存储在ring buffer中.您若是开机时来不及查看信息,可利用dmesg来查看(print or control the ...

  5. IPHONE IOS6 模拟器没有HOME按键解决方法

    替代home键的快捷键是 Cmd-Shift-H: 双击HOME键就是 Cmd-Shift-H 按两次: 参考:http://www.cnblogs.com/yingkong1987/archive/ ...

  6. KJBitmap与KJHttp的深度用法

    摘要 本文原创,转载请注明地址:http://kymjs.com/code/2015/09/24/01这篇文章是对KJFrameForAndroid使用的一个深入学习 之前写过一些有关KJFrame的 ...

  7. sql把一个表的某几列的数据存到另一个表里

    一.如何用slq语句把一个表中的某几个字段的数据插入到另一个新表中,就要用下面这条slq语句:    insert into 表名1(字段1,字段2) select 字段1,字段2 from 表名2 ...

  8. DTree的改进与使用经验

    1.dtree.js源码 function Node(id, pid, name, url, title, target, icon, iconOpen, open) { this.id = id; ...

  9. eclipse无法启动

    -startupplugins/org.eclipse.equinox.launcher_1.0.201.R35x_v20090715.jar-showsplashorg.eclipse.platfo ...

  10. jquery、js获取table,遍历输出tr中各个td的内容。

    首先,依赖jquery.. $('#btntb').click(function(){ $('#tab tr').each(function(i){ // 遍历 tr $(this).children ...