在 IocManager 类型当中实现这两个新增的方法和属性,并且更改一个 Resolve() 方法的内部逻辑,优先使用子容器进行对象解析。
public class IocManager : IIocManager { // ... 其他代码 /// <inheritdoc /> public IResolverContext ChildContainer { get; private set; } /// <inheritdoc /> public void InitializeChildContainer(IResolverContext container) { ChildContainer = container; } /// <summary> /// 从 Ioc 容器当中获取一个对象 /// 返回的对象必须通过 (see <see cref="IIocResolver.Release"/>) 进行释放。 /// </summary> /// <typeparam>需要解析的目标类型</typeparam> /// <returns>解析出来的实例对象</returns> public T Resolve<T>() { if (ChildContainer == null) return IocContainer.Resolve<T>(); if (!ChildContainer.IsDisposed) return ChildContainer.Resolve<T>(); return IocContainer.Resolve<T>(); } // ... 其他代码 }这里仅更改了其中一个解析方法作为示范,如果正式使用的时候,请将 IocManager 的所有 Resolve() 实现都进行相应的更改。
效果图:
因为是同一个请求,所以 Scope 生命周期的对象在这个请求的生存周期内应该解析的都是同一个对象。下面是第二次请求时的情况:
可以看到,第二次请求的时候解析出来的 ScopeClass 类型实例都是同一个对象,其 Guid 值都变成 abd004e0-3792-4e6d-85b3-e721d8dde009 。
3. 演示项目的 GitHub 地址https://github.com/GameBelial/Abp-DryIoc