从REPR设计模式看 .NET的新生代类库FastEndpoints的威力

本文介绍了REPR设计模式在.NET中的应用,以及FastEndpoints框架如何通过Endpoint模式、自定义绑定和内置安全特性提升WebAPI开发的现代性和效率。与传统Controller模式相比,FastEndpoints提供了更清晰、模块化的结构和更好的开发体验。
摘要由CSDN通过智能技术生成

序言

又到了一年年末,春节将至,提前给各位粉丝们拜个早年,祝各位年年顺风有顺水,发财又发福。

这次我给大家带来了新的API编程思路,一个新的设计模式REPR模式和FastEndpoints类库,希望大家评论区讨论。

38effec7155a489b0ef1e40ce2f8dae3.png

1. REPR设计模式

在 .NET 生态系统中,特别是在使用 C# 编程语言时,REPR(Resource, Endpoint, Processor, Repository)设计模式,是一种用于构建清晰、模块化且易于维护的应用程序架构的设计模式。

REPR 设计模式将应用程序划分为四个关键组件,每个组件都有其独特的职责,从而使代码更具可读性、可测试性和可扩展性。

614c323fb964ea94c99a0bb37e17373f.png

1.1 Resource(资源)

职责: Resource 是应用程序的外部接口,负责处理外部请求和响应。在 FastEndpoints 中,可以将上文提到的 Endpoint 视为 Resource,因为每个 Endpoint 表示应用程序对外提供的一个资源或服务。

[Route("/users")]
public class UserEndpoint
{
    [HttpGet]
    public async Task<IActionResult> GetUsers()
    {
        // 外部请求处理逻辑
        var users = await _userService.GetAllUsersAsync();
        return Ok(users);
    }
}

1.2 Endpoint(端点)

职责: Endpoint 代表应用程序的一个具体端点或资源,负责处理来自 Resource 的请求,调用 Processor 进行业务处理,然后返回响应。Endpoint 在 REPR 模式中相当于控制器(Controller)的角色,但由于 FastEndpoints 框架的引入,Endpoint 更加轻量、直观。

[Route("/users")]
public class UserEndpoint
{
    [HttpGet]
    public async Task<IActionResult> GetUsers()
    {
        // 处理业务逻辑
        var users = await _userService.GetAllUsersAsync();
        return Ok(users);
    }
}

1.3 Processor(处理器)

职责: Processor 负责处理 Endpoint 中的业务逻辑,包括数据处理、验证、调用服务等。它将 Endpoint 从具体的业务细节中解耦,使得 Endpoint 只需关注请求的处理流程,而具体的业务逻辑由 Processor 完成。

public class UserProcessor
{
    private readonly IUserService _userService;

    public UserProcessor(IUserService userService)
    {
        _userService = userService;
    }

    public async Task<IEnumerable<User>> GetAllUsersAsync()
    {
        // 具体的业务逻辑处理
        return await _userService.GetAllUsersAsync();
    }
}

1.4 Repository(存储库)

职责: Repository 负责与数据存储交互,提供对数据的访问操作。它隐藏了底层数据存储的细节,使 Processor 和 Endpoint 无需关心数据的具体存储细节,提高了系统的可维护性和扩展性。

public class UserRepository : IUserRepository
{
    public async Task<IEnumerable<User>> GetAllUsersAsync()
    {
        // 数据库查询操作
        return await dbContext.Users.ToListAsync();
    }

    // 其他数据访问操作...
}

通过采用 REPR 设计模式,我们将应用程序划分为清晰的组件,每个组件都有着独特的职责,使得代码结构更加模块化和可维护。

这种模式的设计让开发者能够更加专注于每个组件的实现,提高了代码的可测试性和可读性。

同时,REPR 模式在 FastEndpoints 的框架下得到更好的体现,使得 Endpoint 的设计更加轻松而直观,为 .NET 开发者提供了一种优雅而高效的开发方式。

2. FastEndpoints类库介绍

9f0e564bb0e5ee6441628c2b5af0c15d.png

FastEndpoints 类库是一款为 .NET Web API 开发而设计的创新性框架,通过引入独特的设计理念和先进的模式,为开发者提供了更现代、直观的开发体验。以下是该类库的主要优势对比:

  1. Endpoint 模式:

  • FastEndpoints: 引入了 Endpoint 模式,将每个端点看作一个独立的业务单元,使代码更具模块化和清晰性。

  • 传统方式: 传统的 MVC 模式需要使用控制器,结构相对繁琐,业务逻辑与结构耦合度高。

