为什么 ASP.NET Core 的 Startup class 不是接口或抽象 class?
Why is ASP.NET Core's Startup class not an interface or abstract class?
这是关于 Startup
class 背后的设计原则的解释:
https://docs.microsoft.com/en-us/aspnet/core/fundamentals/startup?view=aspnetcore-2.1
我知道 class 需要包含 ConfigureServices
或 Configure
等方法。
为什么 CreateDefaultBuilder(args).UseStartup<Startup>()
不要求任何基础 class 或接口以提高可读性?
使用这种设计方法,必须有人阅读文档并了解 ConfigureServices
或 Configure
等魔术方法名称。
如果这是新 class 设计思维的一部分,那么我可以在哪里阅读更多相关信息?
之所以这样做,有几个原因。
一个更明显的原因是,因为您可以将服务注入 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
)。
None 这在传统 OOP 中是可能的 (inheritance/interfaces/abstract 类)。
这同样适用于 ASP.NET 核心的其他部分,例如中间件和 Invoke
方法。 Invoke
方法也可以注入依赖项,但为了调用下一个中间件,您只需执行
await next?.Invoke();
并且不必担心下一个中间件需要或可能需要哪些依赖项。
为了完整起见,一个人还可以有多个 Startup
类,默认方法名称 (Configure
/ConfigureServices
) 名为 StartupDevelopment
, StartupProduction
、Startup
(作为回退)和 ASP.NET 核心将根据环境变量集选择正确的。
Startupclass可以从IStartup接口继承。
// \packages\microsoft.aspnetcore.hosting.abstractions.2.0\lib\netstandard2.0\Microsoft.AspNetCore.Hosting.Abstractions.dll
namespace Microsoft.AspNetCore.Hosting
{
public interface IStartup
{
IServiceProvider ConfigureServices(IServiceCollection services);
void Configure(IApplicationBuilder app);
}
}
默认情况下,向导不会使用 IStartup 的实现创建模板文件。为什么不呢 - 可能是非类型化语言的错误或影响..
这是关于 Startup
class 背后的设计原则的解释:
https://docs.microsoft.com/en-us/aspnet/core/fundamentals/startup?view=aspnetcore-2.1
我知道 class 需要包含 ConfigureServices
或 Configure
等方法。
为什么 CreateDefaultBuilder(args).UseStartup<Startup>()
不要求任何基础 class 或接口以提高可读性?
使用这种设计方法,必须有人阅读文档并了解 ConfigureServices
或 Configure
等魔术方法名称。
如果这是新 class 设计思维的一部分,那么我可以在哪里阅读更多相关信息?
之所以这样做,有几个原因。
一个更明显的原因是,因为您可以将服务注入 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
)。
None 这在传统 OOP 中是可能的 (inheritance/interfaces/abstract 类)。
这同样适用于 ASP.NET 核心的其他部分,例如中间件和 Invoke
方法。 Invoke
方法也可以注入依赖项,但为了调用下一个中间件,您只需执行
await next?.Invoke();
并且不必担心下一个中间件需要或可能需要哪些依赖项。
为了完整起见,一个人还可以有多个 Startup
类,默认方法名称 (Configure
/ConfigureServices
) 名为 StartupDevelopment
, StartupProduction
、Startup
(作为回退)和 ASP.NET 核心将根据环境变量集选择正确的。
Startupclass可以从IStartup接口继承。
// \packages\microsoft.aspnetcore.hosting.abstractions.2.0\lib\netstandard2.0\Microsoft.AspNetCore.Hosting.Abstractions.dll
namespace Microsoft.AspNetCore.Hosting
{
public interface IStartup
{
IServiceProvider ConfigureServices(IServiceCollection services);
void Configure(IApplicationBuilder app);
}
}
默认情况下,向导不会使用 IStartup 的实现创建模板文件。为什么不呢 - 可能是非类型化语言的错误或影响..