获取Startup.cs对象的参考 [英] Getting reference of Startup.cs object

查看:89
本文介绍了获取Startup.cs对象的参考的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是标准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核心将探索您的启动类的方法,找到ConfigureConfigureServices方法,并将它们传递给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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