.Net6.0系列-8 依赖注入(一)

2023-05-16

依赖注入(Dependency Injection,DI)是控制反转(Inversion of Control,IOC)思想的实现方式,依赖注入简化模块的组装过程,降低模块之间的耦合度.
DI的几个概念:
服务(Service):和框架请求之后返回的一个对象,可以是一个数据库链接,也可以是一个文件处理的方法,或者是数据处理的一个过程方法
注册服务:将上面向框架要的这个服务先注册,才能向框架请求
服务容器:负责管理注册的服务
查询服务:创建对象及关联对象
对象生命周期有三种:
(1)Transient(瞬态):获取服务对象每次获取都是一个新的对象
(2)Scoped(范围):在特定范围内再次获取为同一个对象
(3)Singleton(单例):就这一个对象,每次获取都是他
如果一个类实现了IDisposable接口,则离开作用域后容器会自动调用对象的Dispose方法,参考Using
生命周期的选择:如果类无状态,建议选为Singleton,如果类中有状态且有Scope控制就使用Scoped

.Net中使用DI
1.根据类型来获取和注册服务:
可以分别指定服务类型和实现类型.这两者可能相同,也可能不同.服务类型可以是类,也可以是接口,一般面向接口编程更灵活
2…Net控制反转组件取名为DependencyInjection,但是包含ServiceLocator的功能
3.ServiceCollection用来构造容器对象IServiceProvider,调用ServiceCollection的BuliderServiceProvider()创建ServiceProvider,可以用来获取BuliderServiceProvider()之前ServiceCollection中的对象
安装包需求:
Install-Package Microsoft.Extensions.DependencyInjection
using Microsoft.Extensions.DependencyInjection

GetService是根据注册对象来返回的
GetRequiredService:没有服务就抛出异常,因为required是必须有服务,当有多个服务的时候获取的是最后一个服务
GetServices:获取注册的所有的服务,

public interface ITestService
{
	public string Name{get;set;}
	public void SayHi();
}

public class TestServiceImpl:ItestService
{
	public string Name{get;set;}
	public void SayHi()
	{
		Console.WriteLine($"Hi,I'm{Name}");
	}
}
public class TestServiceImpl2:ItestService
{
	public string Name{get;set;}
	public void SayHi()
	{
		Console.WriteLine($"你好,我是{Name}");
	}
}

static void Main(string[] args)
{
	#region 直接注册实现类,和接口没有关系,将实现类注册到服务容器中,然后通过实现类获取服务
	ServiceCollection services=new ServiceCollection();
	services.AddTransient<TestServiceImpl>();
	//下面是两种申请服务的方法,一种是sp.GetServices/一种是sp.CreateScope()
	using(ServiceProvider sp= services.BulidServiceProvider())
	{
		TestServiceImpl tsi=sp.GetService<TestServiceImpl>();
		t.Name="cdc";
		t.SayHi();
        using(IServiceScope scope1=sp.CreateScope())
        {
			TestServiceImpl t=scope1.ServiceProvider.GetService<TestServiceImpl>();
		}
	}
	#endregion
}

static void Main(string[] args)
{
	ServiceCollection services=new ServiceCollection();
	//注册类型是接口,实现类型是方法
	services.AddScoped<ITestService,TestServiceImpl>();
	//这种写法是为了传参数
	services.AddSingleton<ITestService,new TestServiceImpl()>
	using(ServiceProvider sp=services.BulidServiceProvider())
	{
		ITestService ts1=sp.GetService<ITestService>();
		//ITestService ts1=(ITestService)sp.GetService(typeof(ITestService));
		ts1.Name="cdc";		
		ts1.SayHi();		
	}

}


DI会传染的简单范例

namespace DIGOALL
{
	class Progrom
	{
		static void Main(string[] args)
		{
			ServiceClolection services=new ServiceCollection();
			services.AddScoped<Controller>();
			services.AddScoped<ILog,LogImpl>();
			services.AddScoped<IStorage,StorageImpl>();
			services.AddScoped<IConfig,ConfigImpl>();
			using(var sp= services.BulidServiceProvider())
			{
				var c=sp.GetRequiredService<Controller>();
				c.Test();
			}
			Console.ReadKey();
		}
	}
	class  Controller
	{
		private readonly ILog log;
		private readonly IStorage storage;
		public Controller(ILog log,IStorage storage) 
		{
			this.log=log;
			this.storage=storage;
		}
	
		public void Test()
		{
			this.log.Log("开始上传");
			this.storage.Save("写入的东西","1.txt");
			this.log.Log("上传完毕");
		}
	}
	
