准备要注册的对象 和接口,以及注册的生命周期
准备注册,先检查 是否释放
检测是否 已注册,没有则添加到 集合内并反回对象
创建服务提供工程。初始化容器,根据注入的对象类型选择不同的注册方式
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
去创建对象,并通过委托执行 返回