我在写MinimalAPI的时候,发现不能最清晰的看到每个API,原因就是:WebAPI中不断增长逻辑处理过程

于是我在想如何简化API至一行,在一点一点想办法中,发现了简化DotNET Minimal API的方式。特此记录下来这个思路给需要帮助的人。我的灵感来源于 C# 11 功能 - 接口中的静态虚拟成员,通过静态虚拟成员清晰整个API。


这是我思路的最终结果:在 Program.cs 中设置中我们能通过一行代码,清晰的看到代码情况。

而无需指定平常不是很关心的处理过程和请求方式。

app.MapGroup("Connect", o =>
{
o.MapMethods<Authorize>("Authorize");
o.MapMethods<Authorize.Callback>("Authorize/Callback");
o.MapMethods<Token>("Token");
o.MapMethods<UserInfo>("UserInfo").RequireAuthorization(new AuthorizeAttribute()
{
AuthenticationSchemes = OpenIddictValidationAspNetCoreDefaults.AuthenticationScheme
});
o.MapMethods<Endsession>("Endsession");
});
app.MapGroup("Account", o =>
{
o.MapMethods<Login>("Login");
o.MapMethods<Externallogin>("Externallogin");
o.MapMethods<Externallogin.Callback>("Externallogin/Callback");
o.MapMethods<ConfirmationLogin>("ConfirmationLogin");
o.MapMethods<ForgotPassword>("ForgotPassword");
o.MapMethods<ResetPassword>("ResetPassword");
});

结果结束。


我们只需要简单的三步就可以做到这个事情,并且可以不用反射和其他的复杂过程。

第一步,我们需要创建(附带静态抽象函数的接口)IEndpointBase。

public interface IEndpointBase
{
public static abstract IEnumerable<string> HTTPMethods();
public static abstract Delegate Handler();
}

第二步,需要实现IEndpointBase。

public class Login : IEndpointBase
{
public record AccountLoginRequest
{
[JsonPropertyName("u"), Required]
public string UserName { get; set; } = default!; [JsonPropertyName("p"), Required]
public string Password { get; set; } = default!; [JsonPropertyName("r"), Required]
public string ReturnUrl { get; set; } = default!; [FromQuery]
public bool UseCookies { get; set; }
}
public static Delegate Handler()
{
var callback = async ([FromBody] AccountLoginRequest request, [FromServices] SignInManager signInManager) =>
{
// Todo: returnUrl validate is success var result = await signInManager.PasswordSignInAsync(request.UserName, request.Password, request.UseCookies, lockoutOnFailure: true);
return Results.Text(result.ToString());
};
return callback;
} public static IEnumerable<string> HTTPMethods() => [HttpMethods.Post];
}

第三步:处理静态IEndpointBase,此时我们已经完成了这件事情。

public static RouteHandlerBuilder MapMethods<T>(this IEndpointRouteBuilder app, [StringSyntax("Route")] string pattern) where T : IEndpointBase
{
return app.MapMethods(pattern, T.HTTPMethods(), T.Handler());
}

更好代码方式清晰:我发现单纯的使用自己扩展好的 MapMethods 已经足够清晰了。


但如果有对API进行分组的要求,还是使用原生的还是不会清晰,原因是:

  1. 要对 MapGroup 进行赋值,比如说 var accountGroup = app.MapGroup("Account"),每个组都要想个名字。

  2. 不能清楚自己的边界,比如说 写代码时,有可能出现插队的情况,本来 accountGroup下面都是属于它的端点,结果不小心插进来一个别的。

于是简单的对MapGroup进行了扩展,最终结果在本文最上面。

public static void MapGroup(this IEndpointRouteBuilder endpoints, [StringSyntax("Route")] string prefix, Action<IEndpointRouteBuilder> action)
{
var group = endpoints.MapGroup(prefix);
action(group);
}

总结:通过这种方式,代码结构已经清晰多了。若是有议,可以在评论区联系我。

