Clear Code for Minimal API
我在写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进行分组的要求,还是使用原生的还是不会清晰,原因是:
要对 MapGroup 进行赋值,比如说 var accountGroup = app.MapGroup("Account"),每个组都要想个名字。
不能清楚自己的边界,比如说 写代码时,有可能出现插队的情况,本来 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的更多相关文章
- .Net Minimal Api 介绍
Minimal API是.Net 6中新增的模板,借助C# 10的一些特性以最少的代码运行一个Web服务.本文脱离VS通过VS Code,完成一个简单的Minimal Api项目的开发. 创建项目 随 ...
- ASP.NET Core 6 Minimal API的模拟实现
Minimal API仅仅是在基于IHost/IHostBuilder的服务承载系统上作了小小的封装而已,它利用WebApplication和WebApplicationBuilder这两个类型提供了 ...
- 【.NET 6】使用.NET 6开发minimal api以及依赖注入的实现、VS2022热重载和自动反编译功能的演示
前言: .net 6 LTS版本发布已经有若干天了.此处做一个关于使用.net 6 开发精简版webapi(minimal api)的入门教程,以及VS2022 上面的两个强大的新技能(热重载.代码自 ...
- 简单聊下.NET6 Minimal API的使用方式
前言 随着.Net6的发布,微软也改进了对之前ASP.NET Core构建方式,使用了新的Minimal API模式.之前默认的方式是需要在Startup中注册IOC和中间件相关,但是在Minimal ...
- 【.NET6】gRPC服务端和客户端开发案例,以及minimal API服务、gRPC服务和传统webapi服务的访问效率大对决
前言:随着.Net6的发布,Minimal API成了当下受人追捧的角儿.而这之前,程序之间通信效率的王者也许可以算得上是gRPC了.那么以下咱们先通过开发一个gRPC服务的教程,然后顺势而为,再接着 ...
- 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 ...
- EF框架step by step(9)—Code First Fluent API
在上一篇中,讲述了用数据特性的方式来标识实体与数据表之间的映射关系,在Code First方法中,还可以通过Fluent API的方式来处理实体与数据表之间的映射关系. 要使用Fluent API必须 ...
- 【EF】EF框架 Code First Fluent API
在Code First方法中,还可以通过Fluent API的方式来处理实体与数据表之间的映射关系. 要使用Fluent API必须在构造自定义的DbContext时,重写OnModelCreatin ...
- Code Walkthroughs Table API
上级:https://www.cnblogs.com/hackerxiaoyon/p/12747387.html Table API Table api 有批量的api和流实时的api.通常很容易进行 ...
- .net core 2.0 Code First Fluent API配置
A.net core 2.0新特性支持通过IEntityTypeConfiguration<>添加Code First配置到一个封装类. 新建目标框架为.NET Core类库 新建完了以后 ...
随机推荐
- MySQL基本手册
MySQL配置文件 MySQL软件使用的配置文件名为my.ini,在安装目录下. MySQL常用配置参数: 1.default-character-set:客户端默认字符集. 2.character- ...
- Qt获取电脑有几个网卡,并获取对应的IPV4
标题:Qt获取电脑网卡对应的ip | Qt计算电脑有几个网卡 | Qt获取网卡ip信息 | Qt判断获取到的ip是否是IPV4 demo流程: 1.点击搜索网卡按钮,搜索电脑所有的网卡,将网卡名称 ...
- Python基于Excel数据加以反距离加权空间插值并掩膜图层
本文介绍基于Python中ArcPy模块,实现Excel数据读取并生成矢量图层,同时进行IDW插值与批量掩膜的方法. 1 任务需求 首先,我们来明确一下本文所需实现的需求. 现有一个记录有 ...
- mybatis plugin源码解析
概述 Plugin,意为插件,是mybatis为开发者提供的,对方法进行自定义编程的手段.其中用到了动态代理.反射方法,通过指定需要增强的对象与方法,进行程序编写. 核心类 主要涉及几个核心类:Int ...
- Ubuntu SVN 需要证书及密码验证问题
问题概览 问题一 Ubuntu 20.04 下使用 SVN ,会报错 SVN 的证书错误,无论是选择接受 t 还是永久接受 p,下次都会要求再次接受:在 kali 或者 Windows 上没有出现该问 ...
- burp suite历程-安装burp suite
安装时,捯饬了快一上午,不是jdk高了就是装上后不好使了,后来看了下以下文章,安装成功,特此记录以备不时之需: 内容拷贝至链接:https://juejin.cn/post/6844904111867 ...
- 这些Git事故灾难, 你经历过几个?
前言 关于Git, 相信大家最常用的就是pull和push. 但随着协作规模的提升, 遇到的问题也会越来越多. 本篇文章并不科普一些命令的详细用法, 更多的是分享在工作中遇到的Git场景问题以及踩过的 ...
- 当 Knative 遇见 WebAssembly
简介: Knative 可以支持各种容器化的运行时环境,我们今天来探索一下利用 WebAssembly 技术作为一个新的 Serverless 运行时. 作者:易立 Knative 是在 Kubern ...
- WPF自定义控件的三种方式
简介: 某些场景下,我们确实需要创建新的控件.此时,理解 WPF不同控件的创建方法就显得非常重要. WPF 提供3个用于创建控件的方法,每个方法都提供不同的灵活度. WPF控件可以通过数据模型(Da ...
- [Blockchain] 前后端完全去中心化的思路, IPFS 与 Ethereum Contract
我们在使用智能合约的时候,一般是把它当成去中心.减少信任依赖的后端存在. 如果没有特殊后端功能要求,一个 DApp 只需要前端驱动 web3js 就可以实现了. 可以看到,现在前端部分依旧是一个中心化 ...