Есть несколько причин, почему это сделано так, как это было сделано.
Одна из наиболее очевидных причин заключается в том, что вы можете внедрить службы в метод Configure
, такой как
public void Configure(IAppBuilder app, IMyService myService)
{
myService.DoSomething();
}
Очевидно, что вы не можете сделать это с интерфейсами, абстрактными классами или наследованием.
Вторая причина, по которой это делается традиционным методом, заключается в том, что существует не только Configure/ConfigureServices
метод, но и бесконечное число зависящих от среды методов конфигурирования.
public void Configure(IAppBuilder app) { }
public void ConfigureDevelopment(IAppBuilder app) { }
public void ConfigureProduction(IAppBuilder app) { }
public void ConfigureStaging(IAppBuilder app) { }
public void ConfigureSomethingElse(IAppBuilder app) { }
и в зависимости от вашей переменной среды для ASPNET_ENVIRONMENT
будет выбран и выполнен другой метод (или по умолчанию Configure/ConfigureServices
, если не найдено подходящего для конкретной среды метода).
С традиционным ООП (наследование / интерфейсы / абстрактные классы) все это невозможно.
То же самое относится и к другим частям ядра ASP.NET, таким как Middlewares и метод Invoke
. В метод Invoke
также могут быть вставлены зависимости, но для вызова следующего промежуточного программного обеспечения вы просто делаете
await next?.Invoke();
и не нужно беспокоиться о том, какие зависимости требуются или могут потребоваться для следующего промежуточного программного обеспечения.
И чтобы быть полным, можно также иметь несколько Startup
классов с именами методов по умолчанию (Configure
/ ConfigureServices
) с именами StartupDevelopment
, StartupProduction
, Startup
(как запасной вариант) и ASP. NET Core подберет правильный, основанный на наборе переменных среды.