Stashbox by Peter Csajtai

<PackageReference Include="Stashbox" Version="3.5.1-preview-625" />

 SingletonLifetime

Represents a singleton lifetime manager.
using Stashbox.Registration; using Stashbox.Resolution; using Stashbox.Utils; using System; using System.Linq.Expressions; namespace Stashbox.Lifetime { public class SingletonLifetime : FactoryLifetimeDescriptor { protected override int LifeSpan { get; } = 20; protected override Expression ApplyLifetime(Func<IResolutionScope, object> factory, ServiceRegistration serviceRegistration, ResolutionContext resolutionContext, Type resolveType) { IResolutionScope resolutionScope = resolutionContext.RequestInitiatorContainerContext.ContainerConfiguration.ReBuildSingletonsInChildContainerEnabled ? resolutionContext.RequestInitiatorContainerContext.RootScope : resolutionContext.CurrentContainerContext.RootScope; if (resolutionContext.IsValidationRequest) return resolutionScope.AsConstant().CallMethod(Constants.GetOrAddScopedObjectMethod, serviceRegistration.RegistrationId.AsConstant(), factory.AsConstant()).ConvertTo(resolveType); return resolutionScope.GetOrAddScopedObject(serviceRegistration.RegistrationId, factory).AsConstant(); } } }