这是关于Startup
类背后的设计原理的说明:
https://docs.microsoft.com/en-us/aspnet/core/fundamentals/startup?view=aspnetcore-2.1
我知道该类需要包含ConfigureServices
或Configure
之类的方法。
为什么CreateDefaultBuilder(args).UseStartup<Startup>()
不要求任何基类或接口来提高可读性?
使用这种设计方法,必须阅读文档并了解诸如ConfigureServices
或Configure
之类的魔术方法名称。
如果这是新的课堂设计思想的一部分,那么我在哪里可以了解到更多信息?
答案 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
类,它们的默认方法名称为Configure
,ConfigureServices
,StartupDevelopment
/ StartupProduction
, Startup
(作为备用)和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的实现来创建模板文件。为什么不呢-可能是非类型语言的错误或影响。.