Another approach, thanks to a suggestion from @DarkSquirrel42, is to use an
InjectionFactory. The downside is that the code still needs updating every time a new constructor parameter is added to something in the chain. The advantages are much easier to understand code, and only a single registration into the container.
Func<IUnityContainer,object> createChain = container => new LoggingProductRepository( new CachingProductRepository( container.Resolve<ProductRepository>(), container.Resolve<ICacheProvider>()), container.Resolve<ILogger>()); c.RegisterType<IProductRepository>(new InjectionFactory(createChain)); Assert.IsInstanceOf<LoggingProductRepository>(c.Resolve<IProductRepository>());