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

创建项目

新建一个文件夹,用来管理我们的项目文件,文件夹内启动命令行,通过dotnet new web创建项目。

Minimal
├── obj
├── Properties
├── appsettings.Development.json
├── appsettings.json
├── Minimal.csproj
└── Program.cs

运行项目

项目目录下执行dotnet run,运行项目。

PS C:\Users\User01\Desktop\Minimal> dotnet run
正在生成...
info: Microsoft.Hosting.Lifetime[14]Now listening on: https://localhost:7221
info: Microsoft.Hosting.Lifetime[14]Now listening on: http://localhost:5252
info: Microsoft.Hosting.Lifetime[0]Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]Hosting environment: Development
info: Microsoft.Hosting.Lifetime[0]Content root path: C:\Users\User01\Desktop\Minimal\

运行效果如下:

Coding

builder 实例提供了 Services 属性,可以完成原本 Startup 类 ConfigureServices 方法中注册服务的工作,Configure 方法的一些 Use 操作则通过 app 来完成。

builder.Services.AddMemoryCache();app.UseStaticFiles();
if (app.Environment.IsDevelopment())
{app.UseSwagger();app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", $"{builder.Environment.ApplicationName} v1"));
}

Map

builder.Build()返回的 app 实例提供了 Map、Methods、MapXXX 方法实现 HttpMethod 路由的映射。这里只以 Get 请求为例。Map 和 MapMethods 方法提供不同的特性和参数可以代替 MapGet 方法。

app.MapGet("/", () => "Hello World!");
app.Map("/", [HttpGet] () => "Hello World!");

HttpGet 特性限定请求为 Get 请求,如果不指定则不限制请求方法,Get、Post 等方式可以请求改路由地址

app.MapMethods("/", new List<string>() { HttpMethod.Get.ToString() }, () => "Hello World!");

Application

代码内直接修改应用程序配置,如修改监听端口

app.Urls.Add("http://localhost:3000");
//app.Run();
app.Run("http://localhost:4000");

优先级 app.Run > app.Urls.Add > launchSettings

Dependency Injection

Minimal APIs 中无法使用构造函数注入,但可以通过参数方式注入并忽略 FromServices 特性。

app.MapGet("/info", (IWebHostEnvironment env) => new {Time = DateTimeOffset.UtcNow,env.EnvironmentName
});

Context

一些 Http 请求的上下文信息也可以通过参数直接指定,方法体内直接使用,代替 MVC 中的 Request 等。如:

  • HttpContext

  • HttpRequest

  • HttpResponse

  • ClaimsPrincipal

  • CancellationToken

app.MapGet("/context", (HttpContext httpContext) => new
{Data = httpContext.Connection.Id
});

更多类型参考:github

Responses

通过静态类 Results 返回标准的相应类型,实现和 ControllerBase 提供对应方法相同的效果。

app.MapGet("/ok/{id}", (int id) =>
{return Results.Ok($"ok:{id}");
});

Link Generation

通过扩展方法 WithXXX 等可以对路由进行一些配置,如通过 WithName 指定名称,再通过 LinkGenerator 生产对应 Uri,避免硬编码

app.MapGet("/context", (HttpContext httpContext) => new
{Data = httpContext.Connection.Id
}).WithName("hi");app.MapGet("hello", (LinkGenerator linker) =>$"The link to the hello route is {linker.GetPathByName("hi", values: null)}");

除了 WithXXX 等一些列 RoutingEndpointConvention 扩展方法外,还提供了 AuthorizationEndpointConvention 相关扩展方法 RequireAuthorization、AllowAnonymous 代替 MVC 模式中的相关特性(特性也还可以用只是多了一个支持方式)。

本文只列出 Minimal APIs 的一些简单用法,集成 Swagger 等用法内容参考:https://minimal-apis.github.io/hello-minimal/

接口的返回状态码和类型等可以通过扩展方法 Produces 说明,如:Produces<ResponseMode>(contentType:"application/xml"); ,但是接口备注貌似还不支持,我尝试了很多方式都不能正确显示。

Code Format

Minimal APIs 上面示例存在的问题是 Program 文件中会有太多的编码,所有路由的映射和响应都在一起,虽然可以通过如下方式使用静态方法抽离响应方法,但所有的 Route Map 还是列在一起,不能像 Controller 一样分离。

var handler = new HelloHandler();app.MapGet("/", handler.Hello);class HelloHandler
{public string Hello(){return "Hello World";}
}

可以借助开源框架 MASA.Contrib提供的 MASA.Contrib.Service.MinimalAPIs 完成代码封装。

详细用法参考 MASA.EShop

Program.cs

var builder = WebApplication.CreateBuilder(args);
var app = builder.Services.AddServices(builder);
app.Run();

HelloService.cs

public class HelloService : ServiceBase
{public HelloService(IServiceCollection services): base(services) =>App.MapGet("/api/v1/helloworld", ()=>"Hello World"));
}

我们正在行动,新的框架、新的生态

我们的目标是自由的易用的可塑性强的功能丰富的健壮的

