Asp.net core 为什么';NET内核强制启动类型实现接口

Asp.net core 为什么';NET内核强制启动类型实现接口,asp.net-core,Asp.net Core,依赖于一个Startup类,该类应该有一个Configure方法,并且可以选择包括ConfigureServices方法 我想知道为什么不强制这个类实现一个包含这两个方法的接口来获得强类型的所有好处 我知道真正的原因在框架设计者的头脑中是无法达到的,但是有人能给出一个好的理由来解释为什么他们可能选择不使用接口吗?一种可能性是依赖注入。假设有一个接口,它可能看起来像这样: public interface IStartup { void ConfigureServices(IService

依赖于一个
Startup
类,该类应该有一个
Configure
方法,并且可以选择包括
ConfigureServices
方法

我想知道为什么不强制这个类实现一个包含这两个方法的接口来获得强类型的所有好处


我知道真正的原因在框架设计者的头脑中是无法达到的,但是有人能给出一个好的理由来解释为什么他们可能选择不使用接口吗?

一种可能性是依赖注入。假设有一个接口,它可能看起来像这样:

public interface IStartup
{
    void ConfigureServices(IServiceCollection services);
    void Configure(IApplicationBuilder app);
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    //etc...
}
但是,
Configure
方法可以将额外的参数作为依赖项注入框架的一部分。例如,我这里有一个应用程序如下所示:

public interface IStartup
{
    void ConfigureServices(IServiceCollection services);
    void Configure(IApplicationBuilder app);
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    //etc...
}
所以现在不可能把它变成一个接口,因为可以传入任意数量的东西

此外,
ConfigureServices
实际上是可选的

最后,确实存在一个名为的接口,但由于上述原因,我还没有看到它在任何地方使用


好处:你甚至不需要一个启动类,所有的工作都可以通过调用和方法来完成。

除了@DavidG指出的原因外,还可以使用启动方法约定根据应用程序所在的环境来调整服务和中间件的注册

例如,您可以在常规的
ConfigureServices
方法旁边添加此方法,并且只有在登台环境中运行时才会调用此方法:

public void配置stagingservices(IServiceCollection服务)
{
// ...
}

同样的约定适用于
配置(IApplicationBuilder应用程序)
。请参阅以获取更多参考。

因为在配置设计上使用了约定