首页 > 其他分享 >.net core IOC容器实现(一) -- ServiceDescriptor

.net core IOC容器实现(一) -- ServiceDescriptor

时间:2023-06-02 22:11:17浏览次数:35  
标签:core serviceType -- 实例 ServiceDescriptor Type public 构造函数

IOC 容器内保存的程序运行过程中使用的服务实例。那么如果有些服务实例需要在运行时动态生成,比如,数据库连接,不可能在程序运行过程中所有线程共用一条数据库连接。所以 IOC 容器内保存的不是具体的服务实例,而是服务的相关信息,使用这个信息可以在程序运行时动态的生成服务实例,这些信息就保存在 ServiceDescriptor 类型的对象中。

属性

//生命周期 
//Singleton 容器内有且只有一份
//Scope 范围内只有一份,范围 可以使用 ServicePorvider.CreateScope 创建(可以将容器理解成树状结构每个Scope就是一个子容器),最常见的范围就是 Http 请求,每个请求算一个范围
//Trasient 每次从IOC容器获取都是新的实例
public ServiceLifetime Lifetime { get; }   
//接口类型  接口类型和实现类型可以相同
public Type ServiceType { get; }     
//实现类型
[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)]public Type? ImplementationType { get; }         
//实现实例  
public object? ImplementationInstance { get; }   
//实现类型工厂 
public Func<IServiceProvider, object>? ImplementationFactory { get; }

构造函数

  1. private 构造函数
    先介绍一个 private 的构造函数,个人认为这个构造函数设计为private有两个原因
  • 实例化出来的所有 ServiceDescriptor 对象都具有 serviceType 和 lifetime,所以这两个属性的赋值可以被单独剥离
  • 由于所有 ServiceDescriptor 必须要描述服务实例的构造方式,所以不能允许外部直接调用这个构造函数生成ServiceDescriptor实例,所以是 private 的
  1. public 构造函数
    根据服务的生命周期和生成方式有三种不同的 public 的构造函数。
  • Singleton
public ServiceDescriptor( Type serviceType,object instance)
    : this(serviceType, ServiceLifetime.Singleton)
{
    //.....
    ImplementationInstance = instance;
}
  • Scope 和 Trasient
    • 通过注入的实例类型通过反射获取
public ServiceDescriptor(Type serviceType,Type implementationType,ServiceLifetime lifetime)
            : this(serviceType, lifetime)
{
     // ....
     ImplementationType = implementationType;
}
    • 通过传入的 构造工厂(委托)获取
public ServiceDescriptor(
Type serviceType,  //服务类型         
Func<IServiceProvider, object> factory,       //创建服务的工厂     
ServiceLifetime lifetime    //服务的生命周期
): this(serviceType, lifetime)   
{                 
    ImplementationFactory = factory;        
}

方法

ServiceDescriptor 里的方法都是静态方法,用于生成 ServiceDescriptor 实例。
核心 是要获取 注入的接口类型 和 实例类型或者生成实例的工厂,所以调用 Describe 方法之后,最终还是两个方法,一个保存了 接口类型和实例类型,一个保存了 接口类型和生成实例的工厂(),下面贴出来的是生成 Trasient 的 ServcieDescriptor 的方法,生成 Scope 和 Singleton 的与之类似

//使用TService, TImplementation 生成 ServiceDescriptor(Transient)  
// TService 接口类型
// TImplementation 实现类型 继承 TService
public static ServiceDescriptor Transient
<TService, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] TImplementation>()            
where TService : class            
where TImplementation : class, TService        
{            
    return Describe<TService, TImplementation>(ServiceLifetime.Transient);        
}

// service 接口类型
// implementationType 实现类型
// lifetime 生命周期
public static ServiceDescriptor Describe(            
    Type serviceType,            
    [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] Type implementationType,            ServiceLifetime lifetime
)        
{            
    return new ServiceDescriptor(serviceType, implementationType, lifetime);        
}

标签:core,serviceType,--,实例,ServiceDescriptor,Type,public,构造函数
From: https://www.cnblogs.com/ccwzl/p/17450049.html