	#region 日志类
	interface ILog
	{
		public void Log(string msg);
	}
	class LogImpl:ILog
	{
		public void Log(string msg)
		{
			Console.WriteLine($"日志:{msg}");
		}
	}
	#endregion
	
	#region 
	interface IConfig
	{
		public string GetValue(string name);
	}
	class ConfigImpl:IConfig
	{
		public void GetValue(string name)
		{
		 	return "hello";
		}		
	}
	#endregion
	
	#region 云存储
	interface IStorage
	{
		public void Save(string content,string name);
	}
	class StorageImpl:IStorage
	{
		**关键点:获取配置服务,构造函数中赋值给成员变量**
		private readonly IConfig config;		
		public StorageImpl(IConfig config)
		{
			this.config=config;
		}
		public void Save(string content,string name)
		{
			string server=config.GetValue("server");
			Console.WriteLine($"向服务器{server}的文件名为{name}上传{content}");
		}
	}
	#endregion
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

.Net6.0系列-8 依赖注入(一) 的相关文章

  • Angular2文档学习的知识点摘要——依赖注入

    目录 目录依赖注入 xff08 DI xff09 为什么需要依赖注入 xff1f Angular 依赖注入 配置注入器在 NgModule 中注册提供商在组件中注册提供商该用NgModule还是应用组件 xff1f 注入服务显性注入器的创建
  • Spring-依赖注入(IOC)

    SPRING 一 依赖注入 xff08 IOC xff09 1 什么是依赖注入 xff08 1 xff09 我们经常说的控制反转 xff08 Inversion of Control IOC xff09 和依赖注入 xff08 Depend
  • spring的依赖注入

    一 点睛 控制反转和依赖注入在Spring环境下是等同的概念 xff0c 控制反转是通过依赖注入实现的 所谓依赖注入指的是容器负责创建对象和维护对象间的依赖关系 xff0c 而不是通过对象本身负责自己的创建和解决自己的依赖 依赖注入的主要目
  • net6的Web MVC项目实现限流功能

    原理 xff1a 利用MemoryCache服务组件 xff0c 记录用户最后一次访问接口的时间 xff0c 如果本次访问距离最后一次访问不超过1秒 xff0c 提示用户访问过于频繁 xff0c 否则 xff0c 接口可以正常访问 然后利用
  • .NET6.0 EF Core连接sql

    1 先导入四个包 Microsoft EntityFrameworkCore Microsoft EntityFrameworkCore Relational Microsoft EntityFrameworkCore SqlServer
  • .NET6中使用GRPC详细描述

    Supported languages gRPC xff0c 官网 至于原理就不说了 xff0c 可以百度原理之后 xff0c 然后再结合代码 xff0c 事半功倍 xff0c 就能很好理解GRPC了 目录 一 简单使用 二 实际应用 一
  • Nodejs+AngularJS模块之Angular依赖注入

    Nodejs 43 AngularJS模块之Angular依赖注入 Angular模块需要的模块idea项目结构1 基本的nodejs静态Web服务器代码2 在控制器和模块定义中实现依赖注入代码injector jsinjector htm
  • .net6 下 SqlSugar迁移创建表以及生成实体类 sqlserver数据库

    一 根据实体类迁移创建表 在项目NuGet中安装SqlSugar和System Data SqlClient 创建实体类 xff0c 存放在Models文件夹下 CodeFirstTable1表实体类 span class token ke
  • .Net6.0系列-8 依赖注入(一)

    依赖注入 Dependency Injection DI 是控制反转 Inversion of Control IOC 思想的实现方式 依赖注入简化模块的组装过程 降低模块之间的耦合度 DI的几个概念 服务 Service 和框架请求之后返
  • spring中的控制反转和依赖注入之间的关系

    Spring中的控制反转 把new这一个过程交给了spring容器去处理 控制反转就是将new对象这一个过程交给外部去做 即Spring 而不是自己去创建 图中的1 控制正转 并没有这个名词 只是为了更好的理解什么是控制反转 图2中并没有n
  • [开发过程]<c#上位机>关于.net6

    水下机器人 c 上位机 根据官方文档进行学习开发 1 了解 net6 简而言之 就是稳定强悍 跨设备 简单上手 资源丰富 强 Announcing NET 6 The Fastest NET Yet NET Blog NET 6 is no
  • Field injection is not recommended 依赖注入方式

    参考文章 http vojtechruzicka com field dependency injection considered harmful 首先对于还不熟悉 Autowired的同学当然也包括我先去看看它到底有什么作用 自动装配
  • 依赖注入学习总结1

