如果我同时使用 .AddControllersWithViews()
和 .AddRazorPages()
在应用程序中,我想对它们调用扩展方法,我是否必须将其添加到两者中,并且将其添加到两者中是否安全?
在 Asp Core 2.1 中,我们曾经在 Startup.cs 中使用扩展方法 .AddMvc()
.
在 Asp Core 3+ 中,这被分解为 .AddControllersWithViews()
和 .AddRazorPages()
.在混合了传统 MVC 和较新的 razor View 的应用程序中,开发人员可以选择同时使用 .AddControllersWithViews()
和 .AddRazorPages()
,或者只是使用旧的 .AddMvc()
.这在 Microsoft docs 中提到也可以在 source code 中看到.
在我的应用程序中,我同时使用了 .AddControllersWithViews()
和 .AddRazorPages()
,而不仅仅是 .AddMvc()
.
var scwv = services.AddControllersWithViews();
var srp = services.AddRazorPages();
如果决定使用
.AddNewtonsoftJson()
添加 Netwonsoft Json 支持,我是否需要添加 .AddNewtonsoftJson()
扩展到两者?喜欢scwv.AddNewtonsoftJson()
srp.AddNewtonsoftJson()
或者我可以只使用上述语句之一吗?
同样,如果我决定添加
.AddRazorRuntimeCompilation()
以便每次更改 .cshtml 文件时都不必停止和启动项目,我是否需要添加 .AddRazorRuntimeCompilation()
像这样扩展到两者:scwv.AddRazorRuntimeCompilation()
srp.AddRazorRuntimeCompilation()
或者我可以只使用上述语句之一吗?
[我意识到更简单的选择是更改使用 .AddMvc(),而不考虑任何这些。但是我试图了解中间件是如何工作的,以及向其中一个添加扩展是否会对两者都起作用,或者向它们添加相同的扩展是否会导致一些问题或冲突,因为大部分底层功能是共享的,所有中间件都被添加在一起]
最佳答案
首先,Add~
您可以在 ConfigureServices
中运行的方法方法通常以一种可以重复调用它们而不会产生任何额外副作用的方式构建。大多数情况下,他们只是为依赖注入(inject)容器添加或配置服务,并且不会在重复调用时添加额外服务或替换以前的注册。
服务构建器,例如从 AddControllers()
等方法返回的 MvcBuilder或 AddRazorPages()
, 通常只是限制额外的一种方式 Add~
一定范围内的方法。例如,AddNewtonsoftJson
仅作为 MVC 相关设置的“配置”相关。还有许多其他扩展方法仅适用于某些其他设置。因此,为了避免在服务集合中提供所有这些内容 services
,并且严重阻碍了可发现性,它们使用构建器模式限定范围。
在幕后,这些构建器仍然会直接将服务添加到服务集合中。因此,只要您以某种方式获得它,通常从哪里获得构建器并不重要。
[…] do I have to add it to both
所以不,您不必将它添加到
AddControllersWithViews()
和 AddRazorPages()
.这两个调用都将返回一个 MVC 构建器,它将服务添加到同一个服务集合中。所以你可以拨打AddNewtonsoftJson()
在任一生成器上。[…] and is it safe to add it to both?
是的,您仍然可以同时调用它。
话虽如此,如果您想设置 MVC 和 Razor 页面,即同时调用
AddControllersWithViews()
和 AddRazorPages()
,那么您也可以拨打 AddMvc()
自 that’s exactly what that method does .然后您不再需要考虑需要向哪个 MVC 构建器添加调用;)
关于c# - 如果我向 AddControllersWithViews() 添加扩展,它是否也适用于 AddRazorPages(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60124826/