Loading

C#实现AOP的几种方式

什么是AOP

AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的中统一处理业务逻辑的一种技术,比较常见的场景是:日志记录,错误捕获、性能监控等。AOP的本质是通过代理对象来间接执行真实对象,在代理类中往往会添加装饰一些额外的业务代码。

AOP的实现方式

  • 静态织入(编译时AOP)
  • 动态织入(运行时AOP)
    • 通过设计模式:代理模式
    • 使用system.remoting :基于透明代理/真实代理实现(TransparentProxy/RealProxy)
    • 使用emit动态生成代码

静态织入

通过扩展编译器对代码的中间语言(IL)插入代码的方式实现对目标对象的调用拦截。即在编译时,就将各种涉及AOP拦截的代码注入到符合一定规则的类中,编译后的代码与我们直接在RealA调用属性或方法前后增加代码是相同的,只是这个工作交由编译器来完成。
优点:快
缺点:
框架:postSharp

设计模式:代理模式

优点:简单,纯靠设计模式实现
缺点:无法批量

通过接口实现

//接口
public interface IUserController
{
    void login();
    void register();
}
//实现IUserController接口
public class UserController{
    public UserController()
    {
    }

    public void register()
    {
        //do something
    }

    public void login()
    {
        //do something
    }
}

//代理类同样实现接口,在方法执行前后可以添加其他处理
public class UserControllerProxy : IUserController
{
    IUserController userController = null;
    public UserControllerProxy(IUserController userController)//传入实现该接口的对象
    {
        this.userController = userController;
    }

    public void login(string test)
    {
        Console.WriteLine("开始前");
        userController.login("");
        Console.WriteLine("开始后");
    }

    public void register(string test)
    {
        Console.WriteLine("开始前");
        userController.register("");
        Console.WriteLine("开始后");
    }
}

//使用示例
UserControllerProxy userControllerProxy = new UserControllerProxy(new UserController());
userControllerProxy.login();
userControllerProxy.register();

通过继承实现

...

优劣对比

组合模式更灵活,对于接口的所有子类都可以代理。缺点是会【所有方法】都需要代理,不需要扩展的方法也需要。
继承模式的优点在于只针对需要的方法进行代理,缺点是只能针对单一父类进行代理。

动态代理

如果多个原始类都需要类似的代理,那么需要添加许多代理类,并且那些代理类都是类似的代码。所以需要动态代理,在运行时动态的创建原始类对应的代理类,然后再使用时用代理类替换原始类。

Emit 运行时生成

Castle.DynamicProxy

TransparentProxy/RealProxy

总结

比较

copy链接

1

posted @ 2025-03-12 22:33  一起滚月球  阅读(68)  评论(0)    收藏  举报