    生活中的 控制反转 自己发电和用电网的电 自己发电需要自购发电机 自学发电方法 维护发电设备等等 用电网的电只需要付费就可以直接使用 依赖注入 Dependency Injection DI 是控制反转 Inversion of Contr
  • Spring依赖注入

    内容主要来自 Spring实战 第二章 区别在于自己写了一个测试类 对于初学者更容易理解依赖注入 先定义两个接口 1 CompactDisc java package soundsystem public interface Compact
  • Aspose最新版22.8教程

    直接上代码 用vs开发工具写一段代码 word转pdf new Document this txtWordFile Text Save new pdf new PdfSaveOptions 编译 生成exe 打开dnspy 将生成的exe和
  • 【Spring】Spring依赖注入与控制反转理解

    Spring是一个庞大的框架 封装了很多成熟的功能 能够让我们无需重复造轮子 其次 它使用IOC进行依赖管理 利用JAVA的反射机制 将实例的初始化交给Spring Spring可以通过配置文件管理实例 我们就不用自己初始化实例啦 有人会问
  • GO 依赖注入

    依赖注入是软件工程中经常使用到的一种技术 它提供了一种控制反转的机制 把控制权利交给了调用方 调用方来决定使用哪些参数 哪些对象来进行具体的业务逻辑 依赖注入的本质其实是为了将组件的创建与其依赖的创建分离 实现原理 通过反射读取对象的依赖
  • Spring源码分析(十一)依赖注入源码解析4:DefaultListableBeanFactory#findAutowireCandidates 根据类型查找所有候选Bean

    根据类型查找所有候选Bean org springframework beans factory support DefaultListableBeanFactory findAutowireCandidates protected Map
  • Spring控制反转和依赖注入的好处

    要了解控制反转 Inversion of Control 我觉得有必要先了解软件设计的一个重要思想 依赖倒置原则 Dependency Inversion Principle 什么是依赖倒置原则 假设我们设计一辆汽车 先设计轮子 然后根据轮
  • .NET6-Asp.Net Core webapi -从零开始的webapi项目

    本项目为本人22年毕设项目 后续会不断更新本篇文章 全部内容都会写在这一篇文章里 喜欢的请持续关注 一 如何创建 Asp Net Core webapi 项目 二 如何使用 EntityFrameWorkCore DbFirst 需要用到的

随机推荐

  • postman简单上手教程

    1 xff1a postman浏览器已经停止更新了 xff0c 所以下面介绍的是app版本 2 xff1a 打开postman xff0c 创建自己的测试目录 xff0c 点加号创建 xff0c 这里我创建了test project 3 x
  • 实战microPython(06)-OLED屏的使用(2)

    实战microPython 06 OLED屏的使用 2 David Zou 2018 11 27 大家好 xff0c 上次介绍了OLED显示屏的相关知识 xff0c 今天 xff0c 我们进入实战 xff0c 学习如何使用OLED显示屏 如
  • C++实现HTTP上传

    插件中需要一个上传文件的功能 xff0c 我跟老大说 xff0c 我想FTP上传 xff0c 老大一瞪眼 xff0c 那还得再布个FTP服务器 xff0c 直接用HTTP上传多简单 那么C 43 43 如何将文件上传HTTP服务器上呢 xf
  • RTK和GPS定位

    首先 xff0c 简要说一下GPS和RTK的工作原理 GPS定位的基本原理是 xff0c 测量出已知位置的卫星到地面GPS接收器之间的距离 xff0c 然后接收器通过与至少4颗卫星通讯 xff0c 计算与这些卫星间的距离 xff0c 就能确
  • 基于VC6的UAV地面站(GCS)程序及源代码

    此地面站 xff08 GCS603 xff09 是早年针对北航一款小飞控开发的 xff0c 那个时候APM好像都才刚刚问世 程序具备了简单地面站的基本功能 xff0c 如界面绘制 串口数据读写 数据记录 数据帧的合成与解析 航线设置等 此程
  • ArduPlane plane 部分功能与代码移植到 GCC(Atmel studio 6.2)版本的程序源代码 HelloPilot

    几年前由于当时 ArduPlane xff08 Ver2 76 xff09 的开发环境为arduino ide 开发尤其是调试环境非常不友好 xff0c 要进行程序调试及跟踪非常不方便 xff0c 同时出于学习掌握arduplane代码原理
  • 简单的说说飞控硬件研发过程中的各种坑