所以我们借鉴Building blocks的设计理念,正在做一个新的框架MASA Framework,它有哪些特点呢?

  • 原生支持Dapr,且允许将Dapr替换成传统通信方式

  • 架构不限,单体应用、SOA、微服务都支持

  • 支持.Net原生框架,降低学习负担,除特定领域必须引入的概念,坚持不造新轮子

  • 丰富的生态支持,除了框架以外还有组件库、权限中心、配置中心、故障排查中心、报警中心等一系列产品

  • 核心代码库的单元测试覆盖率90%+

  • 开源、免费、社区驱动

  • 还有什么?我们在等你,一起来讨论

经过几个月的生产项目实践,已完成POC,目前正在把之前的积累重构到新的开源项目中

目前源码已开始同步到Github(文档站点在规划中,会慢慢完善起来):

MASA.BuildingBlocks

MASA.Contrib

MASA.Utils

MASA.EShop

BlazorComponent

MASA.Blazor

QQ群:7424099

微信群:加技术运营微信(MasaStackTechOps),备注来意,邀请进群

----- END ------

作者简介

马跃:MASA技术团队成员。

.Net Minimal API 介绍相关推荐

  1. Minimal API Todo Sample

    Minimal API Todo Sample Intro .NET 6 Preview 4 开始引入了 Minimal API 到如今的 RC1,Minimal API 也完善了许多并且修复了很多B ...

  2. ASP.NET Core 6 Minimal API

    ASP.NET Core 6 Minimal API Intro 微软在 ASP.NET 6 Preview 4 的介绍文章中介绍了即将到来的 ASP.NET Core 6 中的最小 API 的雏形, ...

  3. 详解 .Net6 Minimal API 的使用方式

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

  4. HTML5 Audio标签方法和函数API介绍

     问说网 > 文章教程 > 网页制作 > HTML5 Audio标签方法和函数API介绍 Audio APIHTML5HTML5 Audio预加载 HTML5 Audio标签方法和函 ...

  5. Servlet基础(一) Servlet基础和关键的API介绍

    转载:http://www.cnblogs.com/mengdd/p/3202550.html Servlet基础(一) Servlet简介 关键API介绍及结合源码讲解 Servlet基础(一) S ...

  6. Socket基础API介绍

    文章目录 1 Socket基础API介绍 1 Socket基础API介绍 我们先来看下使用Socket API建立简易TCP服务端和客户端的步骤: 用Socket API建立简易TCP服务端: 建立一 ...

  7. 学习笔记Hadoop(十四)—— MapReduce开发入门(2)—— MapReduce API介绍、MapReduce实例

    四.MapReduce API介绍 一般MapReduce都是由Mapper, Reducer 及main 函数组成. Mapper程序一般完成键值对映射操作; Reducer 程序一般完成键值对聚合 ...

  8. TEE Internal core API介绍(globalplatform)

    目录 一.TEE的API介绍 1.Cryptographic Operations API 加解密函数介绍() (1).Generic Operation Functions TEE_Allocate ...

  9. Globalplatform TEE api介绍

    文章目录 1.TEE API介绍 2.Client API : CA与TA通信的API介绍 3.TEE API : TA系统调用TEE OS的API (1).Asymmetric (2).Authen ...

最新文章

  1. Redis队列的应用
  2. php 进度条百分比算法,实例讲解Ajax实现简单带百分比进度条
  3. Django的静态文件的配置
  4. oracle将213变成123,oracle 转换函数
  5. mysql存储加速_mysql存储过程加速
  6. Apache + PHP为什么不能在www目录下写文件以及如何解决PHP写文件问题
  7. .Net 应用框架设计系列(二)
  8. Python在mysql中进行操作是十分容易和简洁的
  9. IDEA开发中,类的头位置生成作者时间信息
  10. tinycc update VERSION to 0.9.27
  11. 图书馆占座系统-产品需求规格说明书
  12. DMG Canvas 3 for Mac 共享版 – 优秀的DMG安装包制作软件
  13. 触发器详解——(一)D触发器
  14. 我是一名Linux系统运维工程师
  15. 【机器学习基础】EM算法
  16. Hibernate手动控制事物
  17. 领带的打法10种——男士必看(图)
  18. 1024程序员节,带你解锁过节新方式
  19. 802.11a data rate
  20. c# ArrayList 和 Hashtable 的使用

热门文章

  1. python财务案例分析考试答案_《财务案例分析》作业及答案(三次).
  2. 飞思网巡软件系列 产品安装手册
  3. C语言关于字符串和字符数组的题目(差别)
  4. P3353 在你窗外闪耀的星星————树状数组,前缀和
  5. UVALive 3353 - Optimal Bus Route Design(二分图最小权匹配)
  6. Excel中IF函数中的条件写法
  7. 各国养育一个孩子的成本是多少呢
  8. php获取客户端设备信息,php获取手机设备信息
  9. linux查看断网日志命令,Linux Screen命令使程序远离断网影响(示例代码)
  10. 腾讯海量数据处理平台TDW