【问题标题】:How does .NET Core C# Minimal API fill parameters?.NET Core C# Minimal API 如何填充参数?
【发布时间】:2023-01-13 00:51:36
【问题描述】:

使用minimalistic API MapGet 如何自动填充查询字符串中的参数?

使用简约的 API,以下是可能的:

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

app.MapGet("api/Students/Grades", StudentsDataContext.GetGradesAsync).RequireAuthorization("Admin");

//...

public class Grade
{
    public string? Subject { get; set; }
    public int GradePercentage { get; set; } = 0;
}

public class StudentsDataContext
{
    public static async Task<List<Grade>> GetGradesAsync(int? studentId, ClaimsPrincipal user, CancellationToken ct))
    {
        // Gets grades from database...
        return new List<Grade>() {
              new () { Subject = "Algebra", GradePercentage=95 },
              new () { Subject = "English", GradePercentage=90 }
        };
    }
}

当你打电话时:/api/Students/Grades?studentId=5 神奇地,studentId 被传递给 GetGradesAsync、ClaimsPrinicipal 和 CancellationToken。

这个巫术是如何运作的?是否有可能学习这种黑暗面的力量?

【问题讨论】:

  • ...代码是开源的...是什么阻止您研究代码? ...但基本上您可以通过反射获取方法参数...您可以检查可以从 DI continer 注入哪些参数...其余的您可以尝试从查询字符串中获取
  • @Selvin 我找过了。在dotnet GitHub中,我只找到了例子。我找不到 MapGet 的源代码。
  • 这已经预先在 ASP 核心中完成。它被称为model binding
  • dotnetfiddle.net/xs13OE 然后检查参数是否从 DI 注入...如果没有 - 然后尝试解析任何内容(查询字符串,路径...)...这很容易想象
  • @SudipShrestha:这基本上是反思。 aspnet 运行时检查您的方法并尝试找出如何收集所有参数。 DI 容器绑定服务。请求数据绑定查询字符串值。然后运行时就打电话给你。根本没有巫术。

标签: c# query-string minimal-apis asp.net-core-7.0


【解决方案1】:

您提供的链接描述了最小 API 中 parameter binding 的规则。简而言之,它非常简单——分析请求处理程序委托(我想是通过一些反射+运行时代码生成或构建时的源代码生成)并创建实际的处理程序,所有参数都经过相应处理并传递给用户定义的参数。

我没有花太多时间,所以以下内容可能不完全正确,但调查它实际如何工作的起点是EndpointRouteBuilderExtensions,它导致RequestDelegateFactory(参见AddRouteHandler call,它填充List&lt;RouteEntry&gt; _routeEntries,这是后来用CreateRouteEndpointBuilder方法处理,它调用CreateHandlerRequestDelegate),它应该包含所有实际的“魔法”。

【讨论】:

    猜你喜欢
    • 2022-07-27
    • 2022-09-24
    • 2022-01-13
    • 2021-01-14
    • 1970-01-01
    • 1970-01-01
    • 2017-08-28
    • 2022-12-14
    • 2022-06-11
    相关资源
    最近更新 更多