diff --git a/src/LightInject.Tests/ServiceRegistrationTests.cs b/src/LightInject.Tests/ServiceRegistrationTests.cs index 244c9524..38d4a5ad 100644 --- a/src/LightInject.Tests/ServiceRegistrationTests.cs +++ b/src/LightInject.Tests/ServiceRegistrationTests.cs @@ -78,5 +78,25 @@ public void GetInstance_OverrideImplementingType_CreateInstanceOfOverriddenImple Assert.IsAssignableFrom(typeof(AnotherFoo), instance); } + + [Fact] + public void GetInstance_OverrideServiceLifetime_CreateInstanceWithOverriddenLifetime() + { + var container = new ServiceContainer(); + container.Register(); + + container.Override( + sr => sr.ServiceType == typeof(IFoo), + (factory, registration) => + { + registration.Lifetime = new PerContainerLifetime(); + return registration; + }); + + var instance1 = container.GetInstance(); + var instance2 = container.GetInstance(); + + Assert.Same(instance1, instance2); + } } } \ No newline at end of file diff --git a/src/LightInject/LightInject.cs b/src/LightInject/LightInject.cs index 6222c00e..7fc06157 100644 --- a/src/LightInject/LightInject.cs +++ b/src/LightInject/LightInject.cs @@ -3030,12 +3030,6 @@ private ServiceRegistration UpdateServiceRegistration(ServiceRegistration existi private void EmitNewInstanceWithDecorators(ServiceRegistration serviceRegistration, IEmitter emitter) { - var serviceOverrides = overrides.Items.Where(so => so.CanOverride(serviceRegistration)).ToArray(); - foreach (var serviceOverride in serviceOverrides) - { - serviceRegistration = serviceOverride.ServiceRegistrationFactory(this, serviceRegistration); - } - var serviceDecorators = GetDecorators(serviceRegistration); if (serviceDecorators.Length > 0) { @@ -3474,12 +3468,8 @@ private Action CreateServiceEmitterBasedOnFactoryRule(FactoryRule rule FactoryExpression = rule.Factory, Lifetime = CloneLifeTime(rule.LifeTime) ?? DefaultLifetime }; - if (rule.LifeTime != null) - { - return emitter => EmitLifetime(serviceRegistration, e => EmitNewInstanceWithDecorators(serviceRegistration, e), emitter); - } - return emitter => EmitNewInstanceWithDecorators(serviceRegistration, emitter); + return ResolveEmitMethod(serviceRegistration); } private Action CreateEmitMethodForArrayServiceRequest(Type serviceType) @@ -3671,14 +3661,31 @@ private void RegisterService(Type serviceType, Type implementingType, ILifetime Register(serviceRegistration); } - private Action ResolveEmitMethod(ServiceRegistration serviceRegistration) + private ServiceRegistration ProcessServiceRegistrationOverrides(ServiceRegistration serviceRegistration) { - if (serviceRegistration.Lifetime == null) + var serviceOverrides = overrides.Items.Where(so => so.CanOverride(serviceRegistration)).ToList(); + foreach (var serviceOverride in serviceOverrides) { - return methodSkeleton => EmitNewInstanceWithDecorators(serviceRegistration, methodSkeleton); + serviceRegistration = serviceOverride.ServiceRegistrationFactory(this, serviceRegistration); } - return methodSkeleton => EmitLifetime(serviceRegistration, ms => EmitNewInstanceWithDecorators(serviceRegistration, ms), methodSkeleton); + return serviceRegistration; + } + + private Action ResolveEmitMethod(ServiceRegistration serviceRegistration) + { + return methodSkeleton => + { + serviceRegistration = ProcessServiceRegistrationOverrides(serviceRegistration); + if (serviceRegistration.Lifetime == null) + { + EmitNewInstanceWithDecorators(serviceRegistration, methodSkeleton); + } + else + { + EmitLifetime(serviceRegistration, ms => EmitNewInstanceWithDecorators(serviceRegistration, ms), methodSkeleton); + } + }; } private void EmitLifetime(ServiceRegistration serviceRegistration, Action emitMethod, IEmitter emitter)