由于
WebApplication
实现了 IApplicationBuilder
和 IEndpointRouteBuilder
,因此有一个 Map
方法用于具有多个重载的应用程序,特别是 Map(string pattern,Action<IApplicationBuilder>)
和 Map(string pattern, RequestDelegate requestDelegate)
。他们有什么区别?
虽然你们有相同的名字,但它们的目的和过载几乎不同。应用程序构建器
(Map(string pattern,Action<IApplicationBuilder>))
的map方法首先使用IApplicationBuilder.New()
方法创建一个新应用程序,然后将使用Action<IApplicationBuilder>
配置在Map方法中定义的配置应用于这个新应用程序。最后,它使用 New IApplication 的 Build 方法并创建一个请求委托。然后使用匹配的路径作为基本路径并将剩余路径作为名为 MapMiddleware
的中间件中的路径来调用此委托(除了设置和重置基本路径以及从传递的路径到匹配的路径并反向!并调用构建的请求委托之外,它什么都没有)。
请参阅以下链接:
但是
IEndpointRouteBuilder
的 Map 方法(Map(string/RoutePattern pattern, RequestDelegate requestDelegate))
首先创建一个新的 RouteEndpointBuilder()
,其中 order=0
和 displayname
作为来自模式和委托的模式原始文本。然后添加 RequestDelegate
的属性(如果有)(基于类)向构建器请求委托(如控制器)。然后检查 EndpointDataSource
是否存在 IEndpointRouteBuilder
,如果没有则创建一个(例如使用新的 ModelEndpointDataSource()
)并将其添加到 IEndpointRouteBuilder.DataSources
。最后构建来自 IEndpointConventionBuilder
的 RouteEndPointBuilder
例如使用 new DefaultEndpointConventionBuilder(endpointBuilder)
并将其连接到数据源(实际上,它应该构建路由端点并将其连接到数据源,但我们可以以从约定构建器读取的方式实现端点的 getter)最后返回该约定构建器以对其进行更多工作。请参阅以下内容:
主要区别:
IApplicationBuilder.Map
分支基于 url 的 start,而 IEndpointRouteBuilder.Map
分支基于 full urlIEndpointRouteBuilder.Map
处理程序始终是terminal,而IApplicationBuilder.Map
允许通过调用next.Invoke()