Сколько перегрузок метода Configure возможно в ядре asp. net? - PullRequest
1 голос
/ 12 июля 2020

Метод Configure работает как magi c в ASP. NET Core 3.1.

Сценарий 1

При создании нового проекта , фреймворк формирует следующую сигнатуру метода:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)

Нет ничего удивительного в том, что приложение работает с этой сигнатурой, потому что я могу предположить, что ASP. NET Core framework ожидает, что сигнатура будет такой, как есть .

Сценарий 2

Удаляется второй параметр IWebHostEnvironment:

public void Configure(IApplicationBuilder app)

Приложение работает.

Сценарий 3

Внедрил мой DbContext, добавленный в IServiceCollection в методе ConfigureServices вместе с регистратором:

public void Configure(IApplicationBuilder app, ILogger<Startup> logger, VegaDbContext vegaDbContext)

Удивительно, но приложение работает. Похоже, фреймворк достаточно способен разрешать типы, добавленные в коллекцию сервисов. Хороший знак.

Inline - это реализация метода ConfigureServices:

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<VegaDbContext>(options =>
            options.UseSqlServer(
                configuration.GetConnectionString("VegaDb")));
    services.AddControllers();
}

Scenario 4

Введен WeatherForecastController, который, как я полагаю, добавляется в IServiceCollection через services.AddControllers ():

public void Configure(IApplicationBuilder app, WeatherForecastController weatherForecastController)

Приложение не работает. Возникает следующее исключение:

System.Exception: 'Не удалось разрешить службу типа' Vega.Controllers.WeatherForecastController 'для параметра' weatherForecastController 'метода' Configure 'типа' Vega. Startup '.'

Может ли кто-нибудь объяснить, как вызов метода на самом деле выполняется фреймворком и как он способен разрешать некоторые типы, такие как ILogger и VegaDbContext , но не WeatherForecastController .

1 Ответ

2 голосов
/ 12 июля 2020

Он работает с использованием инфраструктуры внедрения зависимостей. Аргументы для Configure извлекаются из ServiceProvider веб-хоста. Ключевое слово здесь - «служба» - по умолчанию контроллеры не добавляются как службы в коллекцию служб.

Чтобы получить доступ к контроллерам через внедрение зависимостей, вам необходимо вызвать AddControllersAsServices метод расширения для IMvcCoreBuilder или IMvcBuilder в вашем методе ConfigureServices.

services.AddControllers()
        .AddControllersAsServices();
// or
services.AddControllersWithViews() 
        .AddControllersAsServices();
// or
services.AddMvc()
        .AddControllersAsServices();
...