Clear Code for Minimal API的更多相关文章

  1. .Net Minimal Api 介绍

    Minimal API是.Net 6中新增的模板,借助C# 10的一些特性以最少的代码运行一个Web服务.本文脱离VS通过VS Code,完成一个简单的Minimal Api项目的开发. 创建项目 随 ...

  2. ASP.NET Core 6 Minimal API的模拟实现

    Minimal API仅仅是在基于IHost/IHostBuilder的服务承载系统上作了小小的封装而已,它利用WebApplication和WebApplicationBuilder这两个类型提供了 ...

  3. 【.NET 6】使用.NET 6开发minimal api以及依赖注入的实现、VS2022热重载和自动反编译功能的演示

    前言: .net 6 LTS版本发布已经有若干天了.此处做一个关于使用.net 6 开发精简版webapi(minimal api)的入门教程,以及VS2022 上面的两个强大的新技能(热重载.代码自 ...

  4. 简单聊下.NET6 Minimal API的使用方式

    前言 随着.Net6的发布,微软也改进了对之前ASP.NET Core构建方式,使用了新的Minimal API模式.之前默认的方式是需要在Startup中注册IOC和中间件相关,但是在Minimal ...

  5. 【.NET6】gRPC服务端和客户端开发案例,以及minimal API服务、gRPC服务和传统webapi服务的访问效率大对决

    前言:随着.Net6的发布,Minimal API成了当下受人追捧的角儿.而这之前,程序之间通信效率的王者也许可以算得上是gRPC了.那么以下咱们先通过开发一个gRPC服务的教程,然后顺势而为,再接着 ...

  6. Code Your First API With Node.js and Express: Set Up the Server

    How to Set Up an Express API Server in Node.js In the previous tutorial, we learned what the REST ar ...

  7. EF框架step by step(9)—Code First Fluent API

    在上一篇中,讲述了用数据特性的方式来标识实体与数据表之间的映射关系,在Code First方法中,还可以通过Fluent API的方式来处理实体与数据表之间的映射关系. 要使用Fluent API必须 ...

  8. 【EF】EF框架 Code First Fluent API

    在Code First方法中,还可以通过Fluent API的方式来处理实体与数据表之间的映射关系. 要使用Fluent API必须在构造自定义的DbContext时,重写OnModelCreatin ...

  9. Code Walkthroughs Table API

    上级:https://www.cnblogs.com/hackerxiaoyon/p/12747387.html Table API Table api 有批量的api和流实时的api.通常很容易进行 ...

  10. .net core 2.0 Code First Fluent API配置

    A.net core 2.0新特性支持通过IEntityTypeConfiguration<>添加Code First配置到一个封装类. 新建目标框架为.NET Core类库 新建完了以后 ...

随机推荐

  1. 本周四晚19:00知识赋能第八期第2课丨ArkUI自定义组件

     9月21日19:00~20:00,第八期知识赋能第2节直播就要开始啦!本次直播将为同学们带来涂鸦小游戏的趣味体验,让大家全面了解ArkUI框架的应用,帮助你们在自己已有专业的基础上拓宽知识边界,学习 ...

  2. 基于OpenHarmony的智能金属探测器

    一.简介 智能金属探测器是基于 OpenAtom  OpenHarmony(以下简称"OpenHarmony")操作系统,利用电磁感应原理来探测周围的金属物体.该样例采用多设备协同 ...

  3. C# Log4net详细说明

    1.概述 log4net是.Net下一个非常优秀的开源日志记录组件.log4net记录日志的功能非常强大.它可以将日志分不同的等级,以不同的格式,输出到不同的媒介.本文主要是介绍如何在Visual S ...

  4. vue3 快速入门系列 —— vue3 路由

    vue3 快速入门系列 - vue3 路由 在vue3 基础上加入路由. vue3 需要使用 vue-router V4,相对于 v3,大部分的 Vue Router API 都没有变化. Tip:不 ...

  5. 手把手教你基于gin从零搭建一个属于你自己的go项目(一)

    一.为什么写这个,适合什么人看 原因 因为自己想写点小玩意,本来是打算用egg.js来写服务端的,后来发现了个更好玩的midway,但是后来发现自己手上的服务器都是一核2g的小水管,用node有点难顶 ...

  6. Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案。此项目包含开发分布式应用服务的必需组件-Nacos 、Sentinel等

    概述 Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案.此项目包含开发分布式应用服务的必需组件. 方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发 ...

  7. CentOS6.5安装与配置JDK-7

    系统环境:centos-6.5 安装方式:rpm安装 软件:jdk-7-linux-i586.rpm 下载地址:http://www.oracle.com/technetwork/java/javas ...

  8. requests模块发送post请求,flask开启服务接收请求,python

    request模块部分 import requests import json if __name__ == '__main__': url = 'http://127.0.0.1:5000' dat ...

  9. 宏杉科技加入阿里云PolarDB开源数据库社区

    简介: 宏杉科技签署阿里巴巴开源CLA(Contribution License Agreement, 贡献许可协议), 正式与阿里云PolarDB 开源数据库社区牵手. 宏杉科技签署阿里巴巴开源CL ...

  10. Helm Chart 多环境、多集群交付实践,透视资源拓扑和差异

    简介: 在本文中,我们将介绍如何通过 KubeVela解决多集群环境下 Helm Chart 的部署问题.如果你手里没有多集群也不要紧,我们将介绍一种仅依赖于 Docker 或者 Linux 系统的轻 ...