.NET_控制反转简述

什么是控制反转?

控制反转(Inversion of Control,IoC)是面向对象编程中的一种设计原则,主要用于减少代码之间的耦合度。其通过将程序中的对象创建、销毁和对象间的依赖关系的管理权从代码中转移到外部容器或框架,从而实现了控制权的反转。 

如何实现控制反转?

控制反转的主要实现方式:依赖注入(需通过服务定位获取依赖注入的根节点)

依赖注入具有传染性:注册完成服务后,通过服务定位器获取服务时,框架会创建服务实例,并一同创建服务在构造函数中赋值的服务(依赖项),称为依赖注入(此时"创建"动作由框架完成,不由调用者完成,所以属于"控制反转",也就是说依赖注入是控制反转的一种实现方式),且该服务所依赖的服务所依赖的服务......均会被创建并注入
换言之,创建创建一个服务时,该服务所依赖的服务(通过构造函数传参)也会被一同创建,称为依赖的传染性

示例

依赖:Microsoft.Extensions.DependencyInjection

服务的生命周期:

Transient 瞬时(获取服务时创建新对象)
Scoped 范围(获取服务时,scope内为同一对象)
Singleton 单例(字面意思)

常用函数:

GetService()返回服务/GetServices()返回所有服务(无则返回null), GetRequiredService()返回服务(无则抛异常) 
注:关于GetService()/GetRequiredService(),当存在数个符合条件的服务时, 返回最后注册的服务

补充说明:

以IEnumerable<T>形式依赖注入, 则获取所有符合条件的服务

