/// <summary>
 /// Changes the root service behaviour for subquent operations on the
 /// specified nested service collection.
 /// </summary>
 /// <param name="services">The nested service collection for which to change the inheritance behaviour. Must not be <see langword="null"/>.</param>
 /// <param name="behavior">The new behaviour when adding subsequent nested services.</param>
 /// <returns>The instance specified in the <paramref name="services"/> parameter, to allow to fluent API chaining.</returns>
 /// <exception cref="ArgumentNullException"><paramref name="services"/> is <see langword="null"/>.</exception>
 public static INestedServiceCollection <TFamily, TKey> ChangeRootServicesAddBehavior <TFamily, TKey>(
     this INestedServiceCollection <TFamily, TKey> services,
     RootServicesAddBehavior behavior)
 {
     InternalChangeRootServicesAddBehavior(services, behavior);
     return(services);
 }
 /// <exception cref="ArgumentNullException"><paramref name="services"/> is <see langword="null"/>.</exception>
 private static INestedServiceCollection InternalChangeRootServicesAddBehavior(
     this INestedServiceCollection services,
     RootServicesAddBehavior behavior)
 {
     if (services is null)
     {
         throw new ArgumentNullException(nameof(services));
     }
     services.RootServicesAddBehavior = behavior;
     return(services);
 }
        /// <exception cref="ArgumentNullException"><paramref name="services"/> is <see langword="null"/>.</exception>
        private static INestedServiceCollection InternalWithRootServicesAddBehavior(
            this INestedServiceCollection services,
            RootServicesAddBehavior behavior,
            Action <INestedServiceCollection>?configureServices)
        {
            if (services is null)
            {
                throw new ArgumentNullException(nameof(services));
            }
            var oldBehavior = services.RootServicesAddBehavior;

            services.RootServicesAddBehavior = behavior;
            configureServices?.Invoke(services);
            services.RootServicesAddBehavior = oldBehavior;
            return(services);
        }
        /// <summary>
        /// Configures the nested service collection using the specified behaviour
        /// when registring nested services.
        /// <para>The previous behaviour will be reset when this method returns.</para>
        /// </summary>
        /// <param name="services">The nested service collection to configure. Must not be <see langword="null"/>.</param>
        /// <param name="behavior">The inherited service behaviour to using during configuration.</param>
        /// <param name="configureServices">The configuration function to invoke to configure the service collection.</param>
        /// <returns>The instance specified in the <paramref name="services"/> parameter, to allow to fluent API chaining.</returns>
        /// <exception cref="ArgumentNullException"><paramref name="services"/> is <see langword="null"/>.</exception>
        public static INestedServiceCollection <TFamily, TKey> WithRootServicesAddBehavior <TFamily, TKey>(
            this INestedServiceCollection <TFamily, TKey> services,
            RootServicesAddBehavior behavior,
            Action <INestedServiceCollection <TFamily, TKey> >?configureServices)
        {
            Action <INestedServiceCollection>?internalConfigureServices;

            if (configureServices is null)
            {
                internalConfigureServices = null;
            }
            else
            {
                internalConfigureServices = s =>
                                            configureServices((INestedServiceCollection <TFamily, TKey>)s);
            }
            InternalWithRootServicesAddBehavior(services, behavior,
                                                internalConfigureServices);
            return(services);
        }
 /// <summary>
 /// Configures the nested service collection using the specified behaviour
 /// when registring nested services.
 /// <para>The previous behaviour will be reset when this method returns.</para>
 /// </summary>
 /// <param name="services">The nested service collection to configure. Must not be <see langword="null"/>.</param>
 /// <param name="behavior">The inherited service behaviour to using during configuration.</param>
 /// <param name="configureServices">The configuration function to invoke to configure the service collection.</param>
 /// <returns>The instance specified in the <paramref name="services"/> parameter, to allow to fluent API chaining.</returns>
 /// <exception cref="ArgumentNullException"><paramref name="services"/> is <see langword="null"/>.</exception>
 public static INestedServiceCollection WithRootServicesAddBehavior(
     this INestedServiceCollection services,
     RootServicesAddBehavior behavior,
     Action <INestedServiceCollection> configureServices)
 => InternalWithRootServicesAddBehavior(services, behavior, configureServices);
 /// <summary>
 /// Changes the root service behaviour for subquent operations on the
 /// specified nested service collection.
 /// </summary>
 /// <param name="services">The nested service collection for which to change the inheritance behaviour. Must not be <see langword="null"/>.</param>
 /// <param name="behavior">The new behaviour when adding subsequent nested services.</param>
 /// <returns>The instance specified in the <paramref name="services"/> parameter, to allow to fluent API chaining.</returns>
 /// <exception cref="ArgumentNullException"><paramref name="services"/> is <see langword="null"/>.</exception>
 public static INestedServiceCollection ChangeRootServicesAddBehavior(
     this INestedServiceCollection services,
     RootServicesAddBehavior behavior)
 => InternalChangeRootServicesAddBehavior(services, behavior);