相关文章

  • 一首无名诗
    盛夏星辰三两风,扶我十万八千梦。天晴月空云消散,人间妙龄长相守。这首诗通过描写美好的自然景象,表达了对爱情的向往和执着。首先,诗标题“盛夏星辰三两风”给人一种热情洋溢的感觉,正如爱情初现的激情四射。“三两风”也含有轻柔怜爱的意味,与“扶我十万八千梦”的表述相呼应......
  • 树状数组详解——本质上就是空间换时间,可以解决大部分基于区间上的更新以及求和问题
     943.区间和查询-Immutable 中文 English 给一个整数数组nums,求出下标从i到j的元素和(i≤j),i跟j对应的元素也包括在内。 样例样例1输入:nums=[-2,0,3,-5,2,-1]sumRange(0,2)sumRange(2,5)sumRange(0,5)输出:1-1-3解释:sumRange(0,2)->(-2......
  • 浅谈僵尸网络利器:Fast-flux技术——只是一些特定的apt组织才使用,倒是很少在恶意软件的
    DynamicResolution: FastFluxDNSOthersub-techniquesofDynamicResolution(3)AdversariesmayuseFastFluxDNStohideacommandandcontrolchannelbehindanarrayofrapidlychangingIPaddresseslinkedtoasingledomainresolution.Thistechniqueus......
  • 2023年6月2日,ArrayList
    1.ArrayListpackagecom.wz.arraylist_class;importjava.util.*;publicclasstest02{/***知识点:集合中可以存储不同类型的元素*泛型*@paramargs**/publicstaticvoidmain(String[]args){ArrayList<String>list......
  • 圈复杂度本质上就是——分支覆盖率达到100%需要的测试用例数
     圈复杂度主要与分支语句(if、else、,switch等)的个数成正相关。如下代码:  1.publicStringcase2(intindex,Stringstring){2.null;3.if(index<0){4.thrownewIndexOutOfBoundsException("exception<0");5.}6.if(index==1){......
  • 最小哈希 minhash
    最小哈希维基百科,自由的百科全书 在计算机科学领域,最小哈希(或最小哈希式独立排列局部性敏感哈希)方法是一种快速判断两个集合是否相似的技术。这种方法是由AndreiBroder (1997),[1]发明的,最初在AltaVista搜索引擎中用于在搜索结果中检测并消除重复Web页面。[2]它同样也应用于大规模......
  • AI入门(重实践)书籍推荐
    AI书籍推荐我最近看了下https://book.douban.com/subject/30147778/ 另外如果要看电子书的话建议看这个https://book.douban.com/subject/27154347/评价也非常高从项目着手机器学习和深度学习都有并且难度也不高其中文翻译电子版可以看这里https://github.com/it-ebooks......
  • wireshark 导出tls ssl证书
    wireshark导出证书心逝夜空 2019-03-1117:54:05  2592  收藏 3作者使用版本: Version2.2.1(v2.2.1-0-ga6fbd27frommaster-2.2)1.过滤证书  根据ssl协议来过滤需要的信息2. 选择有Certificate的那一行3.展开,记住不要双击打开,新窗口是无法使用右键的,展开后的样......
  • SMB协议原理抓包分析——本质上和FTP下载文件的思路是一样的
     目录:1.SMB概述2.SMB原理3.SMB配置一、SMB概述SMB(全称是ServerMessageBlock)是一个协议名,可用于在计算机间共享文件、打印机、串口等,电脑上的网上邻居就是靠它实现的。SMB是一种客户机/服务器、请求/响应协议。通过SMB协议,客户端应用程序可以在各种网络环境下读、写服务器......
  • JanusGraph架构——gremlin是提交spark任务计算,数据读写转给后端DB做读写
    JanusGraph是一个图形数据库引擎。JanusGraph本身专注于压缩图序列化、丰富图数据建模、高效的查询执行。此外,JanusGraph利用Hadoop进行图分析和批处理。JanusGraph为数据持久化,数据索引和客户端访问实现了强大的模块化接口。JanusGraph的模块化架构使其能够与各种存储,索引和客......