internal class Program
{public static void Main(string[] args){// 注册类服务ServiceCollection serviceCollection = new();serviceCollection.AddTransient<StartTest_IEnumerable>();serviceCollection.AddTransient<StartTest>();// 注册接口服务serviceCollection.AddTransient<IConfig, ConfigImpl1>();serviceCollection.AddTransient<IConfig, ConfigImpl2>();serviceCollection.AddTransient<IConfig, ConfigImpl3>();serviceCollection.AddTransient<IGetData, GetDataImpl>();serviceCollection.AddTransient<ITest, TestImpl>();using (var serverProvider = serviceCollection.BuildServiceProvider()){// GetService()返回服务/GetServices()返回所有服务(无则返回null), GetRequiredService()返回服务(无则抛异常) // GetService()/GetRequiredService(): 当存在数个符合条件的服务时, 返回最后注册的服务// 以IEnumerable<T>形式依赖注入, 则获取所有符合条件的服务var startTest_IEnumerable = serverProvider.GetRequiredService<StartTest_IEnumerable>();startTest_IEnumerable.Start();//var startTest = serverProvider.GetRequiredService<StartTest>();//startTest.Start();//IEnumerable<IConfig> configs = serverProvider.GetServices<IConfig>();//foreach (var item in configs)//{//    item.Config();//}}}class StartTest_IEnumerable{private IEnumerable<IConfig> config;private IGetData getData;private ITest test;public StartTest_IEnumerable(IEnumerable<IConfig> config, IGetData getData, ITest test) // 所注册服务为接口, 故参数类型也为接口{this.config = config;this.getData = getData;this.test = test;}public void Start(){foreach (var item in config){item.Config();}getData.GetData();test.Test();}}class StartTest{private IConfig config;private IGetData getData;private ITest test;public StartTest(IConfig config, IGetData getData, ITest test) // 所注册服务为接口, 故参数类型也为接口{this.config = config;this.getData = getData;this.test = test;}public void Start(){config.Config();getData.GetData();test.Test();}}interface IConfig{public void Config();}class ConfigImpl1 : IConfig{public void Config(){Console.WriteLine("Config1...");}}class ConfigImpl2 : IConfig{public void Config(){Console.WriteLine("Config2...");}}class ConfigImpl3 : IConfig{public void Config(){Console.WriteLine("Config3...");}}interface IGetData{public void GetData();}class GetDataImpl : IGetData{public void GetData(){Console.WriteLine("GetData...");}}interface ITest{public void Test();}class TestImpl : ITest{public void Test(){Console.WriteLine("Test...");}}
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

红海云OA存在任意文件上传漏洞【附poc】

漏洞复现 1、fofa poc见文末 body"RedseaPlatform" 打开burp进行抓包发送到repeater&#xff0c;如下图所示&#xff1a; 打入poc&#xff08;文末获取&#xff09;&#xff0c;成功上传。 「你即将失去如下所有学习变强机会」 学习效率低&#xff0c;学不到实战内…

【Linux】基础命令

常用命令及参数&#xff1a;dir表示文件夹&#xff0c;file表示文件&#xff08;file可表示其他目录下的文件&#xff09; pwd命令&#xff1b;查看当前所属文件夹&#xff08;print working directory&#xff09; ls [选项] dir&#xff1b;查看当前、指定文件夹目录内容&am…

后仿真中的关于延时问题(物理特性角度)

大家都知道&#xff0c;后仿真讲究仿真时序。那么&#xff0c;在网表阶段&#xff0c;接触到后仿延时问题。今天总结一下。 一 延时概念和分类 1.1 分布式延迟&#xff08;Distributed Delays&#xff09; 一般用来指定模块内部信号通过逻辑单元或者线网耗费的时间。 1.2 模…

解决 idea代码不能自动提示功能

idea有可能没有代码提示&#xff0c;是非常不方便的&#xff0c;找了好几个办法&#xff0c;这个方法对了 如下输入psv或者psvm按下回车自动生成main方法&#xff0c;除此还有很多也可以代码提示&#xff0c;包括写好的接口调用&#xff0c;如果有对应的方法&#xff0c;输入也…

【iOS逆向与安全】网上gw如何自动登录与签到SM2,SM3,SM4算法加解密

1.下载 app 2.frida 调试 3.抓包查看接口 4.分析加密数据 5.易语言编写代码 1 .开始下载 下载好发现有越狱检测&#xff0c;检测点为&#xff1a; -[AppDelegate isJailBreak]; 于是编写插件xm代码 : %hook AppDelegate- (void)isJailBreak{NSLog("AppDelegate is…

厦大教授宣布退出学界:对学术体制已经完全绝望

两年来我不仅战胜了所有的名利诱惑&#xff0c;看淡了所有的名利损失&#xff1b; 也陶醉于新的生存方式带给我的无限快乐。我很幸福。 ——王诺 厦大前教授、博导 退出学界&#xff0c;答朋友问 自从我两年前退出学界以来&#xff0c;我已经婉言谢绝了所有学术性邀请&#x…

JZ71 变态跳台阶

&#x1f600;前言 本文探讨了一个有关青蛙跳台阶的变体问题&#xff0c;与传统的台阶跳跃不同&#xff0c;这只青蛙每次可以跳上任意多的台阶。我们需要解决的问题是&#xff1a;对于给定的台阶数&#xff0c;计算青蛙跳上该台阶的所有可能方法。本文将通过动态规划和数学推导…

python模拟浏览器读取考试题目、答案,导出到EXCEL表中

本实例网页中的题干&#xff0c;类似于“单选题11&#xff1f;&#xff08;1.0分&#xff09;”所以用[3:]去除前3个汉字。再用正则去掉最后一对括号及里面的内容。 本实例网页中的选项&#xff0c;类似于 ”A、2“ ”B、3“ 用[2:]去除前2个字符 from DrissionPage import Ch…

Python中的`next()`函数:深入解析与应用

引言 在Python编程中&#xff0c;迭代是处理数据集合的基础操作。我们熟悉使用for循环和while循环来进行迭代&#xff0c;但你是否知道Python中还提供了一个名为next()的内建函数&#xff0c;它可以用来迭代数据流中的元素&#xff1f;本文将带你深入了解next()函数的工作原理…

OPENAI中Semantic Kernel实现原理以及示例代码用PYTHON来实现

OPENAI中Semantic Kernel实现原理以及示例代码用PYTHON来实现 前言 在人工智能领域&#xff0c;自然语言处理是一个非常重要的研究方向。而在自然语言处理中&#xff0c;语义理解是一个非常关键的问题。在这个领域中&#xff0c;OPENAI的Semantic Kernel是一个非常有名的工具…

如何获得一个Oracle 23ai数据库(Virtual Appliance)

准确的说&#xff0c;是Oracle 23ai Free Developer版&#xff0c;因为企业版目前只在云上&#xff08;OCI和Azure&#xff09;和ECC上提供。 方法包括3种&#xff0c;本文介绍第1种&#xff1a; Virtual ApplianceRPM安装Docker 从此处下载虚拟机。 可以看到虚拟机需要4G内…

费马小定理详解

费马小定理 定义&#xff1a; 设 p 为素数&#xff0c;a 为整数&#xff0c;则 a p ≡ a ( m o d p ) a^p \equiv a\ (\mod p) ap≡a (modp) &#xff0c;若 p ∤ a p \nmid a p∤a &#xff0c;则 a p − 1 ≡ 1 ( m o d p ) a^{p-1} \equiv 1\ (\mod p) ap−1≡1 (modp)…

力扣437. 路径总和 III

Problem: 437. 路径总和 III 文章目录 题目描述思路复杂度Code 题目描述 思路 1.定义int类型函数rootSum(root, targetSum)&#xff0c;用于求取每一个节点等于目标函数的路径数&#xff1a; 1.1.易知rootSum(root, targetSum)求出的数量等于rootSum(root.left, targetSum - va…

代码随想录算法训练营第36期DAY21

DAY21 513找树左下角的值 自己写的&#xff0c;过了&#xff08;注意到层序遍历中&#xff0c;que队头存的是最左边的节点&#xff0c;再写一个getheight函数控制最大高度就好&#xff09;。待会看解析&#xff0c;掌握迭代、递归。 优化迭代法&#xff1a;不用找最大深度&am…

2024年4月17日华为春招实习试题【三题】-题目+题解+在线评测,2024.4.17,华为机试

2024年4月17日华为春招实习试题【三题】-题目题解在线评测 &#x1f52e;题目一描述&#xff1a;扑克牌消消乐输入描述输出描述样例一样例二Limitation解题思路一&#xff1a;模拟&#xff0c;遇到连续3张相同牌号的卡牌&#xff0c;直接删除解题思路二&#xff1a;栈解题思路三…

Scala里的class、object、case class、case object 、trait

Class&#xff08;类&#xff09; 定义和作用 Scala 中的 class 是一种蓝图&#xff0c;用于创建对象&#xff08;实例&#xff09;。它定义了对象的状态和行为。类可以包含字段&#xff08;属性&#xff09;和方法&#xff08;函数&#xff09;。类可以有构造器&#xff0c;…

Tarjan算法模板

一、最近公共祖先&#xff08;LCA&#xff09; LCA&#xff1a;Least Common Ancestor P3379 【模板】最近公共祖先&#xff08;LCA&#xff09; #include <bits/stdc.h>using namespace std; typedef long long ll;ll quickin(void) {ll ret 0;bool flag false;cha…

【notepad++】使用

1 notepad 下载路径 https://notepad-plus.en.softonic.com/download 2 设置护眼模式 . 设置——语言格式设置——前景色——黑色 . 背景色——RGB &#xff1a;199 237 204 . 勾选“使用全局背景色”、“使用全局前景色” . 保存并关闭

2009-2022年上市公司华证ESG评级评分数据(含细分项)

2009-2022年上市公司华证ESG评级评分数据&#xff08;含细分项&#xff09; 1、时间&#xff1a;2009-2022年 2、来源&#xff1a;华证ESG 3、指标&#xff1a;证券代码、证券简称、综合评级、年度、综合得分、E评级、E得分、S评级、S得分、G评级、G得分 4、范围&#xff1…

PXE 批量安装部署

目录 一、PEX批量部署优点 二、PXE&#xff1a;预启动执行环境 三、搭建PXE远程服务器 要想全自动安装 接下来请看步骤&#xff1a; 一、PEX批量部署优点 规模化&#xff1a;同时装配多台服务器自动化&#xff1a;安装系统 配置各种服务远程实现&#xff1a;不需要光盘&…