gpt4 book ai didi

c# - 获取 Startup.cs 对象的引用

转载 作者:太空狗 更新时间:2023-10-29 22:25:33 26 4
gpt4 key购买 nike

这是标准 ASP.NET Core 应用程序的框架:

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 对象实例,我可以将其插入到我的库/框架中。

上下文是设置一些 Uber 级别的框架并获取此连接 (Startup.cs) 的引用,所有请求都在该连接处启动。

最佳答案

如果您的Startup 实现了IStartup 接口(interface),获取对它的引用很容易:

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 并不要求你的启动类实现这个接口(interface)。如果没有 - 它将使用适配器模式并将您的 Startup 类调整为 IStartup 接口(interface)。您仍然会有一个 IStartup 实例,但它不会是您的 Startup 类。相反,它将是 ConventionBasedStartup 的一个实例。 Asp.net Core 将探索启动类的方法,找到 ConfigureConfigureServices 方法并将它们传递给 ConventionBasedStartup,后者将使它们适应 IStartup 界面。在这种情况下,如果不进行大量反射就无法检索启动类的实例,因为它实际上并未存储在 ConventionBasedStartup 的任何字段(即使是私有(private)字段)中,并且只能通过委托(delegate)引用访问。

长话短说 - 如果您想获取 Startup 类的实例 - 让它实现 IStartup 接口(interface)。

关于如何实现 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();
}
}

关于c# - 获取 Startup.cs 对象的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42052458/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com