以下是标准ASP.NET核心应用程序的框架:
var config = new ConfigurationBuilder()
.AddCommandLine(args)
.AddEnvironmentVariables(prefix: "ASPNETCORE_")
.Build();
var host = new WebHostBuilder()
.UseConfiguration(config)
.UseKestrel()
.UseContentRoot(Directory.GetCurrentDirectory())
.UseIISIntegration()
.UseStartup<Startup>()
.Build();
host.Run();
在这篇文章中,ASP.NET Core设备实例化了Startup.cs
类
.UseStartup<Startup>()
我的查询是如何获取(参考)这个已经实例化的Startup对象实例,我可以插入到我的库/ Framework中。
上下文是设置一些Uber级别框架并获得此联结(Startup.cs)的引用,其中所有请求都已启动。
答案 0 :(得分:10)
如果您的Startup
实施IStartup
界面,则很容易获得对它的引用:
var host = new WebHostBuilder()
.UseConfiguration(config)
.UseKestrel()
.UseContentRoot(Directory.GetCurrentDirectory())
.UseIISIntegration()
.UseStartup<Startup>()
.Build();
var startup = host.Services.GetService(typeof(IStartup)); // or from any other part of code using IServiceProvider.
但是,asp.net核心并不要求您的启动类来实现此接口。如果没有 - 它将使用适配器模式并使您的Startup
类适应IStartup
接口。您仍然会有IStartup
的实例,但它不会是您的Startup
课程。相反,它将是ConventionBasedStartup
的实例。 Asp.net核心将探索您的启动类的方法,查找Configure
和ConfigureServices
方法,并将它们传递给ConventionBasedStartup
,这将使它们适应IStartup
接口。在这种情况下,不能在没有大量反射的情况下检索启动类的实例,因为它实际上并不存储在ConventionBasedStartup
的任何字段(甚至是私有)中,并且只能通过委托引用来访问。
长话短说 - 如果你想获得Startup
类的实例 - 让它实现IStartup
接口。
有关如何实现IStartup接口的更新:
public class Startup : IStartup
{
public Startup(IHostingEnvironment env)
{
// constructor as usual
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
.AddEnvironmentVariables();
Configuration = builder.Build();
}
public IConfigurationRoot Configuration { get; }
public void Configure(IApplicationBuilder app) {
app.UseMvc();
// resolve services from container
var env = (IHostingEnvironment) app.ApplicationServices.GetService(typeof(IHostingEnvironment));
var logger = (ILoggerFactory)app.ApplicationServices.GetService(typeof(ILoggerFactory));
logger.AddConsole(Configuration.GetSection("Logging"));
logger.AddDebug();
// etc
}
public IServiceProvider ConfigureServices(IServiceCollection services) {
services.AddMvc();
// etc
// return provider
return services.BuildServiceProvider();
}
}