首页 > 解决方案 > 如果我向 AddControllersWithViews() 添加扩展名,它是否也适用于 AddRazorPages()

问题描述

如果我在应用程序中同时使用两者,.AddControllersWithViews()并且.AddRazorPages()我想在它们上调用扩展方法,我是否必须将其添加到两者中,并且将其添加到两者中是否安全?

在 Asp Core 2.1 中,我们在 Startup.cs 中使用了扩展方法.AddMvc()。在 Asp Core 3+ 中,这已分解为.AddControllersWithViews().AddRazorPages()。在混合了传统 MVC 和较新的 razor 视图的应用程序中,开发人员可以选择同时使用.AddControllersWithViews()and.AddRazorPages()或仅使用旧的.AddMvc(). 这在Microsoft 文档中有所提及,也可以在源代码中看到。

在我的应用程序中,我同时使用了.AddControllersWithViews()and .AddRazorPages(),而不仅仅是.AddMvc().

var scwv = services.AddControllersWithViews();  
var srp = services.AddRazorPages(); 

如果决定添加 Netwonsoft Json 支持.AddNewtonsoftJson(),是否需要同时添加.AddNewtonsoftJson()扩展名?喜欢

scwv.AddNewtonsoftJson()
srp.AddNewtonsoftJson()

或者我可以只使用上述陈述之一吗?

同样,如果我决定添加.AddRazorRuntimeCompilation()这样我就不必在每次更改 .cshtml 文件时停止和启动项目,我是否需要.AddRazorRuntimeCompilation()像这样将扩展名添加到两者:

scwv.AddRazorRuntimeCompilation()
srp.AddRazorRuntimeCompilation()

或者我可以只使用上述陈述之一吗?

[我意识到更简单的选择是更改使用 .AddMvc(),而不是考虑任何这些。但我试图了解中间件是如何工作的,以及向其中一个添加扩展是否会对两者都有效,或者向它们添加相同的扩展是否会导致一些问题或冲突,因为大部分底层功能是共享的,所有中间件都被添加在一起]

标签: c#asp.net-mvcasp.net-coreasp.net-core-3.1

解决方案


首先Add~,您可以在方法中运行的ConfigureServices方法通常以您可以重复调用它们而不会产生任何额外副作用的方式构建。在大多数情况下,他们只是为依赖注入容器添加或配置服务,并且他们这样做的方式不会在重复调用时添加额外的服务,也不会替换以前的注册。

AddControllers()服务构建器,例如从or之类的方法返回的 MvcBuilder,AddRazorPages()通常只是在Add~特定范围内限制附加方法的一种方式。例如,AddNewtonsoftJson仅与 MVC 相关设置的“配置”相关。还有许多其他扩展方法仅适用于某些其他设置。因此,为了避免所有这些都在服务集合上可用services,并严重阻碍可发现性,它们使用构建器模式来限定范围。

在幕后,这些构建器仍然会直接将服务添加到服务集合中。因此,您从哪里获得构建器通常并不重要,只要您以某种方式获得它即可。

[...] 我必须将它添加到两者

所以不,您不必同时将它添加到AddControllersWithViews()AddRazorPages()。两个调用都将返回一个 MVC 构建器,它将服务添加到同一个服务集合中。因此,您可以调用AddNewtonsoftJson()任一构建器。

[...] 将其添加到两者中是否安全?

是的,你仍然可以同时调用它。


话虽如此,如果您想设置 MVC 和 Razor 页面,即同时调用AddControllersWithViews()and AddRazorPages(),那么您也可以只调用,AddMvc()因为这正是该方法所做的。然后您不再需要考虑需要向哪个 MVC 构建器添加调用;)


推荐阅读