var services = new ServiceCollection(); var _serviceProvider = services.BuildServiceProvider(); serviceScope = _serviceProvider.GetRequiredService<IServiceScopeFactory>().CreateScope() var internalServiceProvider = serviceScope.ServiceProvider;
internal ServiceProvider(IEnumerable<ServiceDescriptor> serviceDescriptors, ServiceProviderOptions options) { Root = this; if (options.ValidateScopes) { _callSiteValidator = new CallSiteValidator(); } _table = new ServiceTable(serviceDescriptors); _table.Add(typeof(IServiceProvider), new ServiceProviderService()); _table.Add(typeof(IServiceScopeFactory), new ServiceScopeService()); _table.Add(typeof(IEnumerable<>), new OpenIEnumerableService(_table)); }
internal ServiceProvider(ServiceProvider parent) { Root = parent.Root; _table = parent._table; _callSiteValidator = parent._callSiteValidator; }
_table = new ServiceTable(serviceDescriptors); //注入默認的依賴注入,這樣才能在使用 _serviceProvider.GetRequiredService<IServiceScopeFactory>() 或在建立對象時爲構造方法中的IServiceProvider 注入實例。 _table.Add(typeof(IServiceProvider), new ServiceProviderService()); _table.Add(typeof(IServiceScopeFactory), new ServiceScopeService()); _table.Add(typeof(IEnumerable<>), new OpenIEnumerableService(_table));
// BuildServiceProvider() 是擴展方法,有三個重載 //最終實現方法定義:this IServiceCollection services, ServiceProviderOptions options //其中services是當前擴展的IServiceCollection,options是一些可選擴展選項 BuildServiceProvider() == new ServiceProvider(services, options); _serviceProvider.GetRequiredService<IServiceScopeFactory>(); //這一句獲取一個ServiceScopeFactory實例,IServiceScopeFactory咱們上面說過了,建立RootServiceProvider時內部註冊的。 // CreateScope() // CreateScope()是在IServiceScopeFactory接口內定義,ServiceScopeFactory類的實現爲: //return new ServiceScope(new ServiceProvider(_provider)); //其中_provider參數類型爲ServiceProvider,是ServiceScopeFactory類的一個字段,其值來自構造方法注入 CreateScope() == new ServiceScope(new ServiceProvider(_provider));