public UrlTemplate GetUrlTemplate(MethodInfo methodInfo)
        {
            var serviceAttribute = methodInfo.DeclaringType.GetCustomAttribute <ConsulServiceAttribute>();

            if (serviceAttribute != null)
            {
                var serviceName   = serviceAttribute.ServiceName;
                var pathAttribute = methodInfo.GetCustomAttribute <ConsulPathAttribute>();
                if (pathAttribute != null)
                {
                    var urlPath     = pathAttribute.Path;
                    var httpMethod  = pathAttribute.HttpMethod;
                    var loadBalance = LoadBalanceRepository.GetLoadBalance(methodInfo.DeclaringType.FullName);
                    var serviceInfo = _consulInfoProvider.GetServiceInfo(serviceName, loadBalance);
                    if (serviceInfo == null)
                    {
                        throw new Exception($"Can't find {serviceName} in Consul");
                    }
                    var host = serviceInfo.Address.StartsWith("http") ? serviceInfo.Address : $"http://{serviceInfo.Address}";
                    return(new UrlTemplate
                    {
                        Host = $"{host}:{serviceInfo.ServicePort}",
                        HttpMethod = httpMethod,
                        Url = urlPath
                    });
                }
            }

            return(HttpRequestUtil.BuildUrlTemplate(methodInfo));
        }
        public static void AddWebApiEasyInvoker(this IServiceCollection services, EasyInvokerConsulConfig consulConfig)
        {
            if (consulConfig == null)
            {
                throw new NullReferenceException("EasyInvokerConsulConfig is null");
            }
            services.TryAddScoped <IUrlBuilder, UrlBuilderConsul>();
            services.AddSingleton <IConsulServiceRefresh, ConsulServiceRefresh>();
            services.AddSingleton <IConsulServiceInfoProvider, ConsulServiceInfoProvider>();
            services.AddWebApiEasyInvoker();

            var serviceRefresh = services.BuildServiceProvider().GetService <IConsulServiceRefresh>();
            var serviceList    = new List <string>();
            var balanceDic     = new Dictionary <string, ILoadBalance>();

            foreach (var assembie in AppDomain.CurrentDomain.GetAssemblies())
            {
                assembie.GetTypes().ToList().ForEach(t =>
                {
                    if (t.IsInterface && t.GetInterface("IWebApiInvoker`1", true) != null)
                    {
                        var attribute = t.GetCustomAttribute <ConsulServiceAttribute>();
                        if (attribute != null)
                        {
                            var balanceType = attribute.BalanceType;
                            ILoadBalance loadBalance;
                            switch (balanceType)
                            {
                            case BalanceType.First:
                                loadBalance = new LoadBalanceFirst();
                                break;

                            case BalanceType.Last:
                                loadBalance = new LoadBalanceLast();
                                break;

                            case BalanceType.Round:
                                loadBalance = new LoadBalanceRound();
                                break;

                            case BalanceType.Random:
                                loadBalance = new LoadBalanceRandom();
                                break;

                            case BalanceType.LeastConnection:
                                loadBalance = new LoadBalanceLeastConnection();
                                break;

                            default:
                                loadBalance = new LoadBalanceFirst();
                                break;
                            }
                            balanceDic.Add(t.FullName, loadBalance);
                            if (!serviceList.Contains(attribute.ServiceName))
                            {
                                serviceList.Add(attribute.ServiceName);
                            }
                        }
                    }
                });
            }
            LoadBalanceRepository.LoadData(balanceDic);
            serviceRefresh.LoadServices(serviceList);
            serviceRefresh.Start(consulConfig);
        }