public Func <Scope, object> BuildFuncResolver(Scope scope) { var root = scope.Root; var def = new FuncResolverDefinition(this, root); var resolver = def.BuildResolver(); if (Lifetime == ServiceLifetime.Scoped) { var locker = new object(); return(s => { if (s.Services.TryGetValue(Hash, out object service)) { return service; } lock (locker) { if (s.Services.TryGetValue(Hash, out service)) { return service; } service = resolver(s); s.Services.Add(Hash, service); return service; } }); } if (Lifetime == ServiceLifetime.Singleton) { var locker = new object(); return(s => { if (root.Services.TryGetValue(Hash, out object service)) { return service; } lock (locker) { if (root.Services.TryGetValue(Hash, out service)) { return service; } service = resolver(root); root.Services.Add(Hash, service); return service; } }); } return(resolver); }
public Func <Scope, object> BuildFuncResolver(Scope scope) { var root = scope.Root; var def = new FuncResolverDefinition(this, root); var resolver = def.BuildResolver(); switch (Lifetime) { case ServiceLifetime.Scoped: { var locker = new object(); return(s => { if (s.Services.TryFind(Hash, out object service)) { return service; } lock (locker) { if (s.Services.TryFind(Hash, out service)) { return service; } service = resolver(s); s.Services = s.Services.AddOrUpdate(Hash, service); return service; } }); } case ServiceLifetime.Singleton: { var locker = new object(); return(s => { if (root.Services.TryFind(Hash, out object service)) { return service; } lock (locker) { if (root.Services.TryFind(Hash, out service)) { return service; } service = resolver(root); root.Services = root.Services.AddOrUpdate(Hash, service); return service; } }); } default: return(resolver); } }