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

All*_* Xu 9 c# design-patterns class-design asp.net-core

这是关于Startup这里解释的课程背后的设计原理:

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

我知道这个类需要包含像ConfigureServices或的方法Configure.

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

有了这种设计方法,有人必须阅读文档并了解魔术方法名称,如ConfigureServicesConfigure.

如果这是新的类设计思维模式的一部分,那么我在哪里可以阅读更多关于它的内容?

Tse*_*eng 10

不确定下注,但有几个原因导致它完成了它的完成方式.

其中一个更明显的原因是,因为您可以将服务注入Configure方法,例如

public void Configure(IAppBuilder app, IMyService myService)
{
    myService.DoSomething();
}
Run Code Online (Sandbox Code Playgroud)

显然,你不能用接口,抽象类或继承来做到这一点.

它通过约定方法完成的第二个原因是,不仅有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) { }
Run Code Online (Sandbox Code Playgroud)

并且将根据您的环境变量ASPNET_ENVIRONMENT选择并执行不同的方法(Configure/ConfigureServices如果未找到匹配的特定于环境的方法,则为默认值).

传统的OOP(继承/接口/抽象类)都不可能实现这一点.

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

await next?.Invoke();
Run Code Online (Sandbox Code Playgroud)

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

而且是完整的,一个也可以有多个Startup类与默认的方法名(Configure/ ConfigureServices命名)StartupDevelopment,StartupProduction,Startup(作为备用)和ASP.NET睿将搭载基于环境变量设置正确的

  • 您提到的所有内容都可以通过接口和/或继承来完成。我不确定您为什么认为不可能。 (2认同)
  • @CodingYoshi:嗯,告诉我你如何创建一个接受无限数量和类型参数组合的接口lol.当然在**强类型**方式中,意味着`param object []`不适合这里,因为你不能用那种方式定义依赖.请记住,我们在这里讨论接口和抽象类的方法,而不是构造函数注入,这是一个实现细节 (2认同)