/// <summary>
        /// Register <paramref name="interfaceType"/> as an aggregate service.
        /// </summary>
        /// <param name="builder">The container builder.</param>
        /// <param name="interfaceType">The interface type to register.</param>
        /// <exception cref="ArgumentNullException">If <paramref name="interfaceType"/> is null.</exception>
        /// <exception cref="ArgumentException">If <paramref name="interfaceType"/> is not an interface.</exception>
        public static void RegisterAggregateService(this ContainerBuilder builder, Type interfaceType)
        {
            if (interfaceType == null)
            {
                throw new ArgumentNullException(nameof(interfaceType));
            }

            if (!interfaceType.GetTypeInfo().IsInterface)
            {
                throw new ArgumentException(AggregateServicesResources.GetString("TypeMustBeInterface"), nameof(interfaceType));
            }

            builder.Register(c => AggregateServiceGenerator.CreateInstance(interfaceType, c.Resolve <IComponentContext>()))
            .As(interfaceType)
            .InstancePerDependency();
        }
        /// <summary>
        /// Generate an aggregate service instance that will resolve its types from <paramref name="context"/>.
        /// </summary>
        /// <param name="context">The component context from where types will be resolved.</param>
        /// <param name="interfaceType">The interface type for the aggregate service.</param>
        /// <returns>The aggregate service instance.</returns>
        /// <exception cref="ArgumentException">Thrown if <paramref name="interfaceType"/> is not an interface.</exception>
        public static object CreateInstance(Type interfaceType, IComponentContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException(nameof(context));
            }

            if (interfaceType == null)
            {
                throw new ArgumentNullException(nameof(interfaceType));
            }

            if (!interfaceType.GetTypeInfo().IsInterface)
            {
                throw new ArgumentException(AggregateServicesResources.GetString("TypeMustBeInterface"), nameof(interfaceType));
            }

            var resolverInterceptor = new ResolvingInterceptor(interfaceType, context);

            return(Generator.CreateInterfaceProxyWithoutTarget(interfaceType, resolverInterceptor));
        }