在上一节:小白同学:我换静态的 static ConcurrentDictionary<Type, object> singletonCache
青龙偃月刀:那整个程序就只有一份了啊
小白同学:对呀,就是只要一份
青龙偃月刀:那一个程序里面多个DI容器呢?
小白同学:大吃一惊.gif,还能这么玩?
青龙偃月刀:不说其他,就说你单元测试一个DI容器能测试各种场景?
小白同学:尴尬.gif 我目前只写了一个
青龙偃月刀:...............你改吧
小白同学:哦
// 小白同学:在IServiceProvider接口上添加我们需要数据字段 public interface IServiceProvider {     Dictionary<Type, ServiceDefintion> Services {get;}     ConcurrentDictionary<Type, object> SingletonCache {get;} }  public class ServiceProvider : IServiceProvider {     public Dictionary<Type, ServiceDefintion> Services {get;}     public ConcurrentDictionary<Type, object> SingletonCache {get;}      // 小白同学:复用对应的缓存     public ServiceProvider(IServiceProvider provider)     {         Services = provider.Services;         SingletonCache = provider.SingletonCache;     } }  public class ServiceScopeFactory : IServiceScopeFactory {     private readonly IServiceProvider provider;      // 小白同学:这样我们可以直接取已有的provider     public ServiceScopeFactory(IServiceProvider provider)     {         this.provider = provider;     }      public IServiceProvider CreateScopeProvider()     {          // 小白同学:有了存在的provider,我们就能复用对应的缓存         return new ServiceProvider(provider);     } }小白同学:我们就可以这样注册ServiceScopeFactory了
var a = new ServiceDefintions(); a.Add(new DelegateServiceDefintion(typeof(IServiceScopeFactory),typeof(ServiceScopeFactory),Lifetime.Transient, i => new ServiceScopeFactory(i)));青龙偃月刀:磨刀石呢?我要磨快点
小白同学:又咋了,我写的这么完美?
青龙偃月刀:你确定这样符合作用域的概念?
小白同学:怎么不符合了?SingletonCache 都只有一个了,每个ServiceProvider都是创建新的Scoped生命周期对象
青龙偃月刀:你看看你是怎么写创建新的Scoped生命周期对象的?
小白同学:这样啊
        case Lifetime.Scoped:              return CreateObj(x);青龙偃月刀:一个Scoped生命周期内,一个ServiceType对应生成对象不该唯一吗?
小白同学:为啥啊?生命周期不是用户自己控制了吗?
青龙偃月刀:一个方法的作用域内,可以声明多个同名对象吗?
小白同学:不能呀
青龙偃月刀:那你允许一个Scoped作用域内,可以生成相同ServiceType,实际不同的对象?
小白同学:他可以自己回收呗
青龙偃月刀:你让人家自己回收 !!!??? 那人家为什么不用
                        
                        
                    
