asp.net-core - ServiceProvider.GetRequiredService 与 ApplicationServies.GetRequiredService 与单例服务
问题描述
调用单例服务有什么区别。
在 app.UseMvc();
app.UseMvc(options =>
{
options
.ServiceProvider
.GetRequiredService<IYamlIndexer>()
.IndexContentFiles(Constants.ContentPath);
});
或这个:
app
.ApplicationServices
.GetRequiredService<IYamlIndexer>()
.IndexContentFiles(Constants.ContentPath);
解决方案
简答
对于大多数用例,两者之间没有区别。两个属性都指向同一个IServiceProvider
实例,并且都将获得所需单例服务的同一个实例。在边缘情况下,调用的时间可能会有所不同,但我想不出会导致这种情况发生的边缘情况。除非我们做一些不寻常的事情,否则两者都只会运行一次,那将是在应用程序启动期间。
实验演示
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
services.AddSingleton<SomeSingltonService>();
}
public void Configure(IApplicationBuilder app)
{
var appServices = app.ApplicationServices;
var appService = appServices.GetRequiredService<SomeSingltonService>();
Console.WriteLine("=======================");
Console.WriteLine("Configure");
app.UseMvc(configureRoutes =>
{
var routeServices = routeBuilder.ServiceProvider;
var routeService = routeServices.GetRequiredService<SomeSingltonService>();
Console.WriteLine("UseMvc");
if (appServices == routeServices && appService == routeService)
{
Console.WriteLine("They are the same instances.");
}
});
Console.WriteLine("=======================");
}
}
这是输出:
=======================
Configure
UseMvc
They are the same instance.
=======================
演示的源代码
在幕后UseMvc
将 传递IApplicationBulder
给RouteBuilder
构造函数。然后将RouteBuilder
分配IApplicationBulder.ApplicationServices
给它自己的IRouteBuilder.ServiceProvider
属性。
来自MvcApplicationBuilderExtensions.cs的代码
public static IApplicationBuilder UseMvc(
this IApplicationBuilder app,
Action<IRouteBuilder> configureRoutes)
{
// ...
var routes = new RouteBuilder(app) // ln 136
{
DefaultHandler = app.ApplicationServices.GetRequiredService<MvcRouteHandler>(),
};
configureRoutes(routes);
// ...
}
public RouteBuilder(IApplicationBuilder applicationBuilder, IRouter defaultHandler)
{
// ...
ServiceProvider = applicationBuilder.ApplicationServices; // ln 36
// ...
}
推荐阅读
- php - 来自 PDO 查询的数据不返回任何内容 - 突然停止工作
- android - 接收推送消息时如何设置通知标头?
- javascript - 如何将 javascript 数组发送到 Spring MVC 控制器
- c++ - Visual Studio 2019 中不允许成员重新声明(在 VS 2013 中成功编译的相同代码)
- python - 创建条形图
- json - 转换 JSON 消息的最佳实践
- tomcat - 与 Hybris 的 HotSwap - 不适用于 Hybris 店面扩展代码
- performance - 在函数内部调用函数与返回,哪个更高效?
- angular - 如何在 nginx 中部署 Angular 应用程序
- javascript - Chrome 浏览器 AJAX 异步问题:false