Если вы посмотрите на источник для AddMvc
, вы увидите, что не создает для вас экземпляр MvcOptions
:
public static IMvcBuilder AddMvc(this IServiceCollection services, Action<MvcOptions> setupAction)
{
...
var builder = services.AddMvc();
builder.Services.Configure(setupAction);
return builder;
}
Вместо этого он использует IServiceCollection.Configure
, чтобы подключиться к более общему шаблону Options в ASP.NET Core . За кулисами это добавляет экземпляр IConfigureOptions<MvcOptions>
в контейнер внедрения зависимостей, что в конечном итоге приведет к выполнению вашего делегата в какой-то момент позже.
Можно добавить несколько экземпляров IConfigureOptions<MvcOptions>
, которые будут запускаться в порядке регистрации. Также есть IServiceCollection.PostConfigure
, который регистрирует экземпляры IPostConfigureOptions<MvcOptions>
- эти экземпляры будут запускаться после всех IConfigureOptions<MvcOptions>
экземпляров ( документы ).
Это все предлагает некоторую гибкость. Вы можете настроить конвейер делегатов для настройки MvcOptions
в установленном порядке, где каждый шаг настройки может происходить из других проектов и т. Д. Вы можете даже иметь свой собственный вызов services.Configure<MvcOptions>(...)
до вызова AddMvc
и т. Д. .
При добавлении сервисов MVC в DI можно использовать AddMvc
или AddMvcCore
. Внутренне AddMvc
вызывает AddMvcCore
, поэтому мы можем думать о AddMvc
как о каком-то расширении AddMvcCore
.
AddMvcCore
добавляет собственную конфигурацию , используя шаблон параметров в ASP.NET Core . Вместо создания самого экземпляра MvcOptions
, AddMvcCore
добавляет набор IConfigureOptions<MvcOptions>
и IPostConfigureOptions<MvcOptions>
в контейнер внедрения зависимостей.
Эти два интерфейса используются для сборки формы конвейера, где все IConfigureOptions<MvcOptions>
выполняются первыми (в порядке их добавления в DI), а все IPostConfigureOptions<MvcOptions>
выполняются вторыми (снова в порядке). Это позволяет AddMvcCore
предоставлять некоторые значения по умолчанию (используя IConfigureOptions<MvcOptions>
), а также дает возможность вносить изменения в MvcOptions
после применения всех других конфигураций (используя IPostConfigureOptions<MvcOptions>
).
Когда вы вызываете AddMvc
и предоставляете делегата, указанный делегат будет запускаться после IConfigureOptions<MvcOptions>
, добавленного AddMvcCore
, что дает возможность переопределить эти значения по умолчанию в вашем приложении.