diff --git a/test/Autofac.Specification.Test/Features/DecoratorTests.cs b/test/Autofac.Specification.Test/Features/DecoratorTests.cs index ed16e69a6..e3174d235 100644 --- a/test/Autofac.Specification.Test/Features/DecoratorTests.cs +++ b/test/Autofac.Specification.Test/Features/DecoratorTests.cs @@ -276,10 +276,47 @@ public void DecoratorAppliedOnlyOnceToComponentWithExternalRegistrySource() var scope = container.BeginLifetimeScope(b => { }); var service = scope.Resolve(); + Assert.IsType(service); Assert.IsType(service.Decorated); } + [Fact] + public void DecoratorCanBeAppliedTwice() + { + var builder = new ContainerBuilder(); + builder.RegisterType().As(); + builder.RegisterDecorator(); + builder.RegisterDecorator(); + var container = builder.Build(); + + var service = container.Resolve(); + + Assert.IsType(service); + Assert.IsType(service.Decorated); + Assert.IsType(service.Decorated.Decorated); + } + + [Fact] + public void DecoratorCanBeAppliedTwiceInChildLifetimeScope() + { + var builder = new ContainerBuilder(); + builder.RegisterType().As(); + builder.RegisterDecorator(); + var container = builder.Build(); + + var scope = container.BeginLifetimeScope(b => b.RegisterDecorator()); + var scopeInstance = scope.Resolve(); + + Assert.IsType(scopeInstance); + Assert.IsType(scopeInstance.Decorated); + Assert.IsType(scopeInstance.Decorated.Decorated); + + var rootInstance = container.Resolve(); + Assert.IsType(rootInstance); + Assert.IsType(rootInstance.Decorated); + } + [Fact] public void DecoratorCanBeAppliedToServiceRegisteredInChildLifetimeScope() { diff --git a/test/Autofac.Test/Features/Decorators/OpenGenericDecoratorTests.cs b/test/Autofac.Test/Features/Decorators/OpenGenericDecoratorTests.cs index d3c8aa874..35dbe802f 100644 --- a/test/Autofac.Test/Features/Decorators/OpenGenericDecoratorTests.cs +++ b/test/Autofac.Test/Features/Decorators/OpenGenericDecoratorTests.cs @@ -550,6 +550,42 @@ public void DecoratorAppliedOnlyOnceToComponentWithExternalRegistrySource() Assert.IsType>(service.Decorated); } + [Fact] + public void DecoratorCanBeAppliedTwice() + { + var builder = new ContainerBuilder(); + builder.RegisterGeneric(typeof(ImplementorA<>)).As(typeof(IDecoratedService<>)); + builder.RegisterGenericDecorator(typeof(DecoratorA<>), typeof(IDecoratedService<>)); + builder.RegisterGenericDecorator(typeof(DecoratorA<>), typeof(IDecoratedService<>)); + var container = builder.Build(); + + var service = container.Resolve>(); + + Assert.IsType>(service); + Assert.IsType>(service.Decorated); + Assert.IsType>(service.Decorated.Decorated); + } + + [Fact] + public void DecoratorCanBeAppliedTwiceInChildLifetimeScope() + { + var builder = new ContainerBuilder(); + builder.RegisterGeneric(typeof(ImplementorA<>)).As(typeof(IDecoratedService<>)); + builder.RegisterGenericDecorator(typeof(DecoratorA<>), typeof(IDecoratedService<>)); + var container = builder.Build(); + + var scope = container.BeginLifetimeScope(b => b.RegisterGenericDecorator(typeof(DecoratorA<>), typeof(IDecoratedService<>))); + var scopeInstance = scope.Resolve>(); + + Assert.IsType>(scopeInstance); + Assert.IsType>(scopeInstance.Decorated); + Assert.IsType>(scopeInstance.Decorated.Decorated); + + var rootInstance = container.Resolve>(); + Assert.IsType>(rootInstance); + Assert.IsType>(rootInstance.Decorated); + } + [Fact] public void DecoratorCanBeAppliedToServiceRegisteredInChildLifetimeScope() {