DOTNET CORE源碼分析之IServiceProvider、ServiceProvider、IServiceProviderEngine、ServiceProviderEngine和ServiceProviderEngineScope


  首先談一下IServiceProvider

  IServiceProvider只提供給了一個根據類型獲取對象的功能,試想一下IOC總得有一個找到對象,具體如下

 

public interface IServiceProvider
{
  object GetService(Type serviceType);
}

  再談一下ServiceProvider

  ServiceProvider實例化了IServiceProvider,也就是實現了GetService,用於獲取容器中實際對象,但是它是借助於IServiceProviderEngine(這個接口稍后再介紹),具體如下:

public object GetService(Type serviceType)
{
  return this._engine.GetService(serviceType);
}

  另外ServiceCollection中有一個方法BuildServiceProvider(存在於類ServiceCollectionContainerBuilderExtensions中),返回值對象類型就是ServiceProvider

/// <summary>
/// Extension methods for building a <see cref="T:Microsoft.Extensions.DependencyInjection.ServiceProvider" /> from an <see cref="T:Microsoft.Extensions.DependencyInjection.IServiceCollection" />.
/// </summary>
public static class ServiceCollectionContainerBuilderExtensions
{
/// <summary>
/// Creates a <see cref="T:Microsoft.Extensions.DependencyInjection.ServiceProvider" /> containing services from the provided <see cref="T:Microsoft.Extensions.DependencyInjection.IServiceCollection" />.
/// </summary>
/// <param name="services">The <see cref="T:Microsoft.Extensions.DependencyInjection.IServiceCollection" /> containing service descriptors.</param>
/// <returns>The <see cref="T:Microsoft.Extensions.DependencyInjection.ServiceProvider" />.</returns>
public static ServiceProvider BuildServiceProvider(
  this IServiceCollection services)
{
  return services.BuildServiceProvider(ServiceProviderOptions.Default);
}

/// <summary>
/// Creates a <see cref="T:Microsoft.Extensions.DependencyInjection.ServiceProvider" /> containing services from the provided <see cref="T:Microsoft.Extensions.DependencyInjection.IServiceCollection" />
/// optionaly enabling scope validation.
/// </summary>
/// <param name="services">The <see cref="T:Microsoft.Extensions.DependencyInjection.IServiceCollection" /> containing service descriptors.</param>
/// <param name="validateScopes">
/// <c>true</c> to perform check verifying that scoped services never gets resolved from root provider; otherwise <c>false</c>.
/// </param>
/// <returns>The <see cref="T:Microsoft.Extensions.DependencyInjection.ServiceProvider" />.</returns>
public static ServiceProvider BuildServiceProvider(
  this IServiceCollection services,
  bool validateScopes)
{
  return services.BuildServiceProvider(new ServiceProviderOptions()
  {
	ValidateScopes = validateScopes
  });
}

/// <summary>
/// Creates a <see cref="T:Microsoft.Extensions.DependencyInjection.ServiceProvider" /> containing services from the provided <see cref="T:Microsoft.Extensions.DependencyInjection.IServiceCollection" />
/// optionaly enabling scope validation.
/// </summary>
/// <param name="services">The <see cref="T:Microsoft.Extensions.DependencyInjection.IServiceCollection" /> containing service descriptors.</param>
/// <param name="options">
/// Configures various service provider behaviors.
/// </param>
/// <returns>The <see cref="T:Microsoft.Extensions.DependencyInjection.ServiceProvider" />.</returns>
public static ServiceProvider BuildServiceProvider(
  this IServiceCollection services,
  ServiceProviderOptions options)
{
  if (services == null)
	throw new ArgumentNullException(nameof (services));
  if (options == null)
	throw new ArgumentNullException(nameof (options));
  return new ServiceProvider((IEnumerable<ServiceDescriptor>) services, options);
}
}

  必須要結合一下IServiceProviderEngine、ServiceProviderEngineServiceProviderEngineScope對象才能具體知道ServiceProvider是怎么獲取IOC容器中的對象了

  在使用BuildServiceProvider的時候,最終會調用new ServiceProvider((IEnumerable<ServiceDescriptor>)services,options),然后就是調用如下函數:

internal ServiceProvider(
  IEnumerable<ServiceDescriptor> serviceDescriptors,
  ServiceProviderOptions options)
{
  IServiceProviderEngineCallback callback = (IServiceProviderEngineCallback) null;
  if (options.ValidateScopes)
  {
	callback = (IServiceProviderEngineCallback) this;
	this._callSiteValidator = new CallSiteValidator();
  }
  switch (options.Mode)
  {
	case ServiceProviderMode.Dynamic:
	  this._engine = (IServiceProviderEngine) new DynamicServiceProviderEngine(serviceDescriptors, callback);
	  break;
	case ServiceProviderMode.Runtime:
	  this._engine = (IServiceProviderEngine) new RuntimeServiceProviderEngine(serviceDescriptors, callback);
	  break;
	case ServiceProviderMode.Expressions:
	  this._engine = (IServiceProviderEngine) new ExpressionsServiceProviderEngine(serviceDescriptors, callback);
	  break;
	case ServiceProviderMode.ILEmit:
	  this._engine = (IServiceProviderEngine) new ILEmitServiceProviderEngine(serviceDescriptors, callback);
	  break;
	default:
	  throw new NotSupportedException("Mode");
  }
}

  就是說最終還是根據ServiceProviderMode來判斷需要實例化哪種ServiceProviderEngine,現在簡單舉例DynamicServiceProviderEngine。DynamicServiceProviderEngine最終還是繼承ServiceProviderEngine,

所以上面說的GetService其實就是調用了ServiceProviderEngine的GetService

public object GetService(Type serviceType)
{
  return this.GetService(serviceType, this.Root);
}

  其中this.Root就是實例化的ServiceProviderScope。上面的this.GetService(serviceType,this.Root)會調用如下函數:

 

internal object GetService(
  Type serviceType,
  ServiceProviderEngineScope serviceProviderEngineScope)
{
  if (this._disposed)
	ThrowHelper.ThrowObjectDisposedException();
  Func<ServiceProviderEngineScope, object> orAdd = this.RealizedServices.GetOrAdd(serviceType, this._createServiceAccessor);
  this._callback?.OnResolve(serviceType, (IServiceScope) serviceProviderEngineScope);
  ServiceProviderEngineScope providerEngineScope = serviceProviderEngineScope;
  return orAdd(providerEngineScope);
}

  最終就是調用Func<ServiceProviderEngineScope, object> orAdd = this.RealizedServices.GetOrAdd(serviceType, this._createServiceAccessor);其中RealizedServices是ConcurrentDictionary<Type, Func<ServiceProviderEngineScope, object>> RealizedServices { get; },this._createServiceAccessor是Func<ServiceProviderEngineScope, object>,通過這個委托根據ServiceProviderEngineScope獲取最終的對象,也就是說,如果服務存在的話就從字典中獲取,不存在就添加到隊列上,並直接返回。另外在實例化ServiceProviderEngine的時候實例化了this._createServiceAccessor = new Func<Type, Func<ServiceProviderEngineScope, object>>(this.CreateServiceAccessor);其中CreateServiceAccessor是一個函數,定義如下:

 

private Func<ServiceProviderEngineScope, object> CreateServiceAccessor(
  Type serviceType)
{
  IServiceCallSite callSite = this.CallSiteFactory.CreateCallSite(serviceType, new CallSiteChain());
  if (callSite == null)
	return (Func<ServiceProviderEngineScope, object>) (_ => (object) null);
  this._callback?.OnCreate(callSite);
  return this.RealizeService(callSite);
}

 

  就DynamicServiceProviderEngine而言,RealizeService的定義如下:

protected override Func<ServiceProviderEngineScope, object> RealizeService(
  IServiceCallSite callSite)
{
  int callCount = 0;
  return (Func<ServiceProviderEngineScope, object>) (scope =>
  {
	if (Interlocked.Increment(ref callCount) == 2)
	  Task.Run<Func<ServiceProviderEngineScope, object>>((Func<Func<ServiceProviderEngineScope, object>>) (() => base.RealizeService(callSite)));
	return this.RuntimeResolver.Resolve(callSite, scope);
  });
}

  RuntimeResolver是ServiceProviderEngine的一個屬性。到此為止,IOC容器的數據就可以獲取到了。下篇博客會繼續說明this.RuntimeResover.Resolve下的事情。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM