gpt4 book ai didi

c# - Asp.Net Core API 注入(inject)单例依赖

转载 作者:太空宇宙 更新时间:2023-11-03 12:28:30 25 4
gpt4 key购买 nike

作为我的应用程序的一部分,我有一个 .Net Core API 项目。与该项目作为其自己的进程运行的大多数情况不同,我打算让 API 在线程中运行,除其他外,在单个进程中运行。这样做的原因是 API 充当 Web 界面,在与本地控制台界面相同的级别上运行。两个接口(interface)共享一个单例对象并对其执行操作(异步)。至少那是计划。但是,我遇到了一个问题。

我有这个用于 API 的 Startup.cs:

public class Startup
{
public Startup(IHostingEnvironment env)
{
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
.AddEnvironmentVariables();
this.Configuration = builder.Build();
}

public IConfigurationRoot Configuration { get; }

public void ConfigureServices(IServiceCollection services)
{.
services.AddMvc();
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
loggerFactory.AddConsole(this.Configuration.GetSection("Logging"));
loggerFactory.AddDebug();

app.UseMvc();
}
}

..这是默认的,有一些小的变化,这个方法用于启动 API:

public static void Run()
{
var host = new WebHostBuilder()
.UseKestrel()
.UseContentRoot(Directory.GetCurrentDirectory())
.UseIISIntegration()
.UseStartup<Startup>()
.Build();

host.Run();
}

我想不通的是如何将我的实例化对象传递给 Startup,这样我就可以将它注册为单例并让它与 Controller 一起工作。

有没有办法做到这一点?如果不能,那么我还能采取什么其他方法?

最佳答案

创建对象并将其注册为 StartupServices 中的单例有什么问题?

services.AddSingleton<ISingleton>(new MySingleton());
services.AddSingleton(new MySingleton());

或者你可以提供一个Func来使创建变得惰性并提供依赖:

services.AddSingleton(provider =>
{
var fooDependency = provider.GetService<FooDependency>();

return new MySingleton(fooDependency);
});

或者你可以将对象的创建委托(delegate)给工厂类(也是懒惰的):

services.AddSingleton(provider => provider.GetService<MyFactory>().CreateMySingleton());

文档:Service Lifetimes and Registration Options .

关于c# - Asp.Net Core API 注入(inject)单例依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43689446/

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