public void RegisterContract <TContract>()
            where TContract : class
        {
            var validationResult = new ApiContractValidator
            {
                ContractKeyMustBeSpecified = true
            }.Validate(typeof(TContract));

            if (!validationResult.Success)
            {
                throw new ApiContractValidationException(validationResult);
            }

            string serviceKey = typeof(TContract).GetCustomAttribute <ApiAttribute>()?.Key;

            _services.AddSingleton(serviceProvider =>
            {
                var httpFactory = (IHttpClientFactory)serviceProvider.GetService(typeof(IHttpClientFactory));
                return(ApiProxy <TContract> .Create(new FactoryHttpClientProvider(httpFactory, serviceKey)));
            });
        }
        /// <summary>
        /// Creates api client for specified contract
        /// </summary>
        public static ApiClient <TContract> CreateApiClient <TContract>(this IHttpClientFactory httpClientFactory)
        {
            if (httpClientFactory == null)
            {
                throw new ArgumentNullException(nameof(httpClientFactory));
            }

            var valRes = new ApiContractValidator
            {
                ContractKeyMustBeSpecified = true
            }.Validate(typeof(TContract));

            if (!valRes.Success)
            {
                throw new ApiContractValidationException(valRes);
            }

            var contractKey = typeof(TContract).GetCustomAttribute <ApiAttribute>().Key;

            return(new ApiClient <TContract>(new FactoryHttpClientProvider(httpClientFactory, contractKey)));
        }