ASP.NET Boilerplate 中的面向切面编程(AOP)与拦截器实践指南

ASP.NET Boilerplate 中的面向切面编程(AOP)与拦截器实践指南

aspnetboilerplate aspnetboilerplate: 是一个开源的 ASP.NET Core 应用程序框架,提供了各种开箱即用的功能和模块,方便开发者构建可扩展和可维护的 Web 应用程序。适合开发者使用 ASP.NET Core 构建企业级 Web 应用程序。 aspnetboilerplate 项目地址: https://gitcode.com/gh_mirrors/as/aspnetboilerplate

什么是面向切面编程(AOP)?

面向切面编程(AOP)是一种编程范式,它通过将横切关注点(如日志记录、授权、验证等)与核心业务逻辑分离来提高代码的模块化程度。在ASP.NET Boilerplate框架中,AOP主要通过方法拦截器(Interceptors)来实现。

传统方式 vs AOP方式

传统实现方式的问题

在没有使用AOP的传统方式中,我们经常会在业务方法中混杂各种非核心逻辑:

public void CreateTask(CreateTaskInput input)
{
    // 日志记录
    _logger.Debug("Running CreateTask method...");
    
    try
    {
        // 参数验证
        if (input == null) throw new ArgumentNullException();
        
        // 权限检查
        if (!_permissionChecker.IsGranted("TaskCreationPermission"))
            throw new Exception("No permission!");
            
        // 核心业务逻辑
        _taskRepository.Insert(new Task(...));
    }
    catch (Exception ex)
    {
        // 异常处理
        _logger.Error(ex.Message, ex);
        throw;
    }
    
    // 更多日志记录
    _logger.Debug("CreateTask completed!");
}

这种方式会导致:

  1. 代码重复率高
  2. 业务逻辑不清晰
  3. 维护困难

AOP方式的优势

使用AOP后,同样的功能可以简化为:

[AbpAuthorize("TaskCreationPermission")]
public void CreateTask(CreateTaskInput input)
{
    // 纯粹的业务逻辑
    _taskRepository.Insert(new Task(...));
}

ASP.NET Boilerplate已经内置了许多常用的AOP功能,如:

  • 自动参数验证
  • 异常处理
  • 审计日志
  • 授权检查

创建自定义拦截器

当我们需要实现特定于应用的横切关注点时,可以创建自定义拦截器。下面是一个测量方法执行时间的拦截器示例:

public class MeasureDurationInterceptor : AbpInterceptorBase, ITransientDependency
{
    public ILogger Logger { get; set; }

    public MeasureDurationInterceptor()
    {
        Logger = NullLogger.Instance;
    }

    public override void InterceptSynchronous(IInvocation invocation)
    {
        var stopwatch = Stopwatch.StartNew();
       
        // 执行实际方法
        invocation.Proceed();
       
        stopwatch.Stop();
        Logger.Info($"方法 {invocation.Method.Name} 执行耗时: {stopwatch.Elapsed.TotalMilliseconds} ms");
    }
}

关键点说明:

  1. 继承AbpInterceptorBase基类
  2. 实现ITransientDependency表示这是一个瞬态依赖
  3. 通过IInvocation可以获取方法信息、参数等
  4. Proceed()方法执行被拦截的实际方法

注册拦截器

创建拦截器后,需要将其注册到目标类上。以下是注册到所有应用服务的最佳实践:

public static class MeasureDurationInterceptorRegistrar
{
    public static void Initialize(IIocManager iocManager)
    {
        iocManager.IocContainer.Kernel.ComponentRegistered += (key, handler) =>
        {
            if (typeof(IApplicationService).IsAssignableFrom(handler.ComponentModel.Implementation))
            {
                handler.ComponentModel.Interceptors.Add(
                    new InterceptorReference(typeof(AbpAsyncDeterminationInterceptor<MeasureDurationInterceptor>)));
            }
        };
    }
}

然后在模块的PreInitialize方法中调用:

public override void PreInitialize()
{
    MeasureDurationInterceptorRegistrar.Initialize(IocManager);
}

异步方法拦截

拦截异步方法需要特殊处理,因为异步方法会立即返回Task。以下是支持异步的拦截器实现:

protected override async Task InternalInterceptAsynchronous(IInvocation invocation)
{
    var proceedInfo = invocation.CaptureProceedInfo();
    var stopwatch = Stopwatch.StartNew();

    proceedInfo.Invoke();
    var task = (Task)invocation.ReturnValue;
    await task;

    stopwatch.Stop();
    Logger.Info($"异步方法 {invocation.Method.Name} 执行耗时: {stopwatch.Elapsed.TotalMilliseconds} ms");
}

protected override async Task<TResult> InternalInterceptAsynchronous<TResult>(IInvocation invocation)
{
    var proceedInfo = invocation.CaptureProceedInfo();
    var stopwatch = Stopwatch.StartNew();

    proceedInfo.Invoke();
    var taskResult = (Task<TResult>)invocation.ReturnValue;
    var result = await taskResult;

    stopwatch.Stop();
    Logger.Info($"异步方法 {invocation.Method.Name} 执行耗时: {stopwatch.Elapsed.TotalMilliseconds} ms");

    return result;
}

实际应用场景

ASP.NET Boilerplate中的拦截器技术可以应用于多种场景:

  1. 性能监控:如上面的执行时间测量
  2. 缓存:方法结果缓存
  3. 重试机制:对特定异常自动重试
  4. 审计日志:记录敏感操作
  5. 自定义验证:特定业务规则的验证

最佳实践

  1. 拦截器应尽量保持轻量级,避免复杂逻辑
  2. 注意拦截器的执行顺序
  3. 对于性能关键路径,谨慎使用拦截器
  4. 合理处理异步方法
  5. 提供清晰的日志和错误信息

通过合理使用AOP和拦截器,可以显著提高ASP.NET Boilerplate应用程序的代码质量和可维护性,使开发者能够更专注于核心业务逻辑的实现。

aspnetboilerplate aspnetboilerplate: 是一个开源的 ASP.NET Core 应用程序框架,提供了各种开箱即用的功能和模块,方便开发者构建可扩展和可维护的 Web 应用程序。适合开发者使用 ASP.NET Core 构建企业级 Web 应用程序。 aspnetboilerplate 项目地址: https://gitcode.com/gh_mirrors/as/aspnetboilerplate

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

萧崧锟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值