Если я добавлю расширение для AddControllersWithViews (), оно также будет применяться к AddRazorPages () - PullRequest
1 голос
/ 08 февраля 2020

Если я использую и .AddControllersWithViews(), и .AddRazorPages() в приложении, и я хочу вызвать для них метод расширения, нужно ли добавлять его к обоим, и безопасно ли добавлять его к обоим?

В Asp Core 2.1, в Startup.cs мы использовали метод расширения .AddMvc(). В Asp Core 3+ это было разбито на .AddControllersWithViews() и .AddRazorPages(). В приложении, которое смешивает как традиционные MVC, так и более новые виды бритвы, разработчик может использовать как .AddControllersWithViews() и .AddRazorPages(), так и просто использовать старый .AddMvc(). Это упоминается в документах Microsoft , а также в исходном коде .

В моем приложении я использовал .AddControllersWithViews() и .AddRazorPages(), а не просто .AddMvc().

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

Если вы решите добавить поддержку Netwonsoft Json с .AddNewtonsoftJson(), нужно ли мне добавлять расширение .AddNewtonsoftJson() к обоим? Например,

scwv.AddNewtonsoftJson()
srp.AddNewtonsoftJson()

Или я могу использовать только одно из приведенных выше утверждений?

Аналогично, если я решу добавить .AddRazorRuntimeCompilation(), чтобы мне не нужно было останавливать и запускать проект каждый раз, когда я делаю изменения в файле .cs html, нужно ли мне добавлять расширение .AddRazorRuntimeCompilation() к обоим так:

scwv.AddRazorRuntimeCompilation()
srp.AddRazorRuntimeCompilation()

Или я могу использовать только одно из приведенных выше утверждений?

[Я понимаю, что проще было бы изменить использование .Add Mvc (), и не думать ни о чем из этого. Но я пытаюсь понять, как работает промежуточное программное обеспечение, и будет ли добавление расширения к одному из них делать это для обоих, или добавление одного и того же расширения к обоим из них вызовет некоторые проблемы или конфликты, так как большая часть лежащей в основе функциональность является общей, и все промежуточные программы добавляются вместе]

1 Ответ

0 голосов
/ 08 февраля 2020

Прежде всего, методы Add~, которые вы можете запустить в методе ConfigureServices, обычно создаются таким образом, что вы можете вызывать их повторно без каких-либо дополнительных побочных эффектов. По большей части они просто добавляют или настраивают службы для контейнера внедрения зависимостей и делают это таким образом, чтобы не добавлять дополнительные службы при повторных вызовах или заменять предыдущие регистрации.

Компоновщики служб, такие как MvcBuilder, который возвращается из таких методов, как AddControllers() или AddRazorPages(), обычно является лишь способом ограничения дополнительного метода Add~ для определенной области. Например, AddNewtonsoftJson относится только к «конфигурации» для MVC настроек. И есть много других методов расширения, которые применяются только к определенным другим установкам. Поэтому, чтобы избежать того, чтобы все это было доступно в коллекции сервисов services, и сильно затрудняло обнаружение, они ограничены областью применения шаблона компоновщика.

За завесами эти компоновщики все равно будут добавлять сервисы непосредственно в коллекцию сервисов. В результате, обычно не имеет значения, откуда вы взяли строителя, если вы каким-то образом его получаете.

[…] я должен добавить его к обоим

Так что нет, вам не нужно добавлять его к AddControllersWithViews() и AddRazorPages(). Оба вызова вернут компоновщик MVC, который добавит сервисы к одному и тому же набору сервисов. Таким образом, вы можете позвонить AddNewtonsoftJson() на любом сборщике.

[…] и безопасно ли добавить его к обоим?

Да, вы все равно можете вызвать его Оба.


Это все, что говорится, если вы хотите настроить MVC и Razor страниц, то есть вызовите оба AddControllersWithViews() и AddRazorPages(), то вы также можете просто позвонить AddMvc(), так как это именно то, что делает этот метод . И тогда вам больше не нужно думать о том, к какому MVC строителю нужно добавить вызовы;)

...