基于特性的路由配置:

  • FastEndpoints: 使用特性直接在 Endpoint 方法上定义路由规则,简化了路由配置,使代码更易维护。

  • 传统方式: 传统的全局路由配置文件相对繁琐,需要额外的配置。

响应式编程支持:

  • FastEndpoints: 天然支持响应式编程,通过引入 async/await 模式,处理异步操作更加方便。

  • 传统方式: 传统回调方式相对冗长,嵌套的回调函数降低了代码的可读性。

REPR 设计模式:

  • FastEndpoints: 采用 REPR 设计模式,将应用程序划分为 Resource、Endpoint、Processor、Repository 四个组件,提高了代码的可维护性和可测试性。

  • 传统方式: 传统 MVC 模式下缺乏清晰的组件划分,容易造成代码混乱和难以维护。

GitHub 社区支持:

  • FastEndpoints: 在 GitHub 上托管,得到了活跃的社区支持和贡献者的不断改进,框架不断演进。

  • 传统方式: 传统框架可能缺乏开放的社区平台,更新和改进相对较慢。

通过这些优势,FastEndpoints 类库为 .NET 开发者提供了更加高效、清晰、现代的 Web API 开发方式。在设计和使用上的创新使得开发者能够更专注于业务逻辑的实现,提高了整体的开发体验。

3. 开启上手模式

3.1 安装 FastEndpoints NuGet 包

e08483f56fbf1c27dfe3f56adfdeba6d.png

首先,在你的项目中安装 FastEndpoints NuGet 包。可以使用以下命令:

dotnet add package FastEndpoints

3.2 创建 Endpoint 类

FastEndpoints 引入了 Endpoint 的概念,每个 Endpoint 都是一个处理请求的独立单元。创建一个简单的 Endpoint:

using FastEndpoints;

public class HelloWorldEndpoint
{
    [HttpGet("/hello")]
    public string Hello() => "Hello, World!";
}

3.3 注册 Endpoint 到服务中

在 Startup.cs 中配置服务并注册 Endpoint:

using FastEndpoints;

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddFastEndpoints();
    }

    public void Configure(IApplicationBuilder app)
    {
        app.UseFastEndpoints(endpoints =>
        {
            endpoints.RegisterEndpoint<HelloWorldEndpoint>();
        });
    }
}

3.4 模型绑定重定义

FastEndpoints 支持自定义模型绑定方式。例如,你可以重新定义 JSON 请求的模型绑定:

using FastEndpoints;

public class JsonModelBinder : IModelBinder
{
    public async Task<object?> BindModelAsync(HttpContext httpContext, Type modelType)
    {
        using var reader = new StreamReader(httpContext.Request.Body);
        var content = await reader.ReadToEndAsync();
        return JsonSerializer.Deserialize(content, modelType);
    }
}

[ModelBinder(typeof(JsonModelBinder))]
public class CustomModel
{
    public string Name { get; set; }
}

3.5 安全性

FastEndpoints 提供了一些内建的安全性特性,例如授权和身份验证。可以通过属性在 Endpoint 上定义安全性。

using FastEndpoints;

[Authorize(Roles = "Admin")]
public class AdminEndpoint
{
    [HttpGet("/admin")]
    public string AdminPanel() => "Welcome to Admin Panel!";
}

4 与传统 Controller 模式对比

- Endpoint 模式:

更清晰的组织,每个 Endpoint 独立,降低耦合。不需要继承基类,减少层级,提高可读性。

- 模型绑定重定义:

FastEndpoints 允许更灵活的模型绑定方式,可根据需要自定义。
Controller 模式需要在整个控制器中使用相同的绑定方式。
- 安全性:

FastEndpoints 内建安全性属性,可直接应用在 Endpoint 上。
Controller 模式需要在整个控制器中使用相同的身份验证和授权属性。

总结

FastEndpoints 提供了一种更现代、直观的方式来构建 Web API,通过引入 Endpoint 模式、自定义模型绑定和内建的安全性特性,使得开发体验更为轻松。
与传统的 Controller 模式相比,FastEndpoints 提供了更清晰、模块化的组织结构,降低了代码的耦合度。在实际项目中,你可以根据需求选择适合你团队的方式。

👓都看到这了,还在乎点个赞吗?

👓都点赞了,还在乎一个收藏吗?

👓都收藏了,还在乎一个评论吗?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值