gpt4 book ai didi

c# - 为什么 ASP.NET Core Startup 类不是接口(interface)或抽象类?

转载 作者:太空狗 更新时间:2023-10-29 20:04:09 24 4
gpt4 key购买 nike

这是关于 Startup 背后的设计原则类在这里解释:

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

我知道该类需要包含类似 ConfigureServices 的方法或 Configure .

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

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

如果这是新类(class)设计思维的一部分,那么我在哪里可以阅读更多相关信息?

最佳答案

之所以采用这种方式,有几个原因。一个更明显的原因是,因为您可以将服务注入(inject)到 Configure 方法中,例如

public void Configure(IAppBuilder app, IMyService myService)
{
myService.DoSomething();
}

显然,您不能使用接口(interface)、抽象类或继承来做到这一点。

第二个使用约定方法的原因是,不仅有 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(继承/接口(interface)/抽象类)这一切都是不可能的。

这同样适用于 ASP.NET Core 的其他部分,例如中间件和 Invoke 方法。 Invoke 方法也可以将依赖项注入(inject)其中,但为了调用下一个中间件,您只需执行

await next?.Invoke();

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

为了完整起见,还可以有多个 Startup 类,其默认方法名称 (Configure/ConfigureServices) 名为 StartupDevelopmentStartupProductionStartup(作为回退)和 ASP.NET Core 将根据环境变量集选择正确的。

关于c# - 为什么 ASP.NET Core Startup 类不是接口(interface)或抽象类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53254735/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com