using LINGYUN.ApiGateway.Localization; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Localization; using Ocelot.LoadBalancer.LoadBalancers; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Volo.Abp.DependencyInjection; namespace LINGYUN.ApiGateway.Utils { public class LoadBalancerFinder : ILoadBalancerFinder, ISingletonDependency { private Lazy> lazyLoadBalancers; protected List LoadBalancers => lazyLoadBalancers.Value; protected IServiceProvider ServiceProvider { get; } protected IStringLocalizer Localizer { get; } public LoadBalancerFinder( IServiceProvider serviceProvider, IStringLocalizer localizer) { Localizer = localizer; ServiceProvider = serviceProvider; lazyLoadBalancers = new Lazy>(() => FindLocalLoadBalancers()); } public Task> GetLoadBalancersAsync() { return Task.FromResult(LoadBalancers); } protected List FindLocalLoadBalancers() { List loadBalancers = new List { new LoadBalancerDescriptor(typeof(NoLoadBalancer).Name, Localizer["NoLoadBalancer"]), new LoadBalancerDescriptor(typeof(RoundRobin).Name, Localizer["RoundRobin"]), new LoadBalancerDescriptor(typeof(LeastConnection).Name, Localizer["LeastConnection"]), new LoadBalancerDescriptor(typeof(CookieStickySessions).Name, Localizer["CookieStickySessions"]) }; var loadBalancerCreators = ServiceProvider.GetServices(); loadBalancerCreators = loadBalancerCreators .Where(lbc => !loadBalancers.Any(l => l.Type.Equals(lbc.Type))) .ToArray(); foreach(var defintedLoadBalancerCreator in loadBalancerCreators) { loadBalancers.Add(new LoadBalancerDescriptor(defintedLoadBalancerCreator.Type, Localizer["CustomLoadBalancer", defintedLoadBalancerCreator.Type])); } return loadBalancers; } } }