diff --git a/src/Autofac/Builder/RegistrationBuilder{TLimit,TActivatorData,TRegistrationStyle}.cs b/src/Autofac/Builder/RegistrationBuilder{TLimit,TActivatorData,TRegistrationStyle}.cs index 3689ea9b0..8b82931b5 100644 --- a/src/Autofac/Builder/RegistrationBuilder{TLimit,TActivatorData,TRegistrationStyle}.cs +++ b/src/Autofac/Builder/RegistrationBuilder{TLimit,TActivatorData,TRegistrationStyle}.cs @@ -584,11 +584,13 @@ public RegistrationBuilder(Service defaultService, TActivatorData activatorData, if (allowCircularDependencies) { + var capturedInstance = ctxt.Instance; + // If we are allowing circular deps, then we need to run when all requests have completed (similar to Activated). ctxt.RequestCompleting += (o, args) => { var evCtxt = args.RequestContext; - AutowiringPropertyInjector.InjectProperties(evCtxt, evCtxt.Instance!, propertySelector, evCtxt.Parameters); + AutowiringPropertyInjector.InjectProperties(evCtxt, capturedInstance!, propertySelector, evCtxt.Parameters); }; } else diff --git a/test/Autofac.Specification.Test/Features/PropertyInjectionTests.cs b/test/Autofac.Specification.Test/Features/PropertyInjectionTests.cs index 1d47112d7..f904aa87f 100644 --- a/test/Autofac.Specification.Test/Features/PropertyInjectionTests.cs +++ b/test/Autofac.Specification.Test/Features/PropertyInjectionTests.cs @@ -373,6 +373,22 @@ public void SetterInjectionPrivateGet() Assert.False(instance.GetterCalled); } + [Fact] + public void DecoratedInstanceWithPropertyInjectionAllowingCircularReferencesStillInjects() + { + var val = "Value"; + + var builder = new ContainerBuilder(); + builder.RegisterInstance(val); + builder.RegisterType().As().PropertiesAutowired(PropertyWiringOptions.AllowCircularDependencies); + builder.RegisterDecorator(); + + var container = builder.Build(); + var instance = container.Resolve(); + + instance.AssertProp(); + } + private class ConstructorParamNotAttachedToProperty { [SuppressMessage("SA1401", "SA1401")] @@ -411,5 +427,38 @@ private get } } } + + private interface IMyService + { + void AssertProp(); + } + + private sealed class DecoratedService : IMyService + { + public string Prop { get; set; } + + public void AssertProp() + { + if (Prop is null) + { + throw new NullReferenceException(); + } + } + } + + private sealed class ServiceDecorator : IMyService + { + private readonly IMyService _decorating; + + public ServiceDecorator(IMyService decorating) + { + _decorating = decorating; + } + + public void AssertProp() + { + _decorating.AssertProp(); + } + } } }