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. Splay 模板

    Splay 模板 struct SplayTree{ const static int maxn = 1e5 + 15; int ch[maxn][2] , key[maxn] , s[maxn] , ...

  2. 让机器教人学习更有效:Becoming the Expert - Interactive Multi-Class Machine Teaching

    这是CVPR2015的一篇非常有趣的文章,论文研究了如何让机器自动地教导学生进行学习目标的分类.论文研发了一种机器学习方法,通过人机交互的过程中,不断的优化机器指导的方法和技巧,从而提高人学习目标分类 ...

  3. Unity3D中的UnitySendMessage方法的使用

    UnitySendMessage(“string”,“string”, ***),这是方法,我们至少需要传入两个参数,第一个参数为unity中的一个gameobject名称,第二个参数为这个gameo ...

  4. 用 Apache 发布 ASP.NET 网站

    由于服务器需要发布 JSP .PHP.ASP.NET 几种网站进行测试,Apache 肯定是支持 JSP  和 PHP .鉴于 Apache 的开放精神 ,ASP.Net 应该也是支持的,于是乎 Go ...

  5. win7电脑遇到端口被占用的情况该如何查看并将其关闭

    转载:http://www.jb51.net/os/windows/203315.html 端口是我们在进行远程或者打印机等都会遇到的,但是有很多用户会遇到端口被占用的情况,有很多人不知道该如何查看电 ...

  6. MVC扩展DataAnnotationsModelMetadataProvider给model属性对应的页面元素添加任意属性和值

    比如,有这样一个类: public class User    {        public string Name { get; set; }    } 当在强类型视图页,显示属性Name对应的i ...

  7. C++ Primer 学习笔记_72_面向对象编程 --句柄类与继承[续]

    面向对象编程 --句柄类与继承[续] 三.句柄的使用 使用Sales_item对象能够更easy地编写书店应用程序.代码将不必管理Item_base对象的指针,但仍然能够获得通过Sales_item对 ...

  8. wireshark抓取本地回环及其问题

    一:The NPF driver isn't running 这个错误是因为没有开启NPF服务造成的. NPF即网络数据包过滤器(Netgroup Packet Filter,NPF)是Winpcap ...

  9. 在mac上命令行里面如何打开文本编辑器?

    在mac上命令行里面如何打开文本编辑器?   在linux命令行terminal上使用gedit直接就可以打开文本文件 那么在mac上面如何操作呢? 使用:open -a TextEdit setti ...

  10. 数学图形之Boy surface

    这是一个姓Boy的人发现的,所以取名为Boy surface.该图形与罗马图形有点相似,都是三分的图形.它甚至可以说是由罗马曲面变化而成的. 本文将展示几种Boy曲面的生成算法和切图,使用自己定义语法 ...