c# - 为什么 ASP.NET Core 的 Startup 类不是接口或抽象类?
问题描述
这是关于Startup
此处解释的类背后的设计原则:
https://docs.microsoft.com/en-us/aspnet/core/fundamentals/startup?view=aspnetcore-2.1
我知道该类需要包含诸如ConfigureServices
or之类的方法Configure
。
为什么CreateDefaultBuilder(args).UseStartup<Startup>()
不强制要求任何基类或接口以获得更好的可读性?
使用这种设计方法,必须有人阅读文档并了解魔术方法名称,例如ConfigureServices
or Configure
。
如果这是新班级设计思维的一部分,那么我在哪里可以阅读更多关于它的信息?
解决方案
它以它的方式完成有几个原因。更明显的原因之一是,因为您可以将服务注入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 将根据环境变量集选择正确的类。
推荐阅读
- delphi - 如何在不使用 VCL 样式的情况下将着色应用于 Delphi 10.2 Tokyo 应用程序?
- excel - Excel VBA - 允许输入中的连字符和单个空格
- powershell - 将 Powershell 多维数组分配到 Excel 工作簿范围失败并出现转换错误
- amazon-dynamodb - AppSync + DynamoDB:按所有者过滤
- mysql - SQL:使用同一张表核对数量
- reactjs - 反应:img onLoad 和 Chicken/Egg 问题我无法逃脱
- css - 目标:混合班级兄弟姐妹的最后一个孩子?
- c++ - 如何使一个进程终止其他进程?
- mysql - 比较两个 csv 文件的内容,其中两个文件之间的关系在第三个文件中指定?
- sql - 如何使用宽表将 SQL 查询中的列与其他列进行比较?