5

当我使用 Swagger 为我的 API 提供动力时,我会遵循其中一个指导,并且我总是将 MVC 注入放在像这样的Swagger注入之前。

services.AddMvc();
services.AddSwaggerGen(_ => { ... });

app.UseMvc();
app.UseSwagger();
app.UseSwaggerUI(c => { ... });

我的一个朋友问我为什么应用该命令而不是在 MVC 之前先处理 Swagger 相关行。我发现我无法向他解释,也无法激发它(除了非常尴尬的井......就是这样......)。这告诉我,我应该深入研究一下这个问题。

据我所知,简短的谷歌搜索没有发现任何相关性,所以我在这里问。

4

1 回答 1

8

在这种特殊情况下,Add*它们不受添加到服务集合中的顺序的影响。

但是,根据特定Add*扩展的实现,顺序可能会影响配置。例如,如果它在内部使用TryAdd*扩展,那么只有第一个调用注册。后续调用不会添加,因为注册已经存在。

通用AddScoped/AddSingleton/AddTransient调用会识别该类型的最后一次调用,因为它会覆盖该类型的先前注册调用。当为一个类型注册多个实现时,为了解析IEnumerable<T>,集合中的实现将按照它们注册的顺序。

ASP.NET Core 中的引用依赖注入

对于Use*中间件,它们添加到管道的顺序很重要,因为它们以相同的顺序调用。

命令

在方法中添加中间件组件Startup.Configure的顺序定义了对请求调用中间件组件的顺序和响应的相反顺序。该顺序对于安全性、性能和功能至关重要。

参考ASP.NET Core 中间件

根据我的经验,根据他们的设计目的,一些需要访问管道的第 3 方集成(包括 swagger)建议在AddMvc尝试避免路由冲突之后添加他们的扩展。

大多数安全性(身份验证/授权)和日志中间件通常建议在管道的早期添加,因此它们往往先于AddMvc.

于 2018-12-25T20:32:47.793 回答