IOC/异步编程


文章目录

  • 项目地址
  • 一、IOC 控制反转
    • 1.1 先看一个不使用IOC的例子
    • 1.2 使用IOC实现
      • 1.2.1 依赖注入
      • 1.2.2 IOC容器是什么
    • 1.2.3 使用反射给属性赋值
    • 1.2.4 通过PropertyInfo[]批量获取对象
    • 1.2.5 使用type完成依赖注入
    • 1.2.6 使用特性进行对象过滤
    • 1.2.6完整代码


项目地址

  • 教程作者:
  • 教程地址:
  • 代码仓库地址:
  • 所用到的框架和插件:
dbt 
airflow

一、IOC 控制反转

它将程序对依赖项的控制权从代码本身转移给外部容器或框架

1.1 先看一个不使用IOC的例子

  • 我们在商品类里,想在类的构造函数里或者属性里,使用数据库,所以我们直接在这里对数据库类进行了实例化,
public class CategoryService
{private readonly Database _database;public CategoryService(){_database = new Database(); // 直接依赖具体类}
}
  • 弊端:例子中,是没有传参的,如果实例化的过程复杂,参数众多,如果之后几十个或者几百个例如,汽车类,飞机类,火车类,家具类,厨具类都使用这种方法,直接在内部实例化一个类,那么如果Database()类发生了改变,所有的设计到的类,需要统统修改一遍;

1.2 使用IOC实现

  1. 不再由类内部创建依赖,而是将依赖项交由外部提供(通过 依赖注入 或服务容器)
  2. 类不再控制依赖的创建和生命周期。

1.2.1 依赖注入

对象属性赋值,例如,给Student类里的Teacher属性直接赋值一个外部的Teacher类

1.2.2 IOC容器是什么

  1. IOC就是控制反转:工厂模式和抽象工厂模式就是IOC的实现
  2. 容器:将这些工厂放在一个集合里或者字典里
  3. IOC容器:上面两个的大集合
  4. AOP 面向切片编程:对象代理,给Student对象创建一个代理对象
  5. 生命周期:对象的使用范围和使用时常
    完成上面的5个功能,所需要的技术条件:
  1. 工厂模式/抽象工厂模式
  2. 反射
  3. 特性
  4. 递归
  5. 空间换时间的算法

1.2.3 使用反射给属性赋值

  1. 添加一个IOCFactory工厂类
namespace ConsoleApp1.IOCS
{internal class IOCFactory{public IOCFactory(){Teacher teacher = new Teacher();Student student = new Student();}}
}
  • 在这里直接生成了两个类,违反了开闭原则,导致代码不稳定;
  • 使用反射来创建对象
using System.Reflection;namespace ConsoleApp1.IOCS
{internal class IOCFactory{public IOCFactory(){   //违反开闭原则的创建对象//Teacher teacher = new Teacher();//Student student = new Student();//通过反射获取程序集Assembly assembly =  Assembly.Load("ConsoleApp1");//从程序集中获取所有的类型Type[] types = assembly.GetTypes();foreach (Type type in types) {//获取类型的所有属性PropertyInfo[] propertyInfos = type.GetProperties();foreach (PropertyInfo propertyInfo in propertyInfos){//创建对象object obj = Activator.CreateInstance(type);}}}}
}
  1. 如果我们需要给Student里的Teacher属性赋值,那么就需要hard code的形式
using System.Reflection;namespace ConsoleApp1.IOCS
{internal class IOCFactory{//5.定义字典Dictionary<string, object> IOCS = new Dictionary<string, object>();public IOCFactory(){//1.通过反射获取程序集Assembly assembly = Assembly.Load("ConsoleApp1");//2.从程序集中获取所有的类型Type[] types = assembly.GetTypes();foreach (Type type in types) {//3.创建对象object _object = Activator.CreateInstance(type);//4.依赖注入hardcode版(对象属性赋值),传入属性名stringPropertyInfo property = type.GetProperty("teacher");//5.根据属性名称给Student对象的Teacher属性赋值property.SetValue(_object, new Teacher());//6.将对象添加到字典中,必须要有一个唯一的键所以使用FullNameIOCS.Add(type.FullName, _object);}}//7.根据key获取对象public object GetObject(string fullname){return IOCS[fullname];}}
}

存在问题:现在依赖注入是手动的传入一个一个属性名称

1.2.4 通过PropertyInfo[]批量获取对象

  • 添加批量获取
                //6.将对象添加到字典中,必须要有一个唯一的键所以使用FullNamePropertyInfo[] properties = type.GetProperties();//7.批量属性赋值foreach (PropertyInfo pro in properties){if (pro.PropertyType.Name == "Teacher"){pro.SetValue(_object, new Teacher());}     }IOCS.Add(type.FullName, _object);

为解决问题:里面使用if判断,还是抽象依赖于具体,还是需要将类型手动填入

1.2.5 使用type完成依赖注入

  • 现在程序以来的具体对象:Teacher,School, Doctor
  • 他们所有的抽象就是:Type类
                //6.将对象添加到字典中,必须要有一个唯一的键所以使用FullNamePropertyInfo[] properties = type.GetProperties();//7.批量属性赋值foreach (PropertyInfo pro in properties){//8.循环获取属性类型foreach (var ty in types){//9.判断属性类型是否等于当前类型if (pro.PropertyType == ty){//10.创建属性类型的实例,并直接添加到字典pro.SetValue(_object, Activator.CreateInstance(ty));}}}IOCS.Add(type.FullName, _object);

1.2.6 使用特性进行对象过滤

  1. 创建一个特性IOCService类,用来标记
namespace ConsoleApp1.IOCS
{[AttributeUsage(AttributeTargets.Class)]public class IOCService:Attribute{}
}
  1. 在需要的类上,添加标记
namespace ConsoleApp1.IOCS
{[IOCService]public class Student{public string Name { get; set; }public void Study(){Console.WriteLine("学生在学习");}}
}

1.2.6完整代码

using System.Reflection;namespace ConsoleApp1.IOCS
{internal class IOCFactory{//5.定义字典Dictionary<string, object> IOCS = new Dictionary<string, object>();public IOCFactory(){Student student = new Student();Teacher teacher = new Teacher();//1.通过反射获取程序集Assembly assembly = Assembly.Load("ConsoleApp1");//2.从程序集中获取所有的类型Type[] types = assembly.GetTypes();foreach (Type type in types) {//①获取特性IOCService iocService = (IOCService)type.GetCustomAttribute<IOCService>();//②判断是否有特性if (iocService!= null){//3.创建对象object _object = Activator.CreateInstance(type);//4.依赖注入hardcode版(对象属性赋值),传入属性名stringPropertyInfo property = type.GetProperty("teacher");//6.将对象添加到字典中,必须要有一个唯一的键所以使用FullNamePropertyInfo[] properties = type.GetProperties();//7.遍历属性foreach (PropertyInfo pro in properties){//8.使用tpye创建对象foreach (var ty in types){//9.判断属性类型是否等于当前类型if (pro.PropertyType == ty){//10.创建属性类型的实例,并直接添加到字典pro.SetValue(_object, Activator.CreateInstance(ty));}}}IOCS.Add(type.FullName, _object);}}}//7.根据key获取对象public object GetObject(string fullname){return IOCS[fullname];}}
}

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

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

相关文章

基于LiteFlow的风控系统指标版本控制

个人博客&#xff1a;无奈何杨&#xff08;wnhyang&#xff09; 个人语雀&#xff1a;wnhyang 共享语雀&#xff1a;在线知识共享 Github&#xff1a;wnhyang - Overview 更新日志 最近关于https://github.com/wnhyang/coolGuard此项目更新了如下内容&#xff1a;https://g…

Mysql中的 TEXT 和 BLOB 解析

&#x1f680; 博主介绍&#xff1a;大家好&#xff0c;我是无休居士&#xff01;一枚任职于一线Top3互联网大厂的Java开发工程师&#xff01; &#x1f680; &#x1f31f; 在这里&#xff0c;你将找到通往Java技术大门的钥匙。作为一个爱敲代码技术人&#xff0c;我不仅热衷…

241124_文本解码原理

241124_文本解码原理 一个文本序列的概率分布可以分解为每个词基于其上文的条件概率的乘积。 Greedy search 就是每步都选择概率最大的&#xff0c;不会去考虑全局 按照贪心搜索输出the nice woman 的概率就是0.5*0.40.2 这种方法简单&#xff0c;但也存在问题&#xff0c;比…

介绍一下strlwr(arr);(c基础)

hi , I am 36 适合对象c语言初学者 strlwr(arr)&#xff1b;函数是把arr数组变为小写字母 格式 #include<string.h> strlwr(arr); 返回值为arr 链接分享一下arr的意义(c基础)(必看)(牢记)-CSDN博客 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #incl…

16:(标准库)ADC三:使用外部触发启动ADC/模拟看门狗

使用外部触发启动ADC 1、外部中断线EXTI11触发ADC2、外部定时器TIM2_CH2触发ADC3、ADC中模拟看门狗的使用 1、外部中断线EXTI11触发ADC ADC的触发方式有很多&#xff0c;一般情况都是使用软件触发反式启动ADC转换。除了软件触发方式还能使用外部事件触发启动ADC转换。如下图所…

Linux之管道,system V的共享内存,消息队列和信号量

Linux之管道&#xff0c;systemV共享内存和信号量 一.进程间通信1.1进程间通信的目的1.2进程间通信的方式 二.管道2.1管道的概念2.2匿名管道2.3命名管道 三.system V3.1共享内存3.2消息队列3.3信号量 一.进程间通信 在我们之前有关Linux指令的学习时我们使用过“|”这个命令&a…

使用ChatGPT生成和优化电子商务用户需求规格说明书

在电子商务项目开发中&#xff0c;用户需求规格说明书&#xff08;User Requirement Specification, URS&#xff09;是团队沟通与项目成功的基石。然而&#xff0c;面对复杂多变的需求&#xff0c;如何快速生成清晰、完整且具备说服力的文档&#xff1f;这正是AI工具的用武之地…

1+X应急响应(网络)常见网络攻击-SQL注入:

常见网络攻击-SQL注入&#xff1a; SQL注入概述&#xff1a; 动态网站的工作流程&#xff1a; SQL注入的起源&#xff1a; SQL典型的攻击手段&#xff1a; SQL注入的危害&#xff1a; SQL注入的函数&#xff1a; SQL注入类型&#xff1a; 提交方式分类&#xff1a; Get注入&am…

Spire.PDF for .NET【页面设置】演示:打开 PDF 时自动显示书签或缩略图

用户打开 PDF 文档时&#xff0c;他们会看到 PDF 的初始视图。默认情况下&#xff0c;打开 PDF 时不会显示书签面板或缩略图面板。在本文中&#xff0c;我们将演示如何设置文档属性&#xff0c;以便每次启动文件时都会打开书签面板或缩略图面板。 Spire.PDF for .NET 是一款独…

[Docker-显示所有容器IP] 显示docker-compose.yml中所有容器IP的方法

本文由Markdown语法编辑器编辑完成。 1. 需求背景: 最近在启动一个服务时&#xff0c;突然发现它的一个接口&#xff0c;被另一个服务ip频繁的请求。 按理说&#xff0c;之前设置的是&#xff0c;每隔1分钟请求一次接口。但从日志来看&#xff0c;则是1秒钟请求一次&#xff…

单片机GPIO的8种工作模式

1、输入 GPIO_MODE_AIN:模拟输入 GPIO_MODE_IN_FLOATING:浮空输入 GPIO_MODE_IPD:下拉输入 GPIO_MODE_IPU:上拉输入 2、输出 GPIO_MODE_OUT_OD:开漏输出&#xff08;特殊情况使用&#xff09; GPIO_MODE_OUT_PP&#xff1a;推挽输出-----点灯&#xff08;通用&#…

Azkaban部署

首先我们需要现在相关的组件&#xff0c;在这里已经给大家准备好了相关的安装包&#xff0c;有需要的可以自行下载。 只需要启动hadoop集群就可以&#xff0c;如果现在你的hive是打开的&#xff0c;那么请你关闭&#xff01;&#xff01;&#xff01; 如果不关会造成证书冲突…

时钟使能、

时钟使能 如果正确使用&#xff0c;时钟使能能够显著地降低系统功耗&#xff0c;同时对面积或性能的影响极小。但是如果不正确地使用时钟使能&#xff0c; 可能会造成下列后果&#xff1a; • 面积增大 • 密度减小 • 功耗上升 • 性能下降 在许多使用大量控制集的…

视觉经典神经网络与复现:深入解析与实践指南

目录 引言 经典视觉神经网络模型详解 1. LeNet-5&#xff1a;卷积神经网络的先驱 LeNet-5的关键特点&#xff1a; 2. AlexNet&#xff1a;深度学习的突破 AlexNet的关键特点&#xff1a; 3. VGGNet&#xff1a;深度与简洁的平衡 VGGNet的关键特点&#xff1a; 4. ResNe…

【CSS in Depth 2 精译_060】9.3 详解 CSS 作用域的相关概念、最新 @scope 规则的应用及注意事项

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 【第九章 CSS 的模块化与作用域】 ✔️ 9.1 模块的定义 9.1.1 模块和全局样式9.1.2 一个简单的 CSS 模块9.1.3 模块的变体9.1.4 多元素模块 9.2 将模块组合为更大的结构 9.2.1 模块中多个职责的拆分…

uniapp实现开发遇到过的问题(持续更新中....)

1. 在ios模拟器上会出现底部留白的情况 解决方案&#xff1a; 在manifest.json文件&#xff0c;找到开源码视图配置&#xff0c;添加如下&#xff1a; "app-plus" : {"safearea":{"bottom":{"offset" : "none" // 底部安…

React(六)——Redux

文章目录 项目地址基本理解一、配置Redux store二、创建slice配置到store里并使用三、给Slice配置reducers&#xff0c;用来修改初始值 项目地址 教程作者&#xff1a;教程地址&#xff1a; 代码仓库地址&#xff1a; 所用到的框架和插件&#xff1a; dbt airflow基本理解 s…

国家级资质!同驭汽车获得CNAS实验室认证

近日&#xff0c;同驭汽车科技顺利通过中国合格评定国家认可委员会&#xff08;简称CNAS&#xff09;评审&#xff0c;获得《中国合格评定国家认可委员会实验室认可证书》。这标志着同驭已建立国际标准的实验室管理体系&#xff0c;产品的试验与检测技术能力达到了国际认可的准…

HTML5好看的音乐播放器多种风格(附源码)

文章目录 1.设计来源1.1 音乐播放器风格1效果1.2 音乐播放器风格2效果1.3 音乐播放器风格3效果1.4 音乐播放器风格4效果1.5 音乐播放器风格5效果 2.效果和源码2.1 动态效果2.2 源代码 源码下载万套模板&#xff0c;程序开发&#xff0c;在线开发&#xff0c;在线沟通 作者&…

快速简单的视频下载器——lux

文章目录 前言1.环境检查1.1 检查 lux 安装1.2 检查FFmpeg安装1.3 备注 2. lux指令2.1 无OPTIONS2.2 -i 指令2.3 - f 指令2.4 -c 指令2.5 -o 指令2.6 备注 3.结语 前言 在学习之余&#xff0c;发现了一个简单并且高效的视频下载器lux,能够帮你快速且高效的下载文件&#xff08…