背景
之前本人发布过一篇简单实现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、使用场景
被代理类经常需要变化,而代理的前置后置处理基本不变的时候,推荐使用这种动态代理实现方式