当前位置: 首页 > article >正文

杨中科 .Net Core 笔记 DI 依赖注入

提到依赖不得不提到,控制反转(Inversion of Control,IOC)这个概念,简单的来讲就是将控制对象的权限交给框架,不再手动完成。IOC实现方式有2种:

1、服务定位器(ServiceLocator),主动获取对象

2、依赖注入(Dependency Injection,DI),在使用的地方申明对象,由框架自动赋值。

DI好处:简化模块的组装过程,降低模块之间的耦合度。

---------------------------------------------------------------------------------------------------------------------------------DI常见概念:

1、服务(Service):对象;

2、注册服务;

3、服务容器:负责管理注册的服务

4、查询服务:创建对象及关联对象

---------------------------------------------------------------------------------------------------------------------------------根据类型获取和注册服务,需要分别指定服务类型(service type)和实现类型(implementation type),服务类型推荐用接口(可以是接口、类),实现类型只能用类。

.Net 控制反转组件取名为:DependecyInjection,也包含ServiceLocator功能

public inteface iTest{

}

public class Test:iTest{

}

---------------------------------------------------------------------------------------------------------------------------------【怎么使用】

1、Nuget 安装 Microsoft.Extensions.DependencyInjection

2、using Microsoft.Extensions.DependencyInjection

ServiceCollection services = new ServiceCollection();//定义一个承放服务的集合

services.AddTransient<GetRole>();//添加一个瞬态的服务
using (ServiceProvider serviceProvider = services.BuildServiceProvider())
{//ServiceProvider 相当于服务定位器
    GetRole service = serviceProvider.GetService<GetRole>();

    service.Name = "test";
    service.GetName();

}

---------------------------------------------------------------------------------------------------------------------------------

对象生命周期:Transient(瞬态);Scoped(范围)、Singleton(单例)

1、Transient,添加一个瞬态的服务, 每次申明服务时,会创建新的对象。

ServiceCollection services = new ServiceCollection();//定义一个承放服务的集合
services.AddTransient<GetRole>();//添加一个瞬态的服务 每次申明服务时,会创建新的对象

using (ServiceProvider serviceProvider = services.BuildServiceProvider())
{   
    GetRole service = serviceProvider.GetService<GetRole>();
    
    service.Name = "test";
    service.GetName();

    GetRole service1 = serviceProvider.GetService<GetRole>();

    service1.Name = "test2";
    service1.GetName();
   
    //结果:service!=service1
}

2、Singleton,添加一个单例的服务 每次申明服务时,会指向同一对象。

3、Scope,添加一个范围的服务  范围内的申明的服务,会指向同一对象

注:如果申明的Singleton,在Scope范围申明的服务视为Singleton的情况。

ServiceCollection services = new ServiceCollection();//定义一个承放服务的集合

services.AddScoped<GetRole>();

using (ServiceProvider serviceProvider = services.BuildServiceProvider())
{   

    //Scope用法
    using (IServiceScope scope1 = serviceProvider.CreateScope()) 
    {
        GetRole service     = scope1.ServiceProvider.GetService<GetRole>();

        service.Name = "test";
        service.GetName();

        GetRole service2 = scope1.ServiceProvider.GetService<GetRole>();

        service1.Name = "test";
        service1.GetName();

    //范围内service=service2
    }

    using (IServiceScope scope2 = serviceProvider.CreateScope()) 
    {
        GetRole service3 = scope2.ServiceProvider.GetService<GetRole>();

        service.Name = "test";
        service.GetName();

        GetRole service4 = scope2.ServiceProvider.GetService<GetRole>();

        service1.Name = "test";
        service1.GetName();

    }

    //范围外service2!=service3

其他知识点:Dispose 释放资源

如果服务继承了IDisposable接口,在离开Scope范围时,会自动调用类的Dispose方法释放资源。


http://www.kler.cn/a/383123.html

相关文章:

  • SSM— spring,springMVC,mybatis整合
  • 力扣11.5
  • Java 异常处理的最佳实践
  • vscode在windows和linux如何使用cmake构建项目并make生成可执行文件,两者有什么区别
  • 【昇腾】从单机单卡到单机多卡训练
  • SSLHandshakeException错误解决方案
  • 【时间之外】IT人求职和创业应知【27】
  • PC端查看历史消息,鼠标向上滚动加载数据时页面停留在上次查看的位置
  • 使用k8s管理应用以及java案例
  • Go API 多种响应的规范化处理和简化策略
  • 晚霞视频素材哪里下载 高清无水印素材推荐平台
  • 在Scrapy爬虫中应用Crawlera进行反爬虫策略
  • 背包九讲——背包问题求具体方案
  • java.lang.NoClassDefFoundError: kotlin/jvm/JvmInline
  • 无root权限在Linux虚拟环境安装指定版本python
  • [354]基于springboot的足球俱乐部管理系统
  • 第07章 运算符的使用
  • qt QCloseEvent详解
  • C++__XCode工程中Debug版本库向Release版本库的切换
  • 【GIT】sourceTree的“当前分支“,“合并分支“与“检出分支的区别
  • Linux中级(防火墙iptables)
  • 冒泡排序:相邻两俩比较,小的放前面,大的放后面
  • 使用PyCharm连接虚拟机运行spark任务,本地开发:远程提交测试
  • 在老旧小区配电系统中剩余电流继电器的应用
  • 一.Linux文件基本属性
  • docker+mysql配置