/// <summary>
        /// Register the modules
        /// </summary>
        /// <param name="services">
        /// The <see cref="IServiceCollection"/> to register the modules in
        /// </param>
        /// <param name="configuration">
        /// The <see cref="IConfiguration"/> to use
        /// </param>
        /// <param name="assembly">
        /// The <see cref="Assembly"/> to discover the modules in
        /// </param>
        /// <returns>
        /// The <see cref="IServiceCollection"/> with the modules registered
        /// </returns>
        private static IServiceCollection RegisterModulesInternal(this IServiceCollection services, IConfiguration configuration, Assembly assembly)
        {
            Throw.ArgumentNull.WhenNull(services, nameof(services));
            Throw.ArgumentNull.WhenNull(configuration, nameof(configuration));
            Throw.ArgumentNull.WhenNull(assembly, nameof(assembly));

            var moduleDiscoverer = new DefaultModuleDiscoverer <IModuleRegistrar>();
            var moduleRegistrars = moduleDiscoverer.DiscoverModules(assembly);

            foreach (var currentModuleRegistrar in moduleRegistrars)
            {
                currentModuleRegistrar.ConfigureServices(services, configuration);
            }

            return(services);
        }