2016-11-30 15 views
12

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

public class FakeMiddleware 
{ 

} 

и зарегистрировать его:

app.UseMiddleware<FakeMiddleware>(); 

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

ответ

16

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

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

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

+0

Итак, с DI мы можем думать о недостатках интерфейсов в текущей «версии»? :) Потому что эта ситуация (с дополнительными параметрами и разрешающая ее автоматически) может быть более распределенной, чем это место –

+0

О, черт возьми, это должно быть инжектировано конструктором. Если это зависимость от запроса, то шаблон фабрики будет работать красиво – Rbjz