.net5 IOC原理+手动创建IOC容器

IOC容器 说白了就是创建对象的(看成创建对象的一个工厂)

而在**.net5以及.net core** 项目中自带容器(IserviceCollection
也可以用更强大的第三方容器Autofac

下面来实现一下简单制作一个容器

手动建立IOC容器

原理:就是通过反射+特性的方式来创建对象
代码案例

创建个容器抽象

public  interface ICustomeContainer{//注册void RegisterType<TFrom, TTo>(CustomeLifetime lifetime = CustomeLifetime.Transient) where TTo : TFrom;//创建T Resolve<T>();}

创建对应的实现

  public class CustomeContainer : ICustomeContainer{/// <summary>/// 定义参数字典/// </summary>private Dictionary<string, RegisterInfo> ContainerDicationary = new Dictionary<string, RegisterInfo>();/// <summary>/// 添加服务/// </summary>/// <typeparam name="TFrom"></typeparam>/// <typeparam name="TTo"></typeparam>/// <param name="lifetime"></param>public void RegisterType<TFrom, TTo>(CustomeLifetime lifetime = CustomeLifetime.Transient) where TTo : TFrom{ContainerDicationary.Add(typeof(TFrom).FullName, new RegisterInfo(){TargetType = typeof(TTo),LifeTime = lifetime});}/// <summary>/// 创建对象/// </summary>/// <typeparam name="T"></typeparam>/// <returns></returns>public T Resolve<T>(){//反射创建对象string abstartName = typeof(T).FullName;//得到程序集+类名RegisterInfo registerInfo = ContainerDicationary[abstartName];//根据类型从字典得到RegisterInfo对象Type type = registerInfo.TargetType;//反射T result = default(T);result = (T)this.ObjectInstance(type);return result;}private object ObjectInstance(Type type){         ConstructorInfo  ctor = type.GetConstructors().OrderByDescending(c => c.GetParameters().Length).First();    object oInstance = Activator.CreateInstance(type);//调用无参构造return oInstance;}}

生命周期枚举

  public enum CustomeLifetime{/// <summary>/// 瞬时/// </summary>Transient,/// <summary>/// 单例/// </summary>Singleton,/// <summary>/// 作用域/// </summary>Scope}

对象实体

  public class RegisterInfo{/// <summary>/// 目标类型/// </summary>public Type TargetType { get; set; }/// <summary>/// 生命周期/// </summary>public CustomeLifetime LifeTime { get; set; }}

最后再创建业务接口和实现

 public interface IService{void Login();}
 class Service : IService{public Service(){Console.WriteLine("Service被构造");}public void Login(){Console.WriteLine("这是Service的登录方法!!");}}

Program调用创建对象

  ICustomeContainer container = new CustomeContainer();//创建容器 container.RegisterType<IService, Service>();IService service = container.Resolve<IService>();//获取对象的实例service.Login();                                               //

都是这么几个路数,
创建容器
把服务和实现放进容器
生命周期申明
获取对象

.net5 IOC原理+手动创建IOC容器相关推荐

  1. spring ioc原理分析

    spring ioc原理分析 spring ioc 的概念 简单工厂方法 spirng ioc实现原理 spring ioc的概念 ioc: 控制反转 将对象的创建由spring管理.比如,我们以前用 ...

  2. spring ioc原理(看完后大家可以自己写一个spring)

    在学习spring的时候,最常听到的词应该就是IOC和AOP了,下面,我从我的角度再次理解一下Spring里的IOC和AOP. IOC简介 IoC(InversionofControl):IoC就是应 ...

  3. spring ioc原理解析

    概述 Spring IOC控制反转,分为两个方面解释: 控制:对象对于内部成员的控制 反转:将之前对象管理自己内部成员,转变为ioc容器管理,目的是接耦 IOC的好处是: 无需手动创建,拿来就用 享受 ...

  4. Spring IOC 原理

    Spring IOC原理 IOC理解 自己写的简单的IOC容器 IOC的原理 定位.加载.注册 基于XML配置的IOC容器初始化 1.寻找入口 2.获取配置路径 3.开始启动 4.创建容器 5.载入配 ...

  5. Spring的IOC原理[通俗解释一下]

    2019独角兽企业重金招聘Python工程师标准>>> 本文系转载,个人认为,这篇文章对IOC原理讲的比较清楚,通俗易懂,值得一看. 原文地址:http://blog.csdn.ne ...

  6. 深入理解DIP、IoC、DI以及IoC容器

    对于大部分小菜来说,当听到大牛们高谈DIP.IoC.DI以及IoC容器等名词时,有没有瞬间石化的感觉?其实,这些"高大上"的名词,理解起来也并不是那么的难,关键在于入门.只要我们入 ...

  7. 最易懂的Spring IOC原理讲解

    一. IOC思想 IOC:控制反转Inversion Of Controller,控制即获取资源的方式:反转即颠倒的意思,意味着是该思想是对原先操作过程的逆转,即由主动的创建(对象为主的资源)变为被动 ...

  8. Java:Spring的IOC原理(大白话解释)

    先行参考以下半成品文章和参考链接,待学完课程后续整理此文章 IOC和DI关系 IOC:Inversion of Control,控制反转 DI:Dependency Injection,依赖注入 关系 ...

  9. Spring Ioc原理解析

    Spring Ioc原理解析 IoC理论的背景 我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑. 图1:软件系统中耦 ...

最新文章

  1. python的填充色怎么弄_python中如何给图形填充颜色
  2. 强烈推荐的TensorFlow、Pytorch和Keras的样例资源(深度学习初学者必须收藏)
  3. 加速度和陀螺仪 日常活动识别 跌倒检测_巢湖房屋安全检测,幼儿园房屋质量检测新趋势-房屋鉴定专业团队...
  4. 错误处理在Spring Integration中如何工作
  5. 学plc好还是python好_PLC是学西门子的好还是学三菱的?
  6. 【今日CV 视觉论文速览】26 Nov 2018
  7. Android 源代码中的res
  8. 阿里社招面试如何准备
  9. dedecms channel php,DedeCMS在{dede:channel}标签前加序列号
  10. ArcMap DayDreamInGIS数据处理工具 插件之 搜狗词库生成
  11. EasyPay移动支付框架
  12. Java数据结构与算法之堆排序
  13. 阿里云服务器实现内网互通
  14. 有关于win10系统不能更改自己ip得问题解决办法
  15. SLG手游的战斗抽象
  16. 数字盲打怎么练_如何提高盲打速度?键盘指法练习方法
  17. python文本文件对比_Python-文件差异对比
  18. 今日头条Android适配方案,android 今日头条的屏幕适配理解
  19. C++用random_shuffle打乱字符串数组顺序
  20. 脑在IDE模式下能正常启动,改成AHCI后蓝屏——解决方法

热门文章

  1. 多少分才能考上重庆计算机学校,重庆多少分能上大专,重庆大专院校最低分数线...
  2. 远程桌面时出现“身份验证错误,要求的函数不受支持”解决办法
  3. 爬小说~那必然是雪中悍刀行~
  4. 关系型数据库三大范式
  5. 一键就能去除视频水印,简单实用,重点是免费的哦!
  6. Spring:事务管理的四大特性,事务管理机制
  7. 滴滴拟从美股退市;全球首台升降摄像头iPhone诞生;Twitter采取毒丸计划阻止马斯克的敌意收购|极客头条
  8. php 不重复订单号,php如何生成不重复的订单号
  9. 【STM32】CAN通讯
  10. 以旧焕新的css滤镜