关于c#:minimalapi介绍

73次阅读

共计 3791 个字符,预计需要花费 10 分钟才能阅读完成。

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

<!– more –>

创立我的项目

新建一个文件夹,用来治理咱们的我的项目文件,文件夹内启动命令行,通过 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.i…

接口的返回状态码和类型等能够通过扩大办法 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 技术团队成员。

正文完
 0