Короткий ответ
В большинстве случаев нет разницы между ними. Оба свойства указывают на один и тот же экземпляр 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);
// ...
}
Код от RouteBuilder.cs
public RouteBuilder(IApplicationBuilder applicationBuilder, IRouter defaultHandler)
{
// ...
ServiceProvider = applicationBuilder.ApplicationServices; // ln 36
// ...
}