Почему AddMvc ожидает действие <MvcOptions>вместо MvcOptions? - PullRequest
0 голосов
/ 11 января 2019

Я изучаю ASP.NET Core и вижу, что регистрация службы MVC выглядит следующим образом:

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc(options =>
    {
        options.MaxModelValidationErrors = 100;
    });
}

Мой вопрос: почему для метода AddMvc требуются параметры в виде Action<MvcOptions>? Почему я не могу просто создать экземпляр MvcOptions и передать его функции?

1 Ответ

0 голосов
/ 11 января 2019

Если вы посмотрите на источник для 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, что дает возможность переопределить эти значения по умолчанию в вашем приложении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...