    我们的飞控 xff0c 从当初第一个概念设计到现在 xff0c 历时好几年 xff0c 目前经过上百架次的试飞 xff0c 功能已经基本完备 回首前面走过的历程 xff0c 不说尸横遍野吧 xff0c 至少也是血泪斑斑 有无数的坑需要投入大
  • 1、无人系统控制站软件开发平台 CSS(Control Station Studio)概述

    1 初衷 在CSS之前 xff0c 通过参与开发数个大中型无人机地面控制站项目 xff0c 在GCS xff08 Ground Control Station xff09 设计与实现方面积累了一些经验和感悟 在先前的开发过程中 xff0c
  • .Net6.0系列-7 .Net 6LinQ(三)常用扩展方法

    一 投影 把集合中的每一项转换为另一种类型使用的是Select 方法 where 的返回集合是Enumerable 返回的是T的全部字段 而Select是可以返回集合的任意需要的字段 find 是在lamada表达式中的使用 以上两个是Li
  • 一款适于作为飞行试验平台的小四轴设计

    四轴虽小 xff0c 但也是第7版改进设计了 xff0c 定型了 xff01 优点 1 安全性高 作为实验平台 xff0c 最大的风险来自于失控 小四轴 xff08 是的 xff0c 它现在还没名字 xff09 可靠的旋翼保护圈以及其他保护
  • 上手Nucleo H743ZI 开发板下载失败问题解决方法

    准备研究Stm32H7 xff0c 买了块Nucleo H743ZI开发板回来研究 之前一直使用的是stm32F4 xff0c 开发环境为keil 5 13 43 STM32F4xx DFP 2 10 0 st linkV2 开工之前仔细读
  • 固定翼武德充沛,多旋翼费拉不堪

    实际飞行测试 同样的动力组合 xff1a 2205电机 43 5030 3叶桨 同样的动力电池 xff1a 2200ma xff0c 3s xff0c 20c 基本一致的起飞全重 xff1a 固定翼680g xff0c 多轴700g 续航时
  • PH7系统简介

    PH7系统简介 PH7是什么 xff1f 狭义的PH7是一套以无人机飞控为典型应用案例 xff0c 涵盖无人车或船 GCS数据采集 伺服控制 AHRS 地面模拟仿真系统等的通用控制器代码框架 xff0c 该框架以Stm32CubeMx生成代
  • 小型无人机的布线与布局设计

    小型无人机的布线与布局设计 xff0c 似乎看上去像是在总体设计当中一个细枝末节 xff0c 是往往会被忽略掉的部分 但实际上 xff0c 布线与布局虽然不像飞控算法设计 飞行平台气动设计是总体设计当中最核心和最重要的部分 xff0c 但却
  • Bread Board Pilot 即将发布

    Bread Board Pilot xff08 简称BBP xff09 为基于 PH7 代码框架 xff08 PH7 系统简介 xff09 的一款飞控快速原型开发板 相比传统飞控板 xff0c BBP 的硬件设计具有以下突出特点 xff1a
  • Mavlink 协议硬解析主要代码

    int MAVLinkProtocol ParseMsg BYTE arMsgBuf MSGVALUE pMavMsg CString amp strMsgText Function Parameters arMsgBuf 为完整的 mav
  • 网络调试助手(NetAssist)不能正常创建TCP Serve连接问题

    一 问题由来 第一次使用网络调试助手 xff08 NetAssist xff09 建立服务端 xff08 TCP Server xff09 连接时碰到链接失败的问题 xff0c 如图所示 xff0c 其原因在于本地主机端口8080被其他进程
  • postman调用J-WSSE认证方式接口

    J WSSE认证方式的内容包括 xff1a 用户名 密码 nonce 时间戳 nonce是一个随机字符串 xff1b 时间戳 Created 为W3DTF格式 xff1b 密码创建方式为 xff1a PasswordDigest 61 Ba
  • ROS 三种通信编程入门:【话题通信】【服务通信】【动作通信】

    目录 一 创建工作空间二 ROS通信编程2 1 话题编程2 2 服务编程2 3 动作编程 五 总结六 参考资料 本文内容 xff1a 学习古月居 ROS 教学课件和相关视频 xff0c 练习课件上的话题通信 服务通信编程代码示例 一 创建工
  • .Net6.0系列-8 依赖注入(一)

    依赖注入 Dependency Injection DI 是控制反转 Inversion of Control IOC 思想的实现方式 依赖注入简化模块的组装过程 降低模块之间的耦合度 DI的几个概念 服务 Service 和框架请求之后返