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

依赖注入(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
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/11913.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

腾讯云4核8G12M轻量服务器配置性能评测

腾讯云轻量4核8G12M服务器&#xff0c;之前是4核8G10M配置&#xff0c;现在公网带宽和月流量包整体升级&#xff0c;12M公网带宽下载速度可达1536KB/秒&#xff0c;系统盘为180GB SSD盘&#xff0c;每月2000GB免费流量&#xff0c;腾讯云百科来详细说下4核8G12M轻量应用服务器配…

AJAX | 拦截器、文件上传和下载

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; AJAX Ajax即Asynchronous Javascript And XML&#xff08;异步JavaScript和XML&#xff09;&#xff1b;Ajax技术网页应用能够快速地将增量更新呈现在用户界面上&…

锁子甲 bulid+sim

链接: youtube 分析&#xff1a;洒一堆点——copy 模型——点和模型符合一定规律 点和点的距离符合上述图中的关系 &#xff08;横纵&#xff09; 横向 但是我们要横向10个点够了&#xff1a; 用modulo 除余 纵向 这里用除法向上取整 /10 eg &#xff1a; 0-9 得0 10-19 得1…

redis哨兵模式配置(配置文件等)

Redis-Sentinel机制主要用三个功能&#xff1a; (1)监控&#xff1a;不停监控Redis主从节点是否安装预期运行 (2)提醒&#xff1a;如果Redis运行出现问题可以 按照配置文件中的配置项 通知客户端或者集群管理员 (3)自动故障转移&#xff1a;当主节点下线之后&#xff0c;哨兵…

【版本控制】Github同步Gitee镜像仓库自动化脚本

文章目录Github同步Gitee镜像仓库自动化脚本前言什么是Hub Mirror Action&#xff1f;1.介绍2.用法配置步骤1.生成密钥对2.GitHub私钥配置3.Gitee公钥配置4.Gitee生成私人令牌5.Github绑定Gitee令牌6.编写CI脚本7.多仓库同步推送8.定时运行脚本总结Github同步Gitee镜像仓库自动…

【MyBatis Plus】002 -- 通用CRUD(插入、更新、删除、查询)

目录 3、通用CRUD 3.1 插入操作 3.1.1 方法定义 3.1.2 测试用例 3.1.3 测试 3.1.4 TableField 3.2 更新操作 3.2.1 根据id更新 3.2.2 根据条件更新 3.3 删除操作 3.3.1 根据id删除&#xff08;deleteById&#xff09; 3.3.2 根据Map删除数据&#xff08;deleteByMap&#xff09…

Level_2(2)题目整理

文章目录L2-022 重排链表&#xff08;模拟❗&#xff09;L2-023 图着色问题L2-024 部落(并查集)L2-025 分而治之&#xff08;与 L2-023差不多&#xff0c;邻接表遍历&#xff09;L2-026 小字辈&#xff08;求树的深度&#xff09;L2-027 名人堂与代金券(&#x1f4a1;处理&…

得物 API一站式协作平台的一些思考

1.背景 Mooncake是得物API一站式协作平台。从2022年3月份开始负责Mooncake&#xff0c;到现在已经一年了&#xff0c;回顾这一年&#xff0c;Mooncake大的阶段上&#xff0c;总共经历过两个版本: 1、Mooncake 1.0: 面向前端和客户端的mock平台&#xff0c;主要解决接口调用者…

C++实现前缀树

文章目录1. 什么是前缀树2. 前缀树的实现2.1 前缀树的基本结构2.2 插入2.3 word出现了几次2.3 word作为前缀出现几次2.4 删除1. 什么是前缀树 假设这里有一个字符串数组&#xff0c;和一个树的根结点&#xff1a; 这个结点的pass意思是&#xff1a;有几个字符通过了这个结点。…

ubuntu下Thrift安装

thrift是一种常用rpc框架&#xff0c;工作中经常会用到&#xff0c;本文记录一下其安装过程。 目录 1.下载软件包 1.1thrift下载 1.2libevent下载 1.3boost下载 2.安装&#xff08;注意步骤&#xff09; 2.1安装libevent 2.2安装boost 2.3安装与Python2.7版本对应的py…

【工作感悟】老程序员总结的四条工作经验教训

文章目录前言1. 不要做小需求2. 要做大需求3. 定期同步工作进度4. 项目结束&#xff0c;主动复盘总结前言 想来从事互联网工作已经很多年了&#xff0c;已经从当初的懵懂少年逐渐退化成老油条。刚毕业的时候&#xff0c;真是个愣头青&#xff0c;什么都不懂&#xff0c;也什么…

UE4 回放系统升级到UE5之后的代码报错问题解决

关键词&#xff1a; UE4 回放系统 升级 UE5 报错 DemoNetDriver GetDemoCurrentTime GetDemoTotalTime 背景 照着网上教的UE4的回放系统&#xff0c;也叫重播系统&#xff0c;英文Replay。做完了&#xff0c;测试运行正常&#xff0c;可升级到UE5却报了一堆 WorldSetting 和 …

计算机组成原理——第五章中央处理器

半生风雨半生伤&#xff0c;半醉半醒半心凉 文章目录前言5.1 CPU的功能和基本结构5.2 指令周期的数据流5.3.1 单总线结构5.3.2 专用通路结构前言 之前我们就说过CPU主要包括两个部分&#xff0c;运算器和控制器&#xff0c;运算器主要是实现算数运算.逻辑运算&#xff0c; 运算…

亲测:腾讯云轻量应用服务器性能如何?

腾讯云轻量应用服务器性能评测&#xff0c;轻量服务器CPU主频、处理器型号、公网带宽、月流量、Ping值测速、磁盘IO读写及使用限制&#xff0c;轻量应用服务器CPU内存性能和标准型云服务器CVM处于同一水准&#xff0c;所以大家不要担心轻量应用服务器的性能&#xff0c;腾讯云百…

springboot项目中的mysql用国产数据库达梦替换的相关说明

一、 用“DM管理工具”的“管理用户”创建你需要用户&#xff0c;也是达梦的模式。 用户的权限问题可以直接角色授权&#xff0c;方便一些。 二、借用达梦的“DM数据迁移工具”做数据库的表内容转移。 1. 新建工程、新建迁移 编辑mysql的数据库源 编辑达梦的目的端数据库 选择之…

应届生通过Java培训班转行IT有前途吗?

借用邓小平同志曾说过的一句话&#xff1a;科学技术是第一生产力。IT行业作为科技行业中的一员&#xff0c;不管是在自身的发展&#xff0c;还是支持其他行业的发展中都扮演了不可或缺的角色&#xff0c;“互联网”是社会发展的趋势&#xff0c;前途是无限的。而计算机语言是目…

春季儿童吃什么有助于长高,3款适合孩子长高的食谱做法,学起来

儿童身高一直以来都比较受到父母的关注&#xff0c;虽然身高不能说明一个人的能力有多强&#xff0c;但是会影响到人的外表。身高影响成败&#xff0c;一些专业对身高要求非常严格&#xff0c;因此大部分家长都希望孩子在身高方面能有一定的优势。 春季是孩子分泌生长激素增加时…

你了解C语言中的数组指针和函数指针吗?

如题&#xff0c;本篇文章重点讲解C语言中的数组指针和函数指针。这2种指针其实都不是很常用&#xff0c;个人感觉使用起来代码的可读性不是很高&#xff0c;但是还是需要了解一下。 数组指针 数组指针&#xff0c;即指向数组的指针&#xff0c;是用来存放数组的地址的。那如…

Redis Lua沙盒绕过命令执行(CVE-2022-0543)

一、描述 影响范围&#xff1a;Debian系得linux发行版本Ubuntu Debian系得linux发行版本 其并非Redis本身漏洞&#xff0c;形成原因在于系统补丁加载了一些redis源码注释了的代码 揭露时间&#xff1a;2022.3.8 二、原理 redis在用户连接后可以通过eval命令执行Lua脚本&#x…

Flutter成不了“顶流明星”的7大理由

Flutter是一款由Google推出的跨平台移动应用开发框架&#xff0c;近年来备受关注。尽管Flutter在某些方面表现出色&#xff0c;但仍然有一些人对它的发展前景表示怀疑。近期一些文章针对Flutter的发展提出了不少质疑和批评&#xff0c;称其难以成为移动应用开发的“顶流明星”&…
最新文章