在练习 Adam Freeman 的《Pro ASP.NET Core》一书时,我注意到以下
MapGet("route", RequestDelegate)
方法的用法:
app.MapGet("endpoint/function",
async (HttpContext context, IResponseFormatter formatter) => {
await formatter.Format(context, "Endpoint Function: It is sunny in LA");
});
IResponseFormatter
在DI中注册为单例,但我很困惑为什么使用以下源代码请求委托
public delegate Task RequestDelegate(HttpContext context);
接受超出其定义的额外参数。
这里我发现这是可能的,但是当我尝试使用额外参数创建委托和函数时 - 它不起作用。
所以在搜索过程中,我没有找到任何文档或文章,额外参数何时以及如何工作,为了正确使用它,请您提供任何文章或文档或任何解释?
RequestDelegate 与 .NET 中的所有委托类型一样,不接受额外的参数。相反,代码会编译,因为 MapGet 扩展方法有两个重载:
其中一个重载接受 Delegate,它是所有委托类型的基类,它允许您传递具有任意参数的方法。
特别是当你传递函数时
async (HttpContext context, IResponseFormatter formatter) => {
await formatter.Format(context, "Endpoint Function: It is sunny in LA");
}
对于 MapGet,编译器会自动实例化引用该函数的
Func<HttpContext, IResponseFormatter, Task>
委托(不是 RequestDelegate)。然后 Func 隐式转换为 Delegate 基类。