dotNET 7:最小 API 使用

dde3a8a4e4b7ea9fa529854e41ca111b.jpeg

最小 API 并不是在 .NET 7 中才加入的,记得应该是在 .NET 6 中就已经提供,只是对我来说,到现在才开始使用。

创建一个最小 API

在 VS 2022 中创建 WebAPI 项目,不勾选使用控制器,创建出来的就是最小 API :

d526c258f5410977304fafa7532de10c.png

  • 不勾选使用控制器,就会创建最小 API 模板;

  • 启用 OpenAPI ,默认会添加 Swagger;

  • 顶级语句:顶级语句是 C# 9.0 中添加的新特性,如果勾选不使用,Program 类中还会出现 main 函数。

创建出来的工程只有两个文件,重大的改变就是,没有之前的 Startup 类了,只有一个 Program 和一个配置文件 appsetting.json:

2355d9c8786a030e2cf1a2066a2374c8.png

Program 类的全部代码如下:

var builder = WebApplication.CreateBuilder(args);
//在下面添加服务器到容器,相当于之前 Startup 类中的 ConfigureServices 方法var app = builder.Build();
//在下面编写管道相关代码,相当于之前 Startup 类中的 Configure 方法//在下面编写接口,相当于之前 Controller 中的方法
var summaries = new[]
{"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
};app.MapGet("/weatherforecast", () =>
{var forecast = Enumerable.Range(1, 5).Select(index =>new WeatherForecast(DateOnly.FromDateTime(DateTime.Now.AddDays(index)),Random.Shared.Next(-20, 55),summaries[Random.Shared.Next(summaries.Length)])).ToArray();return forecast;});//运行 API
app.Run();internal record WeatherForecast(DateOnly Date, int TemperatureC, string? Summary)
{public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
}

app.MapGet 方法接受两个参数,第一个参数是一个字符串,为接口的访问路径,第二个参数是一个委托,用来编写接口的业务逻辑。

从 MapGet 这个方法名可以看出,这是一个 Get 请求的接口方法,如果要使用 Post ,可以使用 MapPost 。

添加一个接口方法非常简单,如下图:

a70552541069150d2f8902839fb814b1.png


使用 Serilog 日志框架

1、安装 NuGet 包:Serilog.AspNetCore,安装这一个就会包含 Serilog 、Serilog.Sink.File 等。

2、在 Program 类的 builder 创建之后,添加对 Serilog 的使用:

using Serilog;var builder = WebApplication.CreateBuilder(args);
//在下面添加服务器到容器,相当于之前 Startup 类中的 ConfigureServices 方法
//添加对 serilog 的使用
builder.Host.UseSerilog((hostContext, services, configuration) => {configuration.WriteTo.File("serilog-file.txt").WriteTo.Console();
});
var app = builder.Build();
// 下面代码省略

3、运行程序,会看到项目更目录下会生成一个 serilog-file.txt 文本文件,里面记录了所有日志;

4、在上面添加的 helloworld 方法中使用日志:

app.MapGet("/helloworld", () => 
{Log.Information("helloworld.start");return "hello ,oec2003";});
  • Information 是日志级别,还有 Error、Warning、Fatal、Debug;

  • 接口方法调用后,日志会写入文本文件。

依赖注入

依赖注入一个常见的做法是使用构造函数进行注入,传统的 WebAPI 中可以在 Controller 的构造函数中进行,但最小 API 没有 Controller ,下面看看在最小 API 中是怎么注入的。

1、在 Program 类的最下面添加 IUser 接口和 User 类:

internal interface IUser
{string GetName();
}
internal class User : IUser
{public string GetName(){return "oec2003";}
}

2、在 Program 类的 builder 创建之后,添加依赖注入的配置:

builder.Services.AddTransient<IUser, User>();

3、注入的地方由原来的构造函数变成了方法参数:

app.MapGet("/helloworld",  (IUser user) => 
{return $"hello , {user.GetName()}";});

配置

最小 API 的项目中的两个文件,其中一个就是 appsetting.json 配置文件,下面以 Serilog 日志框架的配置为例,来演示怎样读取配置文件。

1、在上面的 Serilog 例子中,配置是在代码中写死的,现在将配置移到 appsetting.json 配置文件中。

"Serilog": {"MinimumLevel": "Information","Override": {"Microsoft.AspNetCore": "Warning"},"WriteTo": [{"Name": "Console"},{"Name": "File","Args": {"path": "Serilogs\\serilog.log"}}]
}

2、修改 builder 部分的代码:

builder.Host.UseSerilog((hostingContext, loggerConfiguration) =>                loggerConfiguration.ReadFrom.Configuration(hostingContext.Configuration));

3、运行程序后,在程序根目录下会创建 Serilogs 目录,该目录中会创建 serilog.log 文件。

总结

1、对于一些简单的接口场景,使用最小 API 比较方便,都在一个文件中处理;

2、除了依赖注入式通过方法参数,其他很多地方跟之前用法类似,就是将 Startup 中 ConfigureServices 方法和 Configure 方法搬到了 Program 类的固定位置。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/281044.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Taro小程序采坑记

Taro&#xff0c;京东凹凸实验室出品的适配多端的一个框架&#xff0c; Taro 是一套遵循 React 语法规范的 多端开发 解决方案。现如今市面上端的形态多种多样&#xff0c;Web、React-Native、微信小程序等各种端大行其道&#xff0c;当业务要求同时在不同的端都要求有所表现的…

struts入门

struts工作过程&#xff1a; 反射代码&#xff1a; Class clazz Class.forName("action全路径"); Method m clazz.getMethod("execute"); Object o m.invoke(); package标签&#xff1a; 转发&#xff1a;地址栏不变 修改struts默认常量值&#xff1a; 常…

《Android应用开发攻略》——2.14 备份Android应用程序数据

2.14 备份Android应用程序数据 Pratik Rupwal2.14.1 问题当用户恢复出厂设置或者改用新的Android设备时&#xff0c;应用程序丢失存储数据或者应用程序设置。2.14.2 解决方案Android的Backup Manager&#xff08;备份管理器&#xff09;能够在应用程序重新安装时自动恢复备份数…

C#程序开机启动与获取程序启动路径

写windows工具时&#xff0c;要进行电源管理&#xff0c;需要重启与开关机OS&#xff0c;这样工具就需要自动启动。查了网上很多资料&#xff0c;修改注册列表就可以。 但是&#xff0c;复制几个网站的代码并自己修改都发现不行&#xff0c;最后发现脚本之家这段代码才成功&am…

wpf office 菜单_如何带回Office 2007中的旧菜单

wpf office 菜单Using the new Ribbon feature in Office 2007 takes time to learn…time you don’t have because projects are stacking up. Today we will look at UBitMenu, a utility that puts the familiar Office 2003 menu into the 2007 ribbon. 使用Office 2007中…

Swagger UI 仅为用户暴露已授权终结点

前言当需要在生产环境中提供 Swagger UI 时&#xff0c;我们可以通过身份验证&#xff0c;控制只有授权用户才能访问 Swagger UI 页面。但是我们希望更进一步&#xff0c;每个用户只能看到授权给他的终结点&#xff0c;而不会暴露其他未授权终结点信息。比如&#xff0c; API 提…

php实现约瑟夫环

function king($high,$size){ $monkey range(1, $high); $i 0 ; while (count($monkey)>1) { $i; $head array_shift($monkey); if(($i % $size) ! 0){ array_push($monkey,$head); } } return $monkey[0];} var_dump(king(10,3));转载于:https://www.cnblogs.com/lijint…

微软正式发布Azure Storage上的静态网站

微软正式宣布了Azure Storage上的静态网站&#xff0c;提供了从托管在Azure Storage上的HTML、CSS和JavaScript文件提供内容的能力。静态网站包含内容固定的Web页面&#xff0c;同时仍然允许利用JavaScript等客户端代码来创建丰富的用户体验。 有了这个新功能&#xff0c;继用于…

帝国国王科技大学上机题解(二)

1.找到字符串中出现次数最少的字符 题目描写叙述 给定一个字符串&#xff08;长度小于50&#xff09; 找到该字符串出现次数最少的字符 假设有两个字符出现次数同样&#xff0c;并且均出现最少。那么ASCII码小的字符优先 输入 输入为一行字符串。不含空格 输出 输出出现次数最少…

如何在计算机上阅读漫画书

Reading and organizing a comic book collection on your computer is efficient and a lot of fun. Today we will look at a couple of free applications that allow you to read your favorite comic books on your computer. 在计算机上阅读和组织漫画集非常有效&#xf…

C# WinForm 自启动/模拟开机自动启动

遇到重写启动步骤&#xff0c;C#调试时显得比较折腾&#xff0c;既要等待重启&#xff0c;又要保存当前文件。 让程序自动重启模拟这样电脑重启步骤&#xff0c;显得非常方便。在http://bbs.csdn.net/topics/100187453找到下面代码&#xff0c;直接使用。 ProcessStartInfo p…

工业互联网平台实现路径

我国工业互联网平台建设虽然仍处于产业培育期&#xff0c;但是工业互联网平台也得到了初期的快速发展&#xff0c;得益于平台企业的积极投入和各地工业和信息化主管部门的大力推动&#xff0c;从平台建设推广的经验来看&#xff0c;下面谈一下个人认为传统制造企业平台战略比较…

Javascript基础之-Promise

转载自: http://www.lht.ren/article/3/ Promise是什么呢&#xff1f;根据ecma-262的定义&#xff1a; Promise是一个被用于延时计算的最终结果的占位符 &#xff08;A Promise is an object that is used as a placeholder for the eventual results of a deferred (and possi…

linux进阶命令2

linux进阶命令2 压缩1.压缩的概念1&#xff09;压缩的目的&#xff1a; 在网络传递文件时&#xff0c;可以先将文件压缩&#xff0c;然后传递压缩后的文件&#xff0c;从而减少网络带宽。 接受者接受文件后&#xff0c;解压即可。2&#xff09;压缩的类型 有损压缩、无损压缩。…

PHP经常使用正則表達式汇总

1. 平时做站点常常要用正則表達式&#xff0c;以下是一些解说和样例&#xff0c;仅供大家參考和改动使用&#xff1a; 2. "^\d$"  //非负整数&#xff08;正整数 0&#xff09; 3. "^[0-9]*[1-9][0-9]*$"  //正整数 4. "^((-\d)|…

psa name_Windows 10安全性PSA:启用自动商店更新

psa nameMicrosoft sometimes distributes important security updates through the Microsoft Store. That’s the lesson we’re learning in July 2020, when Microsoft sent an important update for Windows 10’s HEVC codecs not via Windows Update but via the Store.…

C# ListView 简单命令例子

编写工具常用到ListView控件&#xff0c;能简单列出选项&#xff0c;常用到流程校验显示。这里介绍简答显示&#xff0c;添加与删除功能。 1.添加表头&#xff0c;与显示。 this.listView1.Columns.Add("队列", 40, HorizontalAlignment.Left);this.listView1.Column…

C#并行编程-Task

什么是异步同步和异步主要用于修饰方法。当一个方法被调用时&#xff0c;调用者需要等待该方法执行完毕并返回才能继续执行&#xff0c;我们称这个方法是同步方法&#xff1b;当一个方法被调用时立即返回&#xff0c;并获取一个线程执行该方法内部的业务&#xff0c;调用者不用…

手机照片丢失或误删如何恢复

手机照片丢失或误删如何恢复&#xff1f;我们每个人从刚出生就开始拍照片&#xff0c;一周岁照片、二周岁照片、三周岁照片等&#xff0c;因为照片可以记录我们从小到大的模样和变化。无意照片对我们每个人来说都很重要&#xff0c;如果手机突然坏以前的照片都找不到了怎么办呢…

C++学习笔记(二)——交换函数(swap)

这次我们要透过一个简单的函数swap深入理解函数传参的本质以及在C中如何选择传参方式。 先来看第一段程序&#xff1a; void swap(int x, int y) {int temp y;y x;x temp; } 通过main函数的调用&#xff0c;我们发现x,y并未实现交换&#xff1a; int main() {int x 1;int y…