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

.Net IOC理解及代码实现

IOC理解

IoC(Inversion of Control):即控制反转,这是一种设计思想,指将对象的控制权交给IOC容器,由容器来实现对象的创建、管理,程序员只需要从容器获取想要的对象就可以了。DI(Dependency Injection),即依赖注入,他是IoC的一种具体实现方式。

IOC代码实现

Model类
namespace IOCDemo.IOC
{[IOCService]internal class School{public string SchoolName { get; set; }public Student Student { get; set; }public void ShowMessage(){Console.WriteLine("创建School对象");Student.ShowMessage();}}internal class Student{public string StudentNo { get; set; }public string StudentName { get; set;}public void ShowMessage(){Console.WriteLine("创建Student对象");}}
}
IOC容器工程类

.Net8 IOC容器基本形态:
1、创建对象
2、存储对象 字典随机取对象,随机存对象性能高
3、获取对象
4、依赖注入(对象属性赋值)
5、对象过滤(特征)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;namespace IOCDemo.IOC
{/// <summary>/// IOC工程/// 1、创建对象/// 2、存储对象 字典随机取对象,随机存对象性能高/// 3、获取对象/// 4、依赖注入(对象属性赋值)/// 5、对象过滤(特征)/// 总结:完成.Net8 IOC容器基本形态/// </summary>internal class IOCFactory{private Dictionary<string,Object> IOCS = new Dictionary<string,Object>();public IOCFactory() {//不能直接new对象,违背开闭原则(对扩展开发,对修改关闭,如果有新的类,需要修改IOC工厂类)Assembly assembly = Assembly.Load("IOCDemo");Type[] types = assembly.GetTypes();foreach (Type t in types){IOCService service=t.GetCustomAttribute<IOCService>();//5、过滤if (service != null){//1、创建对象object obj = Activator.CreateInstance(t);//同样违背开闭原则//PropertyInfo propertyInfo = t.GetProperty("SchoolName");//if (propertyInfo != null)//{//    propertyInfo.SetValue(obj, new Student());//}//4、依赖注入PropertyInfo[] properties = t.GetProperties();foreach (var property in properties){foreach (var type in types){if (property.PropertyType.Equals(type)){object value = Activator.CreateInstance(type);property.SetValue(obj, value);}}}//2、存储对象IOCS.Add(t.FullName, obj);}}}/// <summary>/// 3、获取IOC对象/// </summary>/// <param name="name"></param>/// <returns></returns>public object GetObject(string name){return IOCS[name];}}
}
自定义特性类
namespace IOCDemo.IOC
{/// <summary>/// 自定义特性/// </summary>[AttributeUsage(AttributeTargets.Class)]internal class IOCService:Attribute{}
}
实现
using IOCDemo.IOC;IOCFactory iOCFactory = new IOCFactory();
School school = (School)iOCFactory.GetObject("IOCDemo.IOC.School");
school.ShowMessage();
输出

实例代码

https://download.csdn.net/download/lvxingzhe3/89967307

http://www.lryc.cn/news/479272.html

相关文章:

  • 履带机器人(一、STM32控制部分--标准库)
  • 地理空间-Java实现航迹稀释
  • qt QHttpMultiPart详解
  • 【测试】【Debug】vscode中同一个测试用例出现重复
  • Mac上的免费压缩软件-FastZip使用体验实测
  • Linux(CentOS)运行 jar 包
  • 基于YOLOv8 Web的安全帽佩戴识别检测系统的研究和设计,数据集+训练结果+Web源码
  • LabVIEW VISA通信常见问题
  • Node.js Stream(流)以及模块系统使用介绍 (基础介绍 五)
  • 嵌入式linux中设备树控制硬件的方法
  • 定时器入门:Air780E定时器基础与进阶
  • Java LeetCode练习
  • go 集成go-redis 缓存操作
  • python数据结构基础(3)
  • java-智能识别车牌号_基于spring ai和开源国产大模型_qwen vl
  • 全局池化(Global Pooling)
  • ubuntu 24.04运行chattts时cuda安装错误原因分析
  • 使用 Cypher 查询语言在 Neo4j 中查找最短路径
  • Qt多边形填充/不填充绘制
  • 数据结构-数组(稀疏矩阵转置)和广义表
  • Java中的远程方法调用——RPC详解
  • 【kafka】大数据编写kafka命令使用脚本,轻巧简洁实用kafka
  • 交换区(Swap Area或Swap Partition)
  • Excel 无法打开文件
  • MySQL —— Innodb 索引数据结构
  • 探索C语言数据类型
  • 凌晨官宣离婚,他们为何让老粉直呼天塌?
  • Spring Boot 导出 Excel 文件
  • HTTPSOK:SSL/TLS证书自动续期工具
  • Uniapp安装Pinia并持久化(Vue3)