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



这是关于此处解释的Startup类背后的设计原则:

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

我知道这个类需要包含像ConfigureServicesConfigure这样的方法。

为什么CreateDefaultBuilder(args).UseStartup<Startup>()不强制要求使用任何基类或接口来提高可读性?

使用这种设计方法,必须有人阅读文档并了解像ConfigureServicesConfigure这样神奇的方法名称。

如果这是一种新的课堂设计心态的一部分,那么我在哪里可以阅读更多关于它的信息?

有几个原因可以解释为什么它会这样做。其中一个更明显的原因是,因为您可以将服务注入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(。

这一切在传统的OOP(继承/接口/抽象类(中都不可能实现。

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

await next?.Invoke();

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

为了完整,还可以有多个默认方法名(Configure/ConfigureServices(为StartupDevelopmentStartupProductionStartup(作为后备(的Startup类,ASP.NET Core将根据环境变量集选择正确的方法名。

Startup类可以从IStartup接口继承。

// packagesmicrosoft.aspnetcore.hosting.abstractions2.2.0libnetstandard2.0Microsoft.AspNetCore.Hosting.Abstractions.dll
namespace Microsoft.AspNetCore.Hosting
{
public interface IStartup
{
IServiceProvider ConfigureServices(IServiceCollection services);
void Configure(IApplicationBuilder app);
}
}

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

最新更新