.net5 IOC原理+手动创建IOC容器
.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容器相关推荐
- spring ioc原理分析
spring ioc原理分析 spring ioc 的概念 简单工厂方法 spirng ioc实现原理 spring ioc的概念 ioc: 控制反转 将对象的创建由spring管理.比如,我们以前用 ...
- spring ioc原理(看完后大家可以自己写一个spring)
在学习spring的时候,最常听到的词应该就是IOC和AOP了,下面,我从我的角度再次理解一下Spring里的IOC和AOP. IOC简介 IoC(InversionofControl):IoC就是应 ...
- spring ioc原理解析
概述 Spring IOC控制反转,分为两个方面解释: 控制:对象对于内部成员的控制 反转:将之前对象管理自己内部成员,转变为ioc容器管理,目的是接耦 IOC的好处是: 无需手动创建,拿来就用 享受 ...
- Spring IOC 原理
Spring IOC原理 IOC理解 自己写的简单的IOC容器 IOC的原理 定位.加载.注册 基于XML配置的IOC容器初始化 1.寻找入口 2.获取配置路径 3.开始启动 4.创建容器 5.载入配 ...
- Spring的IOC原理[通俗解释一下]
2019独角兽企业重金招聘Python工程师标准>>> 本文系转载,个人认为,这篇文章对IOC原理讲的比较清楚,通俗易懂,值得一看. 原文地址:http://blog.csdn.ne ...
- 深入理解DIP、IoC、DI以及IoC容器
对于大部分小菜来说,当听到大牛们高谈DIP.IoC.DI以及IoC容器等名词时,有没有瞬间石化的感觉?其实,这些"高大上"的名词,理解起来也并不是那么的难,关键在于入门.只要我们入 ...
- 最易懂的Spring IOC原理讲解
一. IOC思想 IOC:控制反转Inversion Of Controller,控制即获取资源的方式:反转即颠倒的意思,意味着是该思想是对原先操作过程的逆转,即由主动的创建(对象为主的资源)变为被动 ...
- Java:Spring的IOC原理(大白话解释)
先行参考以下半成品文章和参考链接,待学完课程后续整理此文章 IOC和DI关系 IOC:Inversion of Control,控制反转 DI:Dependency Injection,依赖注入 关系 ...
- Spring Ioc原理解析
Spring Ioc原理解析 IoC理论的背景 我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑. 图1:软件系统中耦 ...
最新文章
- python的填充色怎么弄_python中如何给图形填充颜色
- 强烈推荐的TensorFlow、Pytorch和Keras的样例资源(深度学习初学者必须收藏)
- 加速度和陀螺仪 日常活动识别 跌倒检测_巢湖房屋安全检测,幼儿园房屋质量检测新趋势-房屋鉴定专业团队...
- 错误处理在Spring Integration中如何工作
- 学plc好还是python好_PLC是学西门子的好还是学三菱的?
- 【今日CV 视觉论文速览】26 Nov 2018
- Android 源代码中的res
- 阿里社招面试如何准备
- dedecms channel php,DedeCMS在{dede:channel}标签前加序列号
- ArcMap DayDreamInGIS数据处理工具 插件之 搜狗词库生成
- EasyPay移动支付框架
- Java数据结构与算法之堆排序
- 阿里云服务器实现内网互通
- 有关于win10系统不能更改自己ip得问题解决办法
- SLG手游的战斗抽象
- 数字盲打怎么练_如何提高盲打速度?键盘指法练习方法
- python文本文件对比_Python-文件差异对比
- 今日头条Android适配方案,android 今日头条的屏幕适配理解
- C++用random_shuffle打乱字符串数组顺序
- 脑在IDE模式下能正常启动,改成AHCI后蓝屏——解决方法
热门文章
- 多少分才能考上重庆计算机学校,重庆多少分能上大专,重庆大专院校最低分数线...
- 远程桌面时出现“身份验证错误,要求的函数不受支持”解决办法
- 爬小说~那必然是雪中悍刀行~
- 关系型数据库三大范式
- 一键就能去除视频水印,简单实用,重点是免费的哦!
- Spring:事务管理的四大特性,事务管理机制
- 滴滴拟从美股退市;全球首台升降摄像头iPhone诞生;Twitter采取毒丸计划阻止马斯克的敌意收购|极客头条
- php 不重复订单号,php如何生成不重复的订单号
- 【STM32】CAN通讯
- 以旧焕新的css滤镜