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、测试结果:

【敬请批评指正】
分享到:
相关推荐
有一些完整的AOP框架,如Spring.NET和NAspect,它们提供了一套完整的面向切面编程解决方案,包括切点表达式、通知(advice)、切面(aspect)等概念。这些框架使得AOP的使用更加标准化,但也增加了项目依赖。 在...
在AOP中,可以通过IL Emit创建一个代理类,该类实现目标接口,并在代理类的方法中添加拦截逻辑。例如,对于实现了IFoobar接口的Foobar类,可以生成一个FoobarProxy代理类,该类同样实现IFoobar接口并在Invoke方法中...
在Spring.NET中,AOP通过代理机制实现,分为两种类型:静态代理和动态代理。静态代理通常在编译时创建,而动态代理则在运行时创建。 围绕通知是Spring.NET AOP中的一个重要概念,它是一种特殊的通知类型,可以在...
本文将深入探讨如何在Unity中实现AOP,并基于"MyAOP(AOP拓展实现小例子).zip"的项目进行解析。 首先,我们需要理解Unity中的AOP基础。Unity本身并不内置对AOP的支持,但我们可以通过引入第三方库或自定义解决方案来...
在.NET框架中实现AOP技术,首先需要理解AOP的概念及其技术特点。AOP将软件开发中通用的服务功能与核心业务逻辑分离,通过引入交叉关注点的概念,开发者可以更好地封装和互操作程序。AOP的核心思想是将业务逻辑与非...
2. **Spring.Aop**: 实现了.NET平台上的面向切面编程,支持动态代理和静态代理两种方式。开发者可以定义切面,将通用行为如事务管理、日志记录等与业务逻辑分离。 3. **Spring.Data**: 提供了一种统一的数据库访问...
DLL注入在Windows平台上相对常见,但在Unity中实现则需要特殊的技术手段。因为Unity的沙盒环境限制了对游戏进程的直接访问,所以通常会通过以下步骤实现: 1. **创建DLL**:首先,你需要编写一个C#库(DLL),包含...
在.NET中,可以使用接口实现动态代理,例如AOP(面向切面编程)框架中的拦截器,用于添加日志、事务控制等功能。 5. 观察者模式:定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象...
本文将深入探讨标题"spring-zwz.zip"所提及的几个关键概念,包括第一个Spring程序、IOC(Inversion of Control,控制反转)、DI(Dependency Injection,依赖注入)、静态代理和动态代理,以及AOP(Aspect-Oriented ...
在.NET中,动态代理(如System.Reflection.Emit或System.Proxy)可以实现运行时创建代理类,用于拦截方法调用,实现AOP(面向切面编程)。 行为型模式中的策略模式允许在运行时选择算法或策略。通过定义一系列可...
C#中的远程代理和虚拟代理可以通过.NET Remoting或WCF实现,而拦截器模式则可以使用AOP(面向切面编程)框架如PostSharp实现。 7. **命令模式**:将请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;...
9. **反射和动态代理**:反射允许程序在运行时检查和操作类、接口、字段和方法,动态代理则可以在运行时创建并实现接口的代理类,常用于AOP(面向切面编程)。 10. **设计模式**:设计模式是解决软件设计中常见问题...
YIIHAW 作为 .NET 平台上的静态跨语言方面编织器,为开发者提供了高效、无运行时开销的 AOP 解决方案。通过理解并应用 YIIHAW,开发人员可以更好地组织代码,提高软件的可维护性和可扩展性。开源特性使得 YIIHAW ...
9. **动态代理**:通过反射可以创建动态代理,实现AOP(面向切面编程)或拦截器模式。 10. **序列化和反序列化**:在序列化和反序列化过程中,反射可以帮助我们处理非标准的序列化需求。 总的来说,反射工具提供了...
C#中实现AOP的方式包括使用特性(Attributes)和动态代理,如Unity Container、Autofac等依赖注入容器支持的AOP特性。 "通用实用程序"通常包括各种辅助函数、工具类和静态类,它们提供了一些常见的功能,如字符串...