Stashbox by Peter Csajtai

<PackageReference Include="Stashbox" Version="3.4.0" />

 ServiceRegistrator

using System; using System.Linq; namespace Stashbox.Registration { internal class ServiceRegistrator { public void Register(IContainerContext containerContext, ServiceRegistration serviceRegistration, Type serviceType) { if (serviceRegistration.RegistrationContext.AdditionalServiceTypes.Any()) { foreach (Type additionalServiceType in serviceRegistration.RegistrationContext.AdditionalServiceTypes) { RegisterInternal(containerContext, serviceRegistration, additionalServiceType); } } RegisterInternal(containerContext, serviceRegistration, serviceType); } private void RegisterInternal(IContainerContext containerContext, ServiceRegistration serviceRegistration, Type serviceType) { if (serviceRegistration.IsDecorator) { containerContext.DecoratorRepository.AddDecorator(serviceType, serviceRegistration, false); containerContext.RootScope.InvalidateDelegateCache(); } else if (containerContext.RegistrationRepository.AddOrUpdateRegistration(serviceRegistration, serviceType)) { containerContext.RootScope.InvalidateDelegateCache(); } } public void ReMap(IContainerContext containerContext, ServiceRegistration serviceRegistration, Type serviceType) { if (serviceRegistration.RegistrationContext.AdditionalServiceTypes.Any()) { foreach (Type additionalServiceType in serviceRegistration.RegistrationContext.AdditionalServiceTypes) { ReMapInternal(containerContext, serviceRegistration, additionalServiceType); } } ReMapInternal(containerContext, serviceRegistration, serviceType); } private void ReMapInternal(IContainerContext containerContext, ServiceRegistration serviceRegistration, Type serviceType) { if (serviceRegistration.IsDecorator) containerContext.DecoratorRepository.AddDecorator(serviceType, serviceRegistration, true); else containerContext.RegistrationRepository.AddOrReMapRegistration(serviceRegistration, serviceType); containerContext.RootScope.InvalidateDelegateCache(); } } }