/// <summary>
        /// Registers the IDocumentLibraryClient with the DI container.
        /// </summary>
        /// <param name="serviceCollection">The IServiceCollection.</param>
        /// <param name="options">Configuration options for this client.</param>
        /// <param name="factory">Factory used to construct instances of an IDocumentLibraryClient.</param>
        /// <returns>The updated IServiceCollection.</returns>
        public static IServiceCollection AddDocumentLibraryClient(this IServiceCollection serviceCollection, DocumentLibraryClientOptions options, Func <HttpClient, IServiceProvider, IDocumentLibraryClient> factory)
        {
            if (options is null)
            {
                throw new ArgumentNullException(nameof(options));
            }

            if (options.TokenClientOptions is null)
            {
                throw new ArgumentOutOfRangeException(nameof(options));
            }

            // Configure the HttpClient for use by the ITokenClient.
            serviceCollection.AddHttpClient(DocumentLibraryClientOptions.DocumentLibraryTokenClientBackChannelHttpClientName)
            .UseSslProtocols(SslProtocols.Tls12);

            // Configure the ITokenClient to use the previous HttpClient.
            serviceCollection
            .AddClientCredentialsTokenClient(DocumentLibraryClientOptions.DocumentLibraryTokenClientName, options.TokenClientOptions)
            .UseHttpClientForBackchannel(DocumentLibraryClientOptions.DocumentLibraryTokenClientBackChannelHttpClientName);

            // Configure the HttpClient with the ITokenClient for inserting tokens into the header.
            IHttpClientBuilder httpClientBuilder = serviceCollection
                                                   .AddHttpClient(DocumentLibraryClientOptions.DocumentLibraryHttpClientName, c => c.BaseAddress = options.DocumentLibraryApiUri)
                                                   .UseSslProtocols(SslProtocols.Tls12)
                                                   .UseApiVersion(options.ApiVersion ?? "2019-09-01", null !)
                                                   .UseTokenClient(DocumentLibraryClientOptions.DocumentLibraryTokenClientName)
                                                   .AddTypedClient(factory);

            if (!string.IsNullOrWhiteSpace(options.ApiKey))
            {
                httpClientBuilder.UseHeader(options.ApiKeyHeaderName ?? "Subscription-Key", options.ApiKey !);
            }

            return(serviceCollection);
        }
 /// <summary>
 /// Registers the IDocumentLibraryClient with the DI container.
 /// </summary>
 /// <param name="serviceCollection">The IServiceCollection.</param>
 /// <param name="options">Configuration options for this client.</param>
 /// <returns>The updated IServiceCollection.</returns>
 public static IServiceCollection AddDocumentLibraryClient(this IServiceCollection serviceCollection, DocumentLibraryClientOptions options)
 {
     return(serviceCollection.AddDocumentLibraryClient <DocumentLibraryClient>(options));
 }