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

这篇具有很好参考价值的文章主要介绍了.net core IOC容器实现(一) -- ServiceDescriptor。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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 的与之类似文章来源地址https://www.toymoban.com/news/detail-468841.html

//使用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);        
}

到了这里,关于.net core IOC容器实现(一) -- ServiceDescriptor的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • .NET6.0实现IOC容器

    IOC 的作用这里省略…只对如何使用进行说明。 这里使用 .NET6.0 WebAPI 应用 下面是在 program 类中的代码 通过在 Controller 的构造函数中注入 IAuthService 启动后,通过 swagger 发起请求,验证接口。 基本 IOC容器 流程已实现。但是这样存在一个弊端,每个接口和实现都要在 program 中手

    2024年02月10日
    浏览(45)
  • 《深入浅出.NET框架设计与实现》笔记6.2——ASP.NET Core应用程序多种运行模式之二——IIS 服务承载

     ASP.NET Core应用程序可以在多种运行模式下运行,包括自宿主(Self-Hosting)、IIS服务承载、桌面应用程序、服务承载。 因此选择和时的模式很重要。 IIS 服务承载 将 ASP.NET Core 应用程序托管在 Internet Information Services (IIS) 中。 利用 IIS 提供的高级功能,如负载均衡、HTTPS 支持和

    2024年04月26日
    浏览(51)
  • .net core di ioc

    (Dependency Injection,DI)依赖注入,又称依赖关系注入,是一种软件设计模式,也是依赖倒置原则的一种体现。 依赖倒置原则的含义如下 上层模块不依赖下层模块。二者都依赖抽象 抽象不依赖细节 细节依赖抽象 依赖注入原则有别于传统的通过new直接依赖下层模块的形式,

    2024年02月22日
    浏览(34)
  • asp.net core6 webapi 使用反射批量注入接口层和实现接口层的接口的类到ioc中

    IBLL接口层类库 BLL实现接口层类库 program中利用反射批量注入 在控制器中使用构造函数传参就可以调用已经注册的所有是是实现接口的类了的实列了

    2024年02月13日
    浏览(40)
  • 【.NET6+WPF】WPF使用prism框架+Unity IOC容器实现MVVM双向绑定和依赖注入

    前言:在C/S架构上,WPF无疑已经是“桌面一霸”了。在.NET生态环境中,很多小伙伴还在使用Winform开发C/S架构的桌面应用。但是WPF也有很多年的历史了,并且基于MVVM的开发模式,受到了很多开发者的喜爱。 并且随着工业化的进展,以及几年前微软对.NET平台的开源,国内大多

    2024年02月06日
    浏览(63)
  • .net core控制台应用程序在linux运行

    1)创建.net 6.0控制台应用程序 2)在应用根目录执行cmd命令发布应用:dotnet publish -o .deploy 3)将发布文件上传到服务器    4)运行控制台应用程序(dotnet /home/app/ConsoleApp/ConsoleApp5.dll) 5)如果需要定时执行,可以添加sh文件 参考:linux定时备份(删除)mysql_linux数据库定时备

    2024年02月16日
    浏览(61)
  • .Net Core后端架构实战【3-介入IOC控制反转】

    摘要:基于.NET Core 7.0WebApi后端架构实战【2-介入IOC控制反转】  2023/04/09, ASP.NET Core 7.0, VS2022 Dependency Injection,何为依赖注入?由容器动态的将对象依赖的资源注入到对象之中。假设容器在构造对象A时,对象A的构造依赖对象B、对象C、对象D这些参数,容器会将这些依赖关系自

    2024年02月07日
    浏览(43)
  • .NET开源IOC内置容器,生命周期管理与Autofac扩展

    大家好,我是行不更名,坐不改姓的宋晓刚,下面将带领大家从基础小白到高阶的.NET的IOC容器依赖与注入,以及IOC内置容器和生命周期,Autofac的学习,跟上我的步伐进入C#的世界。 微信:15319589104 QQ: 2981345658 文章内容: .NET依赖注入容器的生命周期管理,瞬时生命周期(

    2024年01月21日
    浏览(50)
  • 如何在ASP.NET Core应用中实现与第三方IoC/DI框架的整合?

    我们知道整个ASP.NET Core建立在以ServiceCollection/ServiceProvider为核心的DI框架上,它甚至提供了扩展点使我们可以与第三方DI框架进行整合。对此比较了解的读者朋友应该很清楚,针对第三方DI框架的整合可以通过在定义Startup类型的ConfigureServices方法返回一个ServiceProvider来实现。但

    2024年02月09日
    浏览(53)
  • ASP.NET Core应用程序在IIS服务器上的运行环境介绍和下载安装(超详细)

    要想在 IIS 上成功运行 ASP.NET Core 应用程序,我们需要有ASP.NET Core 运行时和ASP.NET Core Module。而在这里我们仅需要下载ASP.NET Core Hosting Bundle 即可,这是为什么呢? 想了解的可以看文章末节的介绍。 ASP.NET 核心运行时使你能够运行现有的 Web/服务器应用程序。 在 Windows 上,我们

    2024年02月11日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包