1. dotNET 7:最小 API 使用

        共 5305字,需瀏覽 11分鐘

         ·

        2022-11-22 13:24

        最小 API 并不是在 .NET 7 中才加入的,記得應該是在 .NET 6 中就已經提供,只是對我來說,到現在才開始使用。

        創(chuàng)建一個最小 API

        在 VS 2022 中創(chuàng)建 WebAPI 項目,不勾選使用控制器,創(chuàng)建出來的就是最小 API :


        • 不勾選使用控制器,就會創(chuàng)建最小 API 模板;

        • 啟用 OpenAPI ,默認會添加 Swagger;
        • 頂級語句:頂級語句是 C# 9.0 中添加的新特性,如果勾選不使用,Program 類中還會出現 main 函數。

        創(chuàng)建出來的工程只有兩個文件,重大的改變就是,沒有之前的 Startup 類了,只有一個 Program 和一個配置文件 appsetting.json:


        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(15).Select(index =>
                new WeatherForecast
                (
                    DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
                    Random.Shared.Next(-2055),
                    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 方法接受兩個參數,第一個參數是一個字符串,為接口的訪問路徑,第二個參數是一個委托,用來編寫接口的業(yè)務邏輯。

        從 MapGet 這個方法名可以看出,這是一個 Get 請求的接口方法,如果要使用 Post ,可以使用 MapPost 。

        添加一個接口方法非常簡單,如下圖:



        使用 Serilog 日志框架

        1、安裝 NuGet 包:Serilog.AspNetCore,安裝這一個就會包含 Serilog 、Serilog.Sink.File 等。

        2、在 Program 類的 builder 創(chuàng)建之后,添加對 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;
        • 接口方法調用后,日志會寫入文本文件。

        依賴注入

        依賴注入一個常見的做法是使用構造函數進行注入,傳統(tǒng)的 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 創(chuàng)建之后,添加依賴注入的配置:

        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、運行程序后,在程序根目錄下會創(chuàng)建 Serilogs 目錄,該目錄中會創(chuàng)建 serilog.log 文件。

        總結

        1、對于一些簡單的接口場景,使用最小 API 比較方便,都在一個文件中處理;

        2、除了依賴注入式通過方法參數,其他很多地方跟之前用法類似,就是將 Startup 中 ConfigureServices 方法和 Configure 方法搬到了 Program 類的固定位置。

        瀏覽 167
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
          
          

            1. 日本操女人 | 久久国产免费 | 女同性精品亚洲 | 国产波霸爆乳一区二区 | 操久久 |