当前位置:首页 > C# > 正文

C#动态代理实战指南(使用Castle DynamicProxy实现AOP编程)

在现代软件开发中,C#动态代理是一种强大的技术,它允许我们在运行时创建代理对象,从而实现如日志记录、权限验证、性能监控等横切关注点的统一处理。而 Castle DynamicProxy 是 .NET 平台上最流行、最成熟的动态代理库之一。本文将手把手教你如何使用 Castle DynamicProxy 实现 动态代理实现,即使是编程小白也能轻松上手!

什么是动态代理?

动态代理是指在程序运行时动态生成一个类或对象,该代理对象可以拦截对目标对象方法的调用,并在调用前后插入自定义逻辑。这种机制是实现 C# AOP编程(面向切面编程)的核心技术。

C#动态代理实战指南(使用Castle DynamicProxy实现AOP编程) C#动态代理 Castle DynamicProxy教程 动态代理实现 C# AOP编程 第1张

为什么选择 Castle DynamicProxy?

  • 开源免费,社区活跃
  • 支持接口代理和类代理(需虚方法)
  • 性能优秀,被广泛用于 Autofac、NHibernate 等知名框架
  • API 简洁易用,学习成本低

第一步:安装 Castle DynamicProxy

打开你的 Visual Studio 项目,在 NuGet 包管理器中执行以下命令:

Install-Package Castle.Core

注意:Castle DynamicProxy 是 Castle.Core 的一部分,无需单独安装其他包。

第二步:定义目标接口和实现类

我们先创建一个简单的服务接口和其实现:

public interface ICalculator{    int Add(int a, int b);    int Multiply(int a, int b);}public class Calculator : ICalculator{    public int Add(int a, int b)    {        Console.WriteLine($"正在计算 {a} + {b}");        return a + b;    }    public int Multiply(int a, int b)    {        Console.WriteLine($"正在计算 {a} * {b}");        return a * b;    }}

第三步:创建拦截器(Interceptor)

拦截器是动态代理的核心,它决定了在方法调用前后执行什么逻辑。我们需要实现 Castle 的 IInterceptor 接口:

using Castle.DynamicProxy;public class LoggingInterceptor : IInterceptor{    public void Intercept(IInvocation invocation)    {        // 方法调用前        var methodName = invocation.Method.Name;        var args = string.Join(", ", invocation.Arguments);        Console.WriteLine($"[日志] 开始调用方法: {methodName}({args})");        // 执行原始方法        invocation.Proceed();        // 方法调用后        var returnValue = invocation.ReturnValue;        Console.WriteLine($"[日志] 方法 {methodName} 返回: {returnValue}");    }}

第四步:生成代理对象并使用

现在,我们将使用 Castle 的 ProxyGenerator 来创建带拦截器的代理对象:

using Castle.DynamicProxy;class Program{    static void Main(string[] args)    {        // 创建代理生成器        var proxyGenerator = new ProxyGenerator();        // 创建原始对象        var calculator = new Calculator();        // 创建带拦截器的代理        var proxy = proxyGenerator.CreateInterfaceProxyWithTarget<ICalculator>(            calculator,            new LoggingInterceptor()        );        // 调用代理方法        var result1 = proxy.Add(3, 5);        var result2 = proxy.Multiply(4, 7);        Console.WriteLine($"最终结果: Add={result1}, Multiply={result2}");    }}

运行结果

执行上述代码,你将看到如下输出:

[日志] 开始调用方法: Add(3, 5)正在计算 3 + 5[日志] 方法 Add 返回: 8[日志] 开始调用方法: Multiply(4, 7)正在计算 4 * 7[日志] 方法 Multiply 返回: 28最终结果: Add=8, Multiply=28

可以看到,我们的日志逻辑成功地“环绕”了原始方法的执行,而原始代码完全没有修改——这正是 C# AOP编程 的魅力所在!

扩展:代理类(而非接口)

如果你需要代理一个类(而不是接口),只需确保类中的方法是 virtual 的,并使用 CreateClassProxy 方法:

public class Calculator{    public virtual int Add(int a, int b) // 必须是 virtual    {        return a + b;    }}// 创建类代理var proxy = proxyGenerator.CreateClassProxy<Calculator>(new LoggingInterceptor());

总结

通过本教程,你已经掌握了如何使用 Castle DynamicProxy 实现 C#动态代理。这项技术不仅能让你的代码更干净、更模块化,还能轻松实现日志、缓存、事务等通用功能。无论是构建企业级应用还是学习 动态代理实现 原理,Castle DynamicProxy 都是一个值得掌握的利器。

赶快动手试试吧!你可以尝试添加性能计时、异常处理等更多拦截器,深入体验 C# AOP编程 的强大能力。