asp.net core 依赖注入实现全过程粗略剖析(3)

接着 前面,前面的过程是普遍常用的依赖注入解析过程,我们正常都是在startup类中注入依赖服务,但是,笔者这周开发的时候遇到个问题,不同服务的生命周期不同,不能调用服务。举个例子,AddDbContext注入数据库上下文,生命周期默认是scoped,但是我有个需求注入的服务是单例的,因此我注入的单利服务不能引用数据库上下文来调用数据库,最后是通过CreateScoped来解决的。因此,这篇文章说到说到CreateScoped。

public static IServiceScope CreateScope(this IServiceProvider provider)
{
    return provider.GetRequiredService<IServiceScopeFactory>().CreateScope();
}

最终是由获取接口IServiceScopeFactory的服务(也就是接口的实现类),由服务调用其CreateScope方法,作为返回值。

GetRequiredService方法的最终实现:

public static object GetRequiredService(this IServiceProvider provider, Type serviceType)
{
    provider.GetService(serviceType);
}

由接口IServiceProvider的实现类来获取指定的服务。
IServiceProvider接口,有三个实现类:
ServiceProviderEngineScope
ServiceProviderEngine
ServiceProvider
查看源码可知,而这三个类最终都是调用IServiceProviderEngine接口的GetService方法。该接口的实现类有多个如下:
DynamicServiceProviderEngine
RuntimeServiceProviderEngine
ILEmitServiceProviderEngine
ExpressionsServiceProviderEngine
CompiledServiceProviderEngine
ServiceProviderEngine
前五个类都是直接继承自类ServiceProviderEngine,同时这五个类的实现都是通过特定的方式来实例化指定接口,也就是返回一个接口的服务对象。
ServiceProviderEngine类的实现签名:

internal abstract class ServiceProviderEngine : IServiceProviderEngine, IServiceScopeFactory
{}

也就是说最后所有的实现都是基于IServiceProviderEngine以及IServiceScopeFactory接口。

internal interface IServiceProviderEngine : IDisposable, IServiceProvider
{
    IServiceScope RootScope { get; }
}
public interface IServiceScopeFactory
{
    IServiceScope CreateScope();
}

IServiceScope接口的定义:

public interface IServiceScope : IDisposable
{
    IServiceProvider ServiceProvider { get; }
}

这趟下来,就获取了接口IServiceScopeFactory的服务。随后就通过服务调用CreateScope方法。上面说了继承自接口IServiceScopeFactory的类有五个,最后都是继承自ServiceProviderEngine,这里调用CreateScope方法,最后也是调用ServiceProviderEngine类的CreateScope方法。签名如下:

public IServiceScope CreateScope()
{
    if (_disposed)
    {
        ThrowHelper.ThrowObjectDisposedException();
    }

    return new ServiceProviderEngineScope(this);
}

返回一个接口IServiceScope的实例化类。该方法签名如下:

internal class ServiceProviderEngineScope : IServiceScope, IServiceProvider
{

}

最后我们还是调用ServiceProviderEngine类实例来调用GetService方法获取指定接口的服务。
举个实例使用的代码示例:

using (var _scope = _serviceProvider.CreateScope())
{
    var _context = _scope.ServiceProvider.GetService<PracticeDevDbContext>();
}

也就是说,是用CreateScope方法来解析接口获取服务,并不是直接的调用ServiceProvider来获取接口的服务,而是通过类外的IServiceScope来
解析指定的接口获取服务,转了个弯。
那么为什么要这么实现呢?其实我并不清楚,只是遇到了一个依赖注入的问题,最后是通过如上代码解析上下文类获取数据的。后续有待研究。

原文地址:https://www.cnblogs.com/zhiyong-ITNote/p/9419152.html

时间: 2024-08-30 10:20:56

asp.net core 依赖注入实现全过程粗略剖析(3)的相关文章

asp.net core 依赖注入实现全过程粗略剖析(2)

接着 上篇 目前也算是交代清楚了相关的类.那么框架具体是如何来实例化的呢?整个的流程是怎么样的. 我们参考源码中的Test文件夹来看看: var collection = new ServiceCollection(); collection.AddTransient<DependOnNonexistentService>(); var provider = CreateServiceProvider(collection); protected override IServiceProvid

ASP.NET Core 依赖注入最佳实践——提示与技巧

在这篇文章,我将分享一些在ASP.NET Core程序中使用依赖注入的个人经验和建议.这些原则背后的动机如下: 高效地设计服务和它们的依赖. 预防多线程问题. 预防内存泄漏. 预防潜在的BUG. 这篇文章假设你已经基本熟悉依赖注入和ASP.NET Core.如果不是,则先阅读文章: 在ASP.NET Core中使用依赖注入 基础 构造函数注入 构造函数注入常用于在服务构建上定义和获取服务依赖.例如: 1 public class ProductService 2 { 3 private read

asp.net core 依赖注入

依赖注入入门 全面理解 ASP.NET Core 依赖注入 参考https://www.cnblogs.com/tcjiaan/p/8732848.html 如何在StartUp中的ConfigureServices方法里直接调用刚刚添加好的注册? // redis注入 services.AddSingleton<IRedisConnection>(k => { return new RedisConnection(6, Configuration["RedisConnecti

ASP.NET Core依赖注入——依赖注入最佳实践

在这篇文章中,我们将深入研究.NET Core和ASP.NET Core MVC中的依赖注入,将介绍几乎所有可能的选项,依赖注入是ASP.Net Core的核心,我将分享在ASP.Net Core应用中使用依赖注入的一些经验和建议,并且将会讨论这些原则背后的动机是什么: (1)有效地设计服务及其依赖关系. (2)防止多线程问题. (3)防止内存泄漏. (4)防止潜在的错误. 在讨论该话题之前,了解什么是服务是生命周期至关重要,当组件通过依赖注入请求另一个组件时,它接收的实例是否对该组件实例是唯一

ASP.NET Core 依赖注入(DI)

原文:ASP.NET Core 依赖注入(DI) ASP.NET Core的底层设计支持和使用依赖注入.ASP.NET Core 应用程序可以利用内置的框架服务将服务注入到启动类的方法中,并且应用程序服务也可以配置注入.由ASP.NET Core 提供的默认服务容器提供了最小功能集,并不是取代其他容器. 1.浅谈依赖注入 依赖注入(Dependency injection,DI)是一种实现对象和依赖者之间松耦合的技术,将类用来执行其操作的这些对象以注入的方式提供给该类,而不是直接实例化依赖项或者

ASP.NET Core 依赖注入基本用法

ASP.NET Core 依赖注入 ASP.NET Core从框架层对依赖注入提供支持.也就是说,如果你不了解依赖注入,将很难适应 ASP.NET Core的开发模式.本文将介绍依赖注入的基本概念,并结合代码演示如何在 ASP.NET Core中使用依赖注入. 什么是依赖注入? 百度百科对于依赖注入的介绍: 控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度.其中最常见的方式叫做依赖注入(Dependency I

了解ASP.NET Core 依赖注入,看这篇就够了

DI在.NET Core里面被提到了一个非常重要的位置, 这篇文章主要再给大家普及一下关于依赖注入的概念,身边有工作六七年的同事还个东西搞不清楚.另外再介绍一下.NET  Core的DI实现以及对实例生命周期的管理(这个是经常面试会问到的问题).最后再给大家简单介绍一下在控制台以及Mvc下如何使用DI,以及如何把默认的Service Container 替换成Autofac. 一.什么是依赖注入 1.1 依赖 1.2 什么注入 为什么反转 何为容器 二..NET Core DI 2.1 实例的注

【转】ASP.NET Core 依赖注入

DI在.NET Core里面被提到了一个非常重要的位置, 这篇文章主要再给大家普及一下关于依赖注入的概念,身边有工作六七年的同事还个东西搞不清楚.另外再介绍一下.NET  Core的DI实现以及对实例生命周期的管理(这个是经常面试会问到的问题).最后再给大家简单介绍一下在控制台以及Mvc下如何使用DI,以及如何把默认的Service Container 替换成Autofac. 一.什么是依赖注入 1.1 依赖 1.2 什么注入 为什么反转 何为容器 二..NET Core DI 2.1 实例的注

全面理解 ASP.NET Core 依赖注入

DI在.NET Core里面被提到了一个非常重要的位置, 这篇文章主要再给大家普及一下关于依赖注入的概念,身边有工作六七年的同事还个东西搞不清楚.另外再介绍一下.NET  Core的DI实现以及对实例生命周期的管理(这个是经常面试会问到的问题).最后再给大家简单介绍一下在控制台以及Mvc下如何使用DI,以及如何把默认的Service Container 替换成Autofac. 我录了一些关于ASP.NET Core的入门视频:有兴趣的同学可以去看看.  http://www.cnblogs.co