首页 > 解决方案 > 为什么 ASP.NET Core 的 Startup 类不是接口或抽象类?

问题描述

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

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

我知道该类需要包含诸如ConfigureServicesor之类的方法Configure

为什么CreateDefaultBuilder(args).UseStartup<Startup>()不强制要求任何基类或接口以获得更好的可读性?

使用这种设计方法,必须有人阅读文档并了解魔术方法名称,例如ConfigureServicesor Configure

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

标签: c#design-patternsasp.net-coreclass-design

解决方案


它以它的方式完成有几个原因。更明显的原因之一是,因为您可以将服务注入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();

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

完整地说,一个还可以有多个Startup具有默认方法名称 ( Configure/ ConfigureServices) 的类,命名为StartupDevelopment, StartupProduction, Startup(作为后备),ASP.NET Core 将根据环境变量集选择正确的类。


推荐阅读