C# AOP动态代理的使用【站在巨人的肩膀上编程:调包】

2 篇文章 0 订阅

背景

之前本人发布过一篇简单实现AOP的博客,那个主要针对的是需要代理的类不变,而代理前置后置处理经常发生变化的情况。最近遇到前置后置处理不变,而需要代理的类经常变化的情况,所以我们必须学习新的代理设计满足当下的需求。

方案

1、 安装Castle.Core库

2、 编写【公有】接口IStudent,其需要代理的方法为Study

public interface IStudent
{
    void Study();
}

3、 编写其实现类Student,将Study方法标记为【virtual】虚拟方法,仅此可被代理实现所覆盖

public class Student : IStudent
{
    public virtual void Study()
    {
        Console.WriteLine("我在学习");
    }
}

 4、引用Castle库的命名空间

using Castle.DynamicProxy;

 5、编写代理类的实现代码,代理类实现IInterceptor接口,invocation.Proceed方法就是被代理的方法,使用语法这里不多赘述,有兴趣的朋友请仔细阅读源码

 internal class StudentProxy: IInterceptor
 {
     public void Intercept(IInvocation invocation)
     {
         Console.WriteLine("前置处理");
         invocation.Proceed();
         Console.WriteLine("后置处理");
     }
 }

6、把代理类和被代理类关联起来使用

internal class Program
{
    static void Main(string[] args)
    {
        ProxyGenerator proxyGenerator = new ProxyGenerator();
        StudentProxy studentInterceptor = new StudentProxy();
        Student student = proxyGenerator.CreateClassProxy<Student>(studentInterceptor);
        student.Study();
    }
}

7、执行代码

8、完整代码

using Castle.DynamicProxy;

namespace 知识学习
{
    internal class Program
    {
        static void Main(string[] args)
        {

            ProxyGenerator proxyGenerator = new ProxyGenerator();
            StudentProxy studentInterceptor = new StudentProxy();
            Student student = proxyGenerator.CreateClassProxy<Student>(studentInterceptor);

            student.Study();
        }
    }

    public interface IStudent
    {
        void Study();
    }

    public class Student : IStudent
    {
        public virtual void Study()
        {
            Console.WriteLine("我在学习");
        }
    }

    internal class StudentProxy : IInterceptor
    {
        public void Intercept(IInvocation invocation)
        {
            Console.WriteLine("前置处理");
            invocation.Proceed();
            Console.WriteLine("后置处理");
        }
    }
}

 9、使用场景

被代理类经常需要变化,而代理的前置后置处理基本不变的时候,推荐使用这种动态代理实现方式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值