Unfortunately, there is no elegant way to do what you want. The Autofac container and its creator are black boxes that prevent you from looking at what you already have.
There is no harm when registering a component twice IF your registrations are independent of the order (BAD, BAD, BAD). Registering a second time will simply overwrite the old registration with the new one.
I seriously doubt this code, since it completely depends on how allTypesInAllAvailableAssemblies is initialized. If this is really every type in your system, then this shit shoots at something that will decide how, say, IDisposable. If you have several different implementations of, say, IConfigurator, you will have limited control over which one is registered, regardless of whether you check what is already registered or just overwrite the registration; it depends entirely on which class ends first (or last) in the list.
The only thing I could think of was to use a little Linq to make sure that the list of types you are registering is unique:
protected override void Load(ContainerBuilder builder) { foreach (var componentType in allTypesInAllAvailableAssemblies.OfType<Type>().Distinct())
This ensures that every instance of componentType has never been seen by a developer before, as part of this foreach loop. This means that, given that this is the only module used to assemble containers, and each container is created only once and never updated, each component in the system will be registered in any given container exactly once. Common interfaces, such as IDisposable, IEnumerable, IComparable, IComparer, etc., will be useless for a solution; they will allow an instance of the last class having this interface.
If you need to verify that the interface has never been registered or that this code also works when using ContainerBuilder to update () an existing container, just stop what you are doing because you are going to create a hopeless mess you can never maintain properly.