using System; using System.Runtime.CompilerServices; using Reflex.Core; using Reflex.Enums; using Reflex.Injectors; namespace Reflex.Resolvers { internal sealed class ScopedFactoryResolver : IResolver { private readonly Func _factory; private readonly ConditionalWeakTable _instances = new(); public Lifetime Lifetime => Lifetime.Scoped; public Container DeclaringContainer { get; set; } public Resolution Resolution { get; } public ScopedFactoryResolver(Func factory, Resolution resolution) { Diagnosis.RegisterCallSite(this); _factory = factory; Resolution = resolution; } public object Resolve(Container resolvingContainer) { Diagnosis.IncrementResolutions(this); if (!_instances.TryGetValue(resolvingContainer, out var instance)) { instance = _factory.Invoke(resolvingContainer); _instances.Add(resolvingContainer, instance); resolvingContainer.Disposables.TryAdd(instance); AttributeInjector.Inject(instance, resolvingContainer); Diagnosis.RegisterInstance(this, instance); } return instance; } public void Dispose() { } } }