【发布时间】:2021-12-30 09:06:53
【问题描述】:
我们可以通过以下方式访问IServiceProvider:
public class ProductService
{
private readonly IProductRepository _productRepository;
public ProductService(IServiceProvider serviceProvider)
{
_productRepository = serviceProvider.GetRequiredService<IProductRepository>();
}
...
}
所以很明显.net默认注册IServiceProvider为服务,但我查了源码:https://github.com/aspnet/Hosting/blob/master/src/Microsoft.Extensions.Hosting/HostBuilder.cs#L198
private void CreateServiceProvider() {
var services = new ServiceCollection();
services.AddSingleton(_hostingEnvironment);
services.AddSingleton(_hostBuilderContext);
services.AddSingleton(_appConfiguration);
services.AddSingleton<IApplicationLifetime, ApplicationLifetime>();
services.AddSingleton<IHostLifetime, ConsoleLifetime>();
services.AddSingleton<IHost, Host>();
services.AddOptions();
services.AddLogging();
foreach (var configureServicesAction in _configureServicesActions) {
configureServicesAction(_hostBuilderContext, services);
}
var containerBuilder = _serviceProviderFactory.CreateBuilder(services);
foreach (var containerAction in _configureContainerActions) {
containerAction.ConfigureContainer(_hostBuilderContext, containerBuilder);
}
_appServices = _serviceProviderFactory.CreateServiceProvider(containerBuilder); // _appServices is IServiceProvider
if (_appServices == null) {
throw new InvalidOperationException($"The IServiceProviderFactory returned a null IServiceProvider.");
}
}
所以我们可以看到例如:
services.AddSingleton(_appConfiguration);
注册IConfiguration(后台ConfigurationRoot实例),这就是我们可以在startup.cs中使用它的原因:
public class Startup {
public Startup(IConfiguration configuration) {
Configuration = configuration;
}
public IConfiguration Configuration { get; }
但是我在任何地方都看不到源代码寄存器_appServices(IServiceProvider),源代码中没有像services.AddSingleton(_appServices);这样的东西
那么我们如何仍然可以自动访问IServiceProvider?或者我一定是错过了某个地方,源代码确实在其他地方注册了IServiceProvider?
【问题讨论】:
标签: c# .net-core dependency-injection