Почему промежуточное ПО в ASP.NET Core требует определенной семантики, но не интерфейса?

Как известно, IApplicationBuilder метода Configure (class Startup) в ASP.NET Core требует специальной семантики (иметь метод "Invoke" с входным параметром типа HttpContext и Task как возвращаемое значение). Но почему он не реализован как интерфейс? Я могу написать что-то вроде этого:

public class FakeMiddleware
{

}

и зарегистрируйте его:

    app.UseMiddleware<FakeMiddleware>();

и мы получим ошибку времени выполнения. Конечно, это тривиальная вещь и ее легко найти и исправить, но она реализована так грубо, без интерфейса?

Ответ 1

Метод Invoke является гибким, и вы можете запросить дополнительные параметры. ASP.NET добавит дополнительные параметры, используя конфигурацию службы приложений.

public async Task Invoke(HttpContext ctx, 
                         IHostingEnvironment host,
                         ISomethingElse service)
{
    // ...
}

Определения интерфейса С# не могут обеспечить эту гибкость хорошим способом.