获取Startup.cs对象的参考

use*_*195 6 c# asp.net-core-mvc asp.net-core

寻找知道ASP.NET MVC内部细节的高级ASP.NET架构师的答案.

这是标准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();
Run Code Online (Sandbox Code Playgroud)

在这篇文章中,ASP.NET设备实例化了一个Startup.cs类的实例

.UseStartup<Startup>()
Run Code Online (Sandbox Code Playgroud)

我的查询是如何获取(参考)这个已经实例化的Startup对象实例,我可以插入到我的Library/Framework中.

上下文是设置一些Uber级别框架并获得此联结(Startup.cs)的引用,其中所有请求都已启动.

Evk*_*Evk 10

如果你的Startupimplements 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.
Run Code Online (Sandbox Code Playgroud)

但是,asp.net核心不需要您的启动类来实现此接口.如果没有 - 它将使用适配器模式并使您的Startup类适应IStartup接口.你仍然会有一个实例IStartup,但它不会是你的Startup班级.相反,它将是一个实例ConventionBasedStartup.Asp.net核心将探索你的启动类,查找ConfigureConfigureServices方法的方法,并将它们传递给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();
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 我尝试了这个解决方案,但它会导致创建一个新的 Startup 实例。有什么建议)? (2认同)