diff --git a/src/Ocelot/Configuration/Creator/FileOcelotConfigurationCreator.cs b/src/Ocelot/Configuration/Creator/FileOcelotConfigurationCreator.cs index 9fe77bbf..fd27e4e6 100644 --- a/src/Ocelot/Configuration/Creator/FileOcelotConfigurationCreator.cs +++ b/src/Ocelot/Configuration/Creator/FileOcelotConfigurationCreator.cs @@ -9,6 +9,7 @@ using Ocelot.Configuration.Builder; using Ocelot.Configuration.File; using Ocelot.Configuration.Parser; using Ocelot.Configuration.Validator; +using Ocelot.LoadBalancer; using Ocelot.LoadBalancer.LoadBalancers; using Ocelot.Logging; using Ocelot.Requester.QoS; @@ -25,8 +26,7 @@ namespace Ocelot.Configuration.Creator private readonly IOptions _options; private readonly IConfigurationValidator _configurationValidator; private readonly IOcelotLogger _logger; - private readonly ILoadBalancerFactory _loadBalanceFactory; - private readonly ILoadBalancerHouse _loadBalancerHouse; + private readonly ILoadBalancerCreator _lbCreator; private readonly IQoSProviderFactory _qoSProviderFactory; private readonly IQosProviderHouse _qosProviderHouse; private readonly IClaimsToThingCreator _claimsToThingCreator; @@ -44,8 +44,7 @@ namespace Ocelot.Configuration.Creator IOptions options, IConfigurationValidator configurationValidator, IOcelotLoggerFactory loggerFactory, - ILoadBalancerFactory loadBalancerFactory, - ILoadBalancerHouse loadBalancerHouse, + ILoadBalancerCreator lbCreator, IQoSProviderFactory qoSProviderFactory, IQosProviderHouse qosProviderHouse, IClaimsToThingCreator claimsToThingCreator, @@ -60,13 +59,12 @@ namespace Ocelot.Configuration.Creator IHttpHandlerOptionsCreator httpHandlerOptionsCreator ) { + _lbCreator = lbCreator; _regionCreator = regionCreator; _rateLimitOptionsCreator = rateLimitOptionsCreator; _requestIdKeyCreator = requestIdKeyCreator; _upstreamTemplatePatternCreator = upstreamTemplatePatternCreator; _authOptionsCreator = authOptionsCreator; - _loadBalanceFactory = loadBalancerFactory; - _loadBalancerHouse = loadBalancerHouse; _qoSProviderFactory = qoSProviderFactory; _qosProviderHouse = qosProviderHouse; _options = options; @@ -176,7 +174,7 @@ namespace Ocelot.Configuration.Creator .WithHttpHandlerOptions(httpHandlerOptions) .Build(); - await SetupLoadBalancer(reRoute); + await _lbCreator.SetupLoadBalancer(reRoute); SetupQosProvider(reRoute); return reRoute; } @@ -188,12 +186,6 @@ namespace Ocelot.Configuration.Creator return loadBalancerKey; } - private async Task SetupLoadBalancer(ReRoute reRoute) - { - var loadBalancer = await _loadBalanceFactory.Get(reRoute); - _loadBalancerHouse.Add(reRoute.ReRouteKey, loadBalancer); - } - private void SetupQosProvider(ReRoute reRoute) { var loadBalancer = _qoSProviderFactory.Get(reRoute); diff --git a/src/Ocelot/DependencyInjection/ServiceCollectionExtensions.cs b/src/Ocelot/DependencyInjection/ServiceCollectionExtensions.cs index 430ae18d..85f0f4b6 100644 --- a/src/Ocelot/DependencyInjection/ServiceCollectionExtensions.cs +++ b/src/Ocelot/DependencyInjection/ServiceCollectionExtensions.cs @@ -46,6 +46,7 @@ using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Ocelot.Configuration; using FileConfigurationProvider = Ocelot.Configuration.Provider.FileConfigurationProvider; +using Ocelot.LoadBalancer; namespace Ocelot.DependencyInjection { @@ -93,6 +94,7 @@ namespace Ocelot.DependencyInjection .AddJsonFormatters(); services.AddLogging(); + services.TryAddSingleton(); services.TryAddSingleton(); services.TryAddSingleton(); services.TryAddSingleton(); diff --git a/src/Ocelot/LoadBalancer/ILoadBalancerCreator.cs b/src/Ocelot/LoadBalancer/ILoadBalancerCreator.cs new file mode 100644 index 00000000..e60c36f0 --- /dev/null +++ b/src/Ocelot/LoadBalancer/ILoadBalancerCreator.cs @@ -0,0 +1,10 @@ +using System.Threading.Tasks; +using Ocelot.Configuration; + +namespace Ocelot.LoadBalancer +{ + public interface ILoadBalancerCreator + { + Task SetupLoadBalancer(ReRoute reRoute); + } +} \ No newline at end of file diff --git a/src/Ocelot/LoadBalancer/LoadBalancerCreator.cs b/src/Ocelot/LoadBalancer/LoadBalancerCreator.cs index 70a42148..da28e5b8 100644 --- a/src/Ocelot/LoadBalancer/LoadBalancerCreator.cs +++ b/src/Ocelot/LoadBalancer/LoadBalancerCreator.cs @@ -4,7 +4,7 @@ using Ocelot.LoadBalancer.LoadBalancers; namespace Ocelot.LoadBalancer { - public class LoadBalancerCreator + public class LoadBalancerCreator : ILoadBalancerCreator { private readonly ILoadBalancerHouse _loadBalancerHouse; private readonly ILoadBalancerFactory _loadBalanceFactory; diff --git a/test/Ocelot.UnitTests/Configuration/FileConfigurationCreatorTests.cs b/test/Ocelot.UnitTests/Configuration/FileConfigurationCreatorTests.cs index d897bf64..0440e7ee 100644 --- a/test/Ocelot.UnitTests/Configuration/FileConfigurationCreatorTests.cs +++ b/test/Ocelot.UnitTests/Configuration/FileConfigurationCreatorTests.cs @@ -19,7 +19,7 @@ using Xunit; namespace Ocelot.UnitTests.Configuration { using System.Collections; - + using Ocelot.LoadBalancer; using Ocelot.UnitTests.TestData; public class FileConfigurationCreatorTests @@ -30,8 +30,6 @@ namespace Ocelot.UnitTests.Configuration private FileConfiguration _fileConfiguration; private readonly Mock _logger; private readonly FileOcelotConfigurationCreator _ocelotConfigurationCreator; - private readonly Mock _loadBalancerFactory; - private readonly Mock _loadBalancerHouse; private readonly Mock _loadBalancer; private readonly Mock _qosProviderFactory; private readonly Mock _qosProviderHouse; @@ -46,6 +44,7 @@ namespace Ocelot.UnitTests.Configuration private Mock _rateLimitOptions; private Mock _regionCreator; private Mock _httpHandlerOptionsCreator; + private Mock _lbCreator; public FileConfigurationCreatorTests() { @@ -55,8 +54,6 @@ namespace Ocelot.UnitTests.Configuration _logger = new Mock(); _validator = new Mock(); _fileConfig = new Mock>(); - _loadBalancerFactory = new Mock(); - _loadBalancerHouse = new Mock(); _loadBalancer = new Mock(); _claimsToThingCreator = new Mock(); _authOptionsCreator = new Mock(); @@ -68,10 +65,11 @@ namespace Ocelot.UnitTests.Configuration _rateLimitOptions = new Mock(); _regionCreator = new Mock(); _httpHandlerOptionsCreator = new Mock(); + _lbCreator = new Mock(); _ocelotConfigurationCreator = new FileOcelotConfigurationCreator( _fileConfig.Object, _validator.Object, _logger.Object, - _loadBalancerFactory.Object, _loadBalancerHouse.Object, + _lbCreator.Object, _qosProviderFactory.Object, _qosProviderHouse.Object, _claimsToThingCreator.Object, _authOptionsCreator.Object, _upstreamTemplatePatternCreator.Object, _requestIdKeyCreator.Object, _serviceProviderConfigCreator.Object, _qosOptionsCreator.Object, _fileReRouteOptionsCreator.Object, @@ -212,10 +210,8 @@ namespace Ocelot.UnitTests.Configuration })) .And(x => x.GivenTheConfigIsValid()) .And(x => x.GivenTheFollowingOptionsAreReturned(reRouteOptions)) - .And(x => x.GivenTheLoadBalancerFactoryReturns()) .When(x => x.WhenICreateTheConfig()) - .Then(x => x.TheLoadBalancerFactoryIsCalledCorrectly()) - .And(x => x.ThenTheLoadBalancerHouseIsCalledCorrectly()) + .And(x => x.ThenTheLoadBalancerCreatorIsCalledCorrectly()) .BDDfy(); } @@ -516,7 +512,6 @@ namespace Ocelot.UnitTests.Configuration .And(x => x.GivenTheAuthOptionsCreatorReturns(authenticationOptions)) .And(x => x.GivenTheFollowingOptionsAreReturned(reRouteOptions)) .And(x => x.GivenTheClaimsToThingCreatorReturns(new List { new ClaimToThing("CustomerId", "CustomerId", "", 0) })) - .And(x => x.GivenTheLoadBalancerFactoryReturns()) .When(x => x.WhenICreateTheConfig()) .Then(x => x.ThenTheReRoutesAre(expected)) .And(x => x.ThenTheAuthenticationOptionsAre(expected)) @@ -550,7 +545,6 @@ namespace Ocelot.UnitTests.Configuration .And(x => x.GivenTheConfigIsValid()) .And(x => x.GivenTheFollowingOptionsAreReturned(reRouteOptions)) .And(x => x.GivenTheAuthOptionsCreatorReturns(authenticationOptions)) - .And(x => x.GivenTheLoadBalancerFactoryReturns()) .When(x => x.WhenICreateTheConfig()) .Then(x => x.ThenTheReRoutesAre(expected)) .And(x => x.ThenTheAuthenticationOptionsAre(expected)) @@ -634,23 +628,9 @@ namespace Ocelot.UnitTests.Configuration } } - private void GivenTheLoadBalancerFactoryReturns() + private void ThenTheLoadBalancerCreatorIsCalledCorrectly() { - _loadBalancerFactory - .Setup(x => x.Get(It.IsAny())) - .ReturnsAsync(_loadBalancer.Object); - } - - private void TheLoadBalancerFactoryIsCalledCorrectly() - { - _loadBalancerFactory - .Verify(x => x.Get(It.IsAny()), Times.Once); - } - - private void ThenTheLoadBalancerHouseIsCalledCorrectly() - { - _loadBalancerHouse - .Verify(x => x.Add(It.IsAny(), _loadBalancer.Object), Times.Once); + _lbCreator.Verify(x => x.SetupLoadBalancer(It.IsAny()), Times.Once); } private void GivenTheQosProviderFactoryReturns()