我正在构建一个小型的ASP.NET核心应用程序,该应用程序还有一堆独立的业务逻辑,可以在自己的线程中运行。我已经在旁边程序中使用了IServiceProvider
,所以当我发现ASP.NET Core也使用它自己的IServiceProvider
时,所以我想我只能重用一个实例。
现在问题是,网络主机使用线程安全的IServiceProvider
是什么?我的设置基本上看起来像这样
var host = new WebHostBuilder()
.UseKestrel()
.UseContentRoot(Directory.GetCurrentDirectory())
.UseIISIntegration()
.UseStartup<Startup>()
.UseApplicationInsights()
.Build();
Task.Run(() => {
// here I access the IServiceProvider via `host.Services`
new Foo(host.Services).Run();
});
host.Run();
答案 0 :(得分:5)
The default service provider implementation。您可以看到服务工厂存储在ConcurrentDictionary
中,building an expression for creating service object在除第一个之外的单独线程中执行。我确信这个表达式也是线程安全的(可能是无状态的)。所以默认的ServiceProvider
是线程安全的。