private static ICredentials Credentials(CrmClientOptions options)
        {
            if (options.UseDefaultCredentials)
            {
                return(CredentialCache.DefaultNetworkCredentials);
            }

            var creds = new CredentialCache
            {
                {
                    options.BaseAddress, options.AuthType,
                    new NetworkCredential(options.Username, options.Password, options.Domain)
                }
            };

            return(creds);
        }
        public static IServiceCollection AddCrmWebApiClient <TCrmWebApiClient, TWebApiMetadataService>(
            this IServiceCollection services,
            Action <CrmClientOptions> configureOptions)
            where TCrmWebApiClient : class, ICrmWebApiClient
            where TWebApiMetadataService : class, IWebApiMetadataService
        {
            var options = new CrmClientOptions();

            configureOptions?.Invoke(options);

            if (string.IsNullOrEmpty(options.ConnectionString))
            {
                throw new ArgumentException("Invalid Crm ConnectionString");
            }

            var httpClientBuilder = services.AddHttpClient <ICrmWebApiClient, TCrmWebApiClient>()
                                    .ConfigureHttpClient(client =>
            {
                var acceptHeader = new MediaTypeWithQualityHeaderValue("application/json");
                acceptHeader.Parameters.Add(new NameValueHeaderValue("odata.metadata", "minimal"));
                acceptHeader.Parameters.Add(new NameValueHeaderValue("odata.streaming", "true"));

                client.BaseAddress = options.BaseAddress;
                client.DefaultRequestHeaders.Accept.Clear();
                client.DefaultRequestHeaders.Accept.Add(acceptHeader);
                client.DefaultRequestHeaders.TryAddWithoutValidation("OData-Version", "4.0");
                client.DefaultRequestHeaders.TryAddWithoutValidation("OData-MaxVersion", "4.0");

                //client.Timeout = TimeSpan.FromSeconds(30);
            })
                                    .ConfigurePrimaryHttpMessageHandler(() =>
            {
                var handler = new HttpClientHandler
                {
                    UseDefaultCredentials = options.UseDefaultCredentials,
                    Credentials           = Credentials(options),
                    PreAuthenticate       = true,
                };

                if (handler.SupportsAutomaticDecompression)
                {
                    handler.AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip;
                }

                if (options.IgnoreSSLErrors)
                {
                    // TODO: Set ignoring difirent System.Net.Security.SslPolicyErrors
                    // e.g. RemoteCertificateNameMismatch
                    handler.ServerCertificateCustomValidationCallback = (message, cert, chain, errors) =>
                    {
                        return(true);
                    };
                }

                return(handler);
            });

            if (options.HandlerLifetime != default)
            {
                httpClientBuilder.SetHandlerLifetime(options.HandlerLifetime);
            }

            services.AddSingleton <CrmClientFactory>();
            services.AddSingleton <IWebApiMetadataService, TWebApiMetadataService>();
            return(services);
        }