为什么 ASP.NET Core 的 Startup class 不是接口或抽象 class?

Why is ASP.NET Core's Startup class not an interface or abstract class?

这是关于 Startup class 背后的设计原则的解释:

https://docs.microsoft.com/en-us/aspnet/core/fundamentals/startup?view=aspnetcore-2.1

我知道 class 需要包含 ConfigureServicesConfigure 等方法。

为什么 CreateDefaultBuilder(args).UseStartup<Startup>() 不要求任何基础 class 或接口以提高可读性?

使用这种设计方法,必须有人阅读文档并了解 ConfigureServicesConfigure 等魔术方法名称。

如果这是新 class 设计思维的一部分,那么我可以在哪里阅读更多相关信息?

之所以这样做,有几个原因。 一个更明显的原因是,因为您可以将服务注入 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)。

None 这在传统 OOP 中是可能的 (inheritance/interfaces/abstract 类)。

这同样适用于 ASP.NET 核心的其他部分,例如中间件和 Invoke 方法。 Invoke 方法也可以注入依赖项,但为了调用下一个中间件,您只需执行

await next?.Invoke();

并且不必担心下一个中间件需要或可能需要哪些依赖项。

为了完整起见,一个人还可以有多个 Startup 类,默认方法名称 (Configure/ConfigureServices) 名为 StartupDevelopmentStartupProductionStartup(作为回退)和 ASP.NET 核心将根据环境变量集选择正确的。

Startupclass可以从IStartup接口继承。

// \packages\microsoft.aspnetcore.hosting.abstractions.2.0\lib\netstandard2.0\Microsoft.AspNetCore.Hosting.Abstractions.dll
namespace Microsoft.AspNetCore.Hosting
{
 public interface IStartup
  {
   IServiceProvider ConfigureServices(IServiceCollection services);
   void Configure(IApplicationBuilder app);
  }
}

默认情况下,向导不会使用 IStartup 的实现创建模板文件。为什么不呢 - 可能是非类型化语言的错误或影响..