IOC流程

复制代码
准备要注册的对象 和接口,以及注册的生命周期
准备注册,先检查 是否释放
检测是否 已注册,没有则添加到  集合内并反回对象

创建服务提供工程。初始化容器,根据注入的对象类型选择不同的注册方式

1 通过据提的接口和实现类
2 直接new 对象的
3 通过实例工厂创建

使用 1  的会直接注册委托Create,放到 ServiceRegistry  里,在注册到_registries , 在获取服务时直接根据接口和实现类来创建对象
使用 2 service.ImplementationInstance  注册委托  cat.Register(service.ServiceType,和上面一样
使用 3   service.ImplementationType   注册委托  cat.Register(service.ServiceType,和上面一样


生成容器 ,就是赋值容器,并注册一个服务范围工程的委托,生命周期为Transient

CreateServiceProvider() 就i是返回当前容器

创建服务范围,创建子容器,并返回当前子容器,最后赋值到servicesscope,(CreateScope()直接跑到getservices方法,没有重写直接调用源码执行;//此处源码也出先执行getservices在CreateScope)


GetService

根据接口获取对象,判断是否为v容器类还是 服务提供就接口,是的话直接返回当前对象

判断是否是泛型和 获取泛型 的基本类型给判断serviceType.IsGenericType && serviceType.GetGenericTypeDefinition() == typeof(IEnumerable<>))

判断服务是否已注册,
new 一个key ,在 root ,self 中用的到

根据生命周期 来对象 ,root ,self 先判断是否 已生对象,没有则 去生产对象

Transient 直接去生成新对象, 并根据是否 实现IDisposable 来 来是否添加到 Disposable是否集合里

这里会执行ServiceRegistry 里委托factory ,是根据前面注册时根据不同的注册方法,会有不同的委托来执行对象的创建

生产对象:
判断是否有泛型参数是否有值
获取构造函数

获取自定义属性

没有自定义属性则赋值构造函数
获取构造函数参数

参数为长度0 则创建对对象并返回

如果 有参数则遍历参数
在传入当前参数并调用GetService 

去创建对象,并通过委托执行 返回
 
复制代码

 

posted @   孤海飞雁  阅读(70)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
点击右上角即可分享
微信分享提示