C# 如果我向AddControllersWithViews()添加扩展,它还会应用于AddRazorPages()吗

C# 如果我向AddControllersWithViews()添加扩展,它还会应用于AddRazorPages()吗,c#,asp.net-mvc,asp.net-core,asp.net-core-3.1,C#,Asp.net Mvc,Asp.net Core,Asp.net Core 3.1,如果我在应用程序中同时使用.AddControllersWithViews()和.AddRazorPages(),并且我想对它们调用一个扩展方法,我是否必须将其同时添加到这两个应用程序中,并且将其同时添加到这两个应用程序中是否安全 在Asp Core 2.1中,在Startup.cs中,我们使用扩展方法.AddMvc()。 在Asp Core 3+中,这已被分解为.AddControllersWithViews()和.AddRazorPages()。在混合了传统MVC和较新razor视图的应用程

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

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

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

如果决定将Netwonsoft Json支持与
.AddNewtonsoftJson()
一起添加,我是否需要将
.AddNewtonsoftJson()
扩展添加到两者?像

scwv.AddNewtonsoftJson()
srp.AddNewtonsoftJson()
或者我可以用上面的一句话吗

类似地,如果我决定添加
.AddRazorRuntimeCompilation()
,这样我就不必每次在.cshtml文件中进行更改时都停止和启动项目,我是否需要向这两个文件添加
.AddRazorRuntimeCompilation()
扩展名,如下所示:

scwv.AddRazorRuntimeCompilation()
srp.AddRazorRuntimeCompilation()
或者我可以用上面的一句话吗


[我意识到更简单的选择是更改use.AddMvc()但我试图了解中间件是如何工作的,向其中一个添加扩展是否对两者都有效,或者向两个添加相同的扩展是否会导致一些问题或冲突,因为许多底层功能是共享的,并且所有中间件都被添加到其中gether]

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

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

在幕后,这些构建器仍将直接向服务集合添加服务。因此,通常情况下,构建器从何处获得并不重要,只要您以某种方式获得它即可

[…]我必须将其同时添加到这两个选项中吗

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

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

是的,你仍然可以两者兼而有之



综上所述,如果您想设置MVC和Razor页面,即调用
AddControllersWithViews()
AddRazorPages()
,那么您也可以调用
AddMvc()
。然后,您就不再需要考虑需要向哪个MVC构建器添加调用;)

谢谢你的解释,这真的很有帮助。至于AddMvc()-我之所以没有切换到它,是因为我担心微软只是为了向后兼容而保留它,将来可能会将其删除(我可能错了,这只是一种怀疑)。是的,AddMvc最终可能会停产,但我认为它至少会持续到ASP.NET Core 6,因为目前没有任何计划停产。因此,您可以在相当长的一段时间内安全地继续使用它。
scwv.AddRazorRuntimeCompilation()
srp.AddRazorRuntimeCompilation()