首页
/ FastEndpoints项目中实现全局后处理器共享端点状态的最佳实践

FastEndpoints项目中实现全局后处理器共享端点状态的最佳实践

2025-06-08 06:38:25作者:俞予舒Fleming

在FastEndpoints框架开发过程中,我们经常需要在全局后处理器(GlobalPostProcessor)中访问特定端点的自定义数据。本文将以一个实际场景为例,详细介绍如何优雅地实现端点状态共享。

典型应用场景

假设我们正在开发一个API服务,其中每个端点调用都需要记录信用消耗情况。不同端点具有不同的信用成本,例如:

  • 个人邮箱查询端点消耗3个信用点
  • 企业信息查询端点消耗5个信用点

我们需要在全局日志处理器中获取这些端点特定的数据,但又不希望在每个处理器中硬编码这些信息。

解决方案架构

FastEndpoints提供了完善的端点状态共享机制,我们可以通过以下方式实现:

  1. 端点类定义:在端点类中声明常量数据
public class FindPersonalEmailEndpoint : Endpoint<PersonalEmailRequest, EmailResponse>
{
    public const string EndpointName = "Personal Email";
    public const int EndpointCost = 3;
    
    public override void Configure()
    {
        Get("/find/personal_email");
        Summary(s => s.Summary = EndpointName);
    }
}
  1. 全局后处理器实现:通过上下文获取端点实例
public class CreditLogPostProcessor : IGlobalPostProcessor
{
    public Task PostProcessAsync(IPostProcessorContext context, CancellationToken ct)
    {
        if (context.Endpoint is FindPersonalEmailEndpoint personalEmailEndpoint)
        {
            var credits = personalEmailEndpoint.EndpointCost;
            var endpointName = personalEmailEndpoint.EndpointName;
            // 记录日志逻辑...
        }
        return Task.CompletedTask;
    }
}

进阶技巧

对于更复杂的场景,我们可以采用以下优化方案:

  1. 接口抽象:定义统一接口规范端点行为
public interface ICreditCostEndpoint
{
    int CreditCost { get; }
    string EndpointName { get; }
}

public class FindPersonalEmailEndpoint : Endpoint<...>, ICreditCostEndpoint
{
    public int CreditCost => 3;
    public string EndpointName => "Personal Email";
    // ...
}
  1. 类型安全检查:在后处理器中进行安全转换
if (context.Endpoint is ICreditCostEndpoint creditEndpoint)
{
    // 访问creditEndpoint.CreditCost等属性
}

设计考量

这种设计模式具有以下优势:

  • 解耦性:端点与处理器之间保持松耦合
  • 可维护性:信用成本等业务参数集中在端点定义中
  • 扩展性:新增端点类型无需修改处理器代码
  • 类型安全:通过接口和类型检查确保运行时安全

最佳实践建议

  1. 对于简单场景,直接使用端点类中的公共字段/属性
  2. 对于复杂系统,推荐使用接口抽象模式
  3. 考虑将共享状态封装为特定类型的对象,而非分散的字段
  4. 在处理器中添加适当的null检查和类型验证

通过这种设计,我们可以构建出既灵活又健壮的API服务,满足业务需求的同时保持代码的整洁和可维护性。

登录后查看全文
热门项目推荐
相关项目推荐