转载请注明出处: https://home.cnblogs.com/u/zhiyong-ITNote/

常用扩展方法 注入依赖服务:

new ServiceCollection().AddSingleton<IApplicationBuilder, ApplicationBuilder>();

// AddSingleton多个重载方法 源码

public static IServiceCollection AddSingleton<TService, TImplementation>(this IServiceCollection services)
where TService : class
where TImplementation : class, TService
{
if (services == null)
{
throw new ArgumentNullException(nameof(services));
} return services.AddSingleton(typeof(TService), typeof(TImplementation));
} // Singleton模式 最终的调用
public static IServiceCollection AddSingleton(
this IServiceCollection services,
Type serviceType,
Type implementationType)
{
if (services == null)
{
throw new ArgumentNullException(nameof(services));
} if (serviceType == null)
{
throw new ArgumentNullException(nameof(serviceType));
} if (implementationType == null)
{
throw new ArgumentNullException(nameof(implementationType));
} return Add(services, serviceType, implementationType, ServiceLifetime.Singleton);
} // 所有的Addxxx 最终都是调用Add方法,将ServiceDescriptor添加到IServiceCollection中:
private static IServiceCollection Add(
IServiceCollection collection,
Type serviceType,
Type implementationType,
ServiceLifetime lifetime)
{
var descriptor = new ServiceDescriptor(serviceType, implementationType, lifetime);
collection.Add(descriptor);
return collection;
} // IServiceCollection源码:
public interface IServiceCollection : IList<ServiceDescriptor>
{}

如上,我们一般在ConfigureService中使用Addxxx将服务注入框架的过程。大概做个总结,其实就是屌用IServiceCollection的Addxxx 扩展方法,随后调用Add方法,初始化一个ServiceDescriptor,参数是我们注入的接口和类,还有就是生命周期。随后添加到IServiceCollection中,根据该接口的定义就是一个ServiceDescriptor的集合。

我们看看ServiceDescriptor的源码:

public ServiceDescriptor(
Type serviceType,
object instance)
: this(serviceType, ServiceLifetime.Singleton)
{
if (serviceType == null)
{
throw new ArgumentNullException(nameof(serviceType));
} if (instance == null)
{
throw new ArgumentNullException(nameof(instance));
} ImplementationInstance = instance;
}

该类就是初始化并获取如下属性:

/// <inheritdoc />
public ServiceLifetime Lifetime { get; } /// <inheritdoc />
public Type ServiceType { get; } /// <inheritdoc />
public Type ImplementationType { get; } /// <inheritdoc />
public object ImplementationInstance { get; } /// <inheritdoc />
public Func<IServiceProvider, object> ImplementationFactory { get; }

到此,我们的服务注入到asp.net core框架中就完事了,那么服务的实例化呢?

首先我们理下思路,IServiceProvider接口对应的实现是ServiceProvider,这个类就是实例化了IServiceProvider接口,而IServiceProvider接口只有一个方法:

public object GetService(Type serviceType);

该方法就是获取注入的服务。但是ServiceProvider类不单单是获取注入的服务,服务的实例化还是在该类中实现的,我们看下:

public sealed class ServiceProvider : IServiceProvider, IDisposable, IServiceProviderEngineCallback
{
private readonly IServiceProviderEngine _engine; private readonly CallSiteValidator _callSiteValidator; internal ServiceProvider(IEnumerable<ServiceDescriptor> serviceDescriptors, ServiceProviderOptions options)
{
IServiceProviderEngineCallback callback = null;
if (options.ValidateScopes)
{
callback = this;
_callSiteValidator = new CallSiteValidator();
}
switch (options.Mode)
{
case ServiceProviderMode.Dynamic:
_engine = new DynamicServiceProviderEngine(serviceDescriptors, callback);
break;
case ServiceProviderMode.Runtime:
_engine = new RuntimeServiceProviderEngine(serviceDescriptors, callback);
break;
#if IL_EMIT
case ServiceProviderMode.ILEmit:
_engine = new ILEmitServiceProviderEngine(serviceDescriptors, callback);
break;
#endif
case ServiceProviderMode.Expressions:
_engine = new ExpressionsServiceProviderEngine(serviceDescriptors, callback);
break;
default:
throw new NotSupportedException(nameof(options.Mode));
}
} /// <summary>
/// Gets the service object of the specified type.
/// </summary>
/// <param name="serviceType"></param>
/// <returns></returns>
public object GetService(Type serviceType) => _engine.GetService(serviceType); /// <inheritdoc />
public void Dispose() => _engine.Dispose(); void IServiceProviderEngineCallback.OnCreate(IServiceCallSite callSite)
{
_callSiteValidator.ValidateCallSite(callSite);
} void IServiceProviderEngineCallback.OnResolve(Type serviceType, IServiceScope scope)
{
_callSiteValidator.ValidateResolution(serviceType, scope, _engine.RootScope);
}
}

可以看到该类的构造函数中就是实例化服务的过程了。很直白的可以看出我们常见的几种方法来实例化类:反射,Emit,表达式树等...

目前也算是交代清楚了相关的类。那么框架具体是如何来实例化的呢?整个的流程是怎么样的。篇2再叙

转载请注明出处: https://home.cnblogs.com/u/zhiyong-ITNote/

源码地址:https://github.com/aspnet/DependencyInjection  

最新文章

  1. 以太坊只能合约摸索——第一关,ubuntu开发环境部署
  2. asp中的md5/sha1/sha256算法收集
  3. poj 1442
  4. fopen的第一个参数不能有&#39;\n&#39;
  5. Daily Scrum3
  6. 使用NuGet加载包,发现加载的dll都是最新版,原来少加了参数[-Version]
  7. mysql数据库之索引和分析索引
  8. Nexus 5 电信破解问题 CDMA_HDR重启会变回LTE
  9. 设计模式Adapter模式的五分钟
  10. Jmeter性能测试
  11. 【转】JDBC学习笔记(7)——事务的隔离级别&amp;批量处理
  12. 一个典型的kubernetes工作流程 - kubernetes
  13. QT中对内存的管理
  14. 读spring源码(三)-ClassPathXmlApplicationContext-getBean
  15. Dynamics CRM 日常使用JS整理(一)
  16. git 从远程仓库获取所有分支
  17. 网站图片的轮播JS代码
  18. swiper轮播在ie浏览器上遇到的显示问题探索
  19. Python学习(九) —— 正则表达式与re模块
  20. TOP100summit:【分享实录-美团点评】 业务快速升级发展背后的系统架构演进

热门文章

  1. angular基础巩固
  2. Vue+restfulframework示例
  3. Ubuntu shutdown now 关机后 开机黑屏
  4. bzoj 1076
  5. vue 的动画
  6. C++设计模式——观察者模式(转)
  7. java中的相对目录问题
  8. svn_linux + apache 实现网页访问svn
  9. MySql-8.0.12 安装教程
  10. 设置git记住用户和密码