ASP.NET Core configuration依赖于一个Startup
类,该类应该具有一个Configure
方法,并且可以选择包括一个ConfigureServices
方法。
我想知道为什么不强迫此类实现包含这两种方法的接口来获得强类型化的所有好处。
我知道,真正的原因在框架设计者的心中是无法企及的,但是任何人都可以为他们为什么选择不使用接口提供充分的理由吗?
答案 0 :(得分:5)
一种可能性是由于依赖项注入。假设有一个接口,它可能看起来像这样:
public interface IStartup
{
void ConfigureServices(IServiceCollection services);
void Configure(IApplicationBuilder app);
}
但是,Configure
方法可以将额外的参数作为依赖项注入框架的一部分。例如,我这里有一个看起来像这样的应用程序:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
//etc...
}
因此,现在不可能将其设置为接口,因为可能传递了许多东西。
此外,ConfigureServices
实际上是可选的。
最后,实际上确实存在一个名为IStartup
的接口,但是由于上述原因,我还没有看到它在任何地方都可以使用。
奖金:您甚至根本不需要启动类,所有的工作都可以在building the web host时通过调用ConfigureServices
和Configure
方法来完成。
答案 1 :(得分:3)
除了@DavidG指出的原因外,还可以根据应用程序所在的环境使用启动方法约定来调整服务和中间件的注册。
例如,您可以在常规ConfigureServices
方法旁边添加此方法,并且只有在Staging环境中运行时才会调用该方法:
public void ConfigureStagingServices(IServiceCollection services)
{
// ...
}
相同的约定适用于Configure(IApplicationBuilder app)
。有关更多参考,请参见the documentation。