获取Startup.cs对象的参考 [英] Getting reference of Startup.cs object
问题描述
这是标准ASP.NET Core应用程序的框架:
Here's the skeleton of a standard ASP.NET Core application:
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
类的实例
In this piece the ASP.NET Core apparatus instantiates an instance of Startup.cs
class
.UseStartup<Startup>()
我的查询是如何保留(引用)该Startup对象的这个实例化实例,然后将其插入到Library/Framework中.
My query is how can I get hold (reference) of this already instantiated instance of Startup object that I can plug into my Library/Framework.
上下文是建立一些Uber级别的框架,并获取所有请求都在其中启动的结点(Startup.cs)的引用.
Context is to setup some Uber level framework and get a reference of this junction (Startup.cs) where all the requests are getting initiated.
推荐答案
如果您的Startup
实现了IStartup
接口,则引用它很容易:
If your Startup
implements IStartup
interface, getting reference to it is easy:
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 core不需要要求您的启动类即可实现此接口.如果不是,它将使用适配器模式并将Startup
类调整为IStartup
接口.您仍然会有IStartup
的实例,但它不是您的Startup
类.相反,它将是ConventionBasedStartup
的实例. Asp.net核心将探索您的启动类的方法,找到Configure
和ConfigureServices
方法,并将它们传递给ConventionBasedStartup
,这将使它们适应IStartup
接口.在这种情况下,不可能在没有大量反思的情况下检索启动类的实例,因为它实际上没有存储在ConventionBasedStartup
的任何字段中(甚至是私有的),并且只能通过委托引用来访问.
However, asp.net core does not require your startup class to implement this interface. If it does not - it will use adapter pattern and adapt your Startup
class to IStartup
interface. You will still have an instance of IStartup
, but it will not be your Startup
class. Instead it will be an instance of ConventionBasedStartup
. Asp.net core will explore methods of your startup class, find Configure
and ConfigureServices
methods and will pass them to ConventionBasedStartup
which will adapt them to IStartup
interface. In this case, it's not possible to retrieve instance of your startup class without heavy reflection, because it's not actually stored in any field (even in private) of ConventionBasedStartup
and is only reachable through delegate references.
长话短说-如果要获取Startup
类的实例-使其实现IStartup
接口.
Long story short - if you want to get instance of your Startup
class - make it implement IStartup
interface.
有关如何实现IStartup接口的更新:
Update about how to implement IStartup interface:
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();
}
}
这篇关于获取Startup.cs对象的参考的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!