public static IServiceCollection AsPublicImplementedInterfaces(
            this AutoRegisterData autoRegisterData,
            ServiceLifetime lifetime = ServiceLifetime.Transient)
        {
            if (autoRegisterData == null)
            {
                throw new ArgumentNullException(nameof(autoRegisterData));
            }

            var classTypes = autoRegisterData.TypeFilter == null
                ? autoRegisterData.TypesToConsider
                : autoRegisterData.TypesToConsider.Where(autoRegisterData.TypeFilter);

            foreach (var classType in classTypes)
            {
                var interfaces = classType.GetTypeInfo().ImplementedInterfaces
                                 .Where(i => i != typeof(IDisposable) && i.IsPublic);

                foreach (var interInterface in interfaces)
                {
                    autoRegisterData.Services.Add(new ServiceDescriptor(interInterface, classType, lifetime));
                }
            }

            return(autoRegisterData.Services);
        }
        public static AutoRegisterData Where(this AutoRegisterData autoRegisterData, Func <Type, bool> predicate)
        {
            if (autoRegisterData == null)
            {
                throw new ArgumentNullException(nameof(autoRegisterData));
            }
            autoRegisterData.TypeFilter = predicate;

            return(new AutoRegisterData(autoRegisterData.Services, autoRegisterData.TypesToConsider.Where(predicate)));
        }