我们都知道,在 Main
函数中必须要指定一个 Startup
启动类,但下面的内容鲜为人知。
可以指定多个 Startup
static void Main(string[] args)
{
WebHost.CreateDefaultBuilder(args)
.UseStartup<Starup1>()
.UseStartup<Startup2>()
.UseStartup<Startup3>()
//...
}
但结论却是,只有最后一个 Startup
启动类有效。我也是醉了。
如果我们不想指定一个启动类,系统默认会提供使用程序集查找,那查找的约定是怎样的呢?
WebHost.CreateDefaultBuilder(args)
.UseStartup("程序集1;程序集2;...")
Startup
启动类的环境变量约定
环境变量内置分为三种:Development
、Staging
和 Production
,当然你也可以用你自己的。 Core
的内部机制可以会结合你的 环境变量名 + Startup 来帮你找寻相应的启动类
static void Main(string[] args)
{
WebHost.CreateDefaultBuilder(args)
.UseStartup("MyApp")
//...
}
public class DevelopmentStartup
{
//...
}
public class ProductionStartup
{
//...
}
当你在开发的时候会使用 DevelopmentStartup
启动类,当你在生产环境的时候就会切换到 ProductionStartup
启动类了。
类名后缀为 Startup
的约定
只要你的启动类的名称结尾是用 Startup
来命名的,都会视为启动类。
public class MyClassStartup {}
实现了 IStartup
接口的类
你的类如果实现了 IStartup
接口,同样也可以被系统找到。
public class MyClass : IStartup { }
如果以上条件不具备,就会抛出异常了。