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

时间:2018-11-12 00:49:45

标签: c# design-patterns asp.net-core class-design

这是关于Startup类背后的设计原理的说明:

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

我知道该类需要包含ConfigureServicesConfigure之类的方法。

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

使用这种设计方法,必须阅读文档并了解诸如ConfigureServicesConfigure之类的魔术方法名称。

如果这是新的课堂设计思想的一部分,那么我在哪里可以了解到更多信息?

2 个答案:

答案 0 :(得分:10)

其完成方式有几个原因。 显而易见的原因之一是,因为您可以将服务注入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类,它们的默认方法名称为ConfigureConfigureServicesStartupDevelopment / StartupProductionStartup(作为备用)和ASP.NET Core将根据环境变量集选择正确的变量。

答案 1 :(得分:3)

启动类可以从IStartup接口继承。

RSpec.feature 'User creates a foobar', js: true do # `js: true` applies to all scenarios in this feature - could be put on single scenario instead if desired
  scenario 'they see the foobar on the page' do  
    visit '/apply'

    fill_in 'Name', with: 'Joe Bloggs'

    click_button 'Submit application'
    #...

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