当前位置: 华文头条 > 推荐

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

2024-02-09推荐

序言

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

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

1. REPR设计模式

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

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

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类库介绍

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 包

    首先,在你的项目中安装 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 提供了更清晰、模块化的组织结构,降低了代码的耦合度。在实际项目中,你可以根据需求选择适合你团队的方式。

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