Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 20 additions & 0 deletions src/LightInject.Tests/ServiceRegistrationTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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<IFoo, Foo>();

container.Override(
sr => sr.ServiceType == typeof(IFoo),
(factory, registration) =>
{
registration.Lifetime = new PerContainerLifetime();
return registration;
});

var instance1 = container.GetInstance<IFoo>();
var instance2 = container.GetInstance<IFoo>();

Assert.Same(instance1, instance2);
}
}
}
37 changes: 22 additions & 15 deletions src/LightInject/LightInject.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand Down Expand Up @@ -3474,12 +3468,8 @@ private Action<IEmitter> 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<IEmitter> CreateEmitMethodForArrayServiceRequest(Type serviceType)
Expand Down Expand Up @@ -3671,14 +3661,31 @@ private void RegisterService(Type serviceType, Type implementingType, ILifetime
Register(serviceRegistration);
}

private Action<IEmitter> 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<IEmitter> 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<IEmitter> emitMethod, IEmitter emitter)
Expand Down