public Registration(TypeKey typeKey, Lifetime lifeTime, TypeConstructionInfo typeConstructionInfo = null, IReadOnlyList <Type> mappedAbstractionTypes = null, bool isTrackingDisposables = true)
        {
            TypeKey  = typeKey.MustBeValidRegistrationTypeKey();
            Lifetime = lifeTime.MustNotBeNull(nameof(lifeTime));
            if (lifeTime.IsCreatingNewInstances)
            {
                if (typeConstructionInfo == null)
                {
                    throw new RegistrationException($"The Type Construction Info for {typeKey} must not be null when the Lifetime \"{lifeTime}\" of the registration is able to create new instances of the target type.");
                }
                if (typeConstructionInfo.TypeKey != typeKey)
                {
                    throw new RegistrationException($"The Type Key {typeConstructionInfo.TypeKey} of the Type Construction Info is not equal to the Type Key {typeKey} of the registration.");
                }
                TypeConstructionInfo = typeConstructionInfo;
            }
            else if (TargetType.IsGenericTypeDefinition())
            {
                throw new RegistrationException($"You cannot register the generic type definition \"{TargetType}\" when the corresponding lifetime does not create instances.");
            }

            if (mappedAbstractionTypes.IsNullOrEmpty() == false)
            {
                // ReSharper disable once PossibleNullReferenceException
                for (var i = 0; i < mappedAbstractionTypes.Count; i++)
                {
                    mappedAbstractionTypes[i].MustBeBaseTypeOf(TargetType);
                }
            }
            MappedAbstractionTypes = mappedAbstractionTypes;
            IsTrackingDisposables  = isTrackingDisposables;
        }