mirror of
				https://github.com/nsnail/Ocelot.git
				synced 2025-11-04 12:10:50 +08:00 
			
		
		
		
	allow to add delegating handlers by type (#943)
This commit is contained in:
		@@ -1,6 +1,7 @@
 | 
				
			|||||||
using Microsoft.Extensions.Configuration;
 | 
					using Microsoft.Extensions.Configuration;
 | 
				
			||||||
using Microsoft.Extensions.DependencyInjection;
 | 
					using Microsoft.Extensions.DependencyInjection;
 | 
				
			||||||
using Ocelot.Middleware.Multiplexer;
 | 
					using Ocelot.Middleware.Multiplexer;
 | 
				
			||||||
 | 
					using System;
 | 
				
			||||||
using System.Net.Http;
 | 
					using System.Net.Http;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace Ocelot.DependencyInjection
 | 
					namespace Ocelot.DependencyInjection
 | 
				
			||||||
@@ -13,6 +14,8 @@ namespace Ocelot.DependencyInjection
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        IMvcCoreBuilder MvcCoreBuilder { get; }
 | 
					        IMvcCoreBuilder MvcCoreBuilder { get; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        IOcelotBuilder AddDelegatingHandler(Type type, bool global = false);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        IOcelotBuilder AddDelegatingHandler<T>(bool global = false)
 | 
					        IOcelotBuilder AddDelegatingHandler<T>(bool global = false)
 | 
				
			||||||
            where T : DelegatingHandler;
 | 
					            where T : DelegatingHandler;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -35,6 +35,7 @@ namespace Ocelot.DependencyInjection
 | 
				
			|||||||
    using Ocelot.Security;
 | 
					    using Ocelot.Security;
 | 
				
			||||||
    using Ocelot.Security.IPSecurity;
 | 
					    using Ocelot.Security.IPSecurity;
 | 
				
			||||||
    using Ocelot.ServiceDiscovery;
 | 
					    using Ocelot.ServiceDiscovery;
 | 
				
			||||||
 | 
					    using System;
 | 
				
			||||||
    using System.Net.Http;
 | 
					    using System.Net.Http;
 | 
				
			||||||
    using System.Reflection;
 | 
					    using System.Reflection;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -165,6 +166,28 @@ namespace Ocelot.DependencyInjection
 | 
				
			|||||||
            Services.TryAddSingleton<ISecurityPolicy, IPSecurityPolicy>();
 | 
					            Services.TryAddSingleton<ISecurityPolicy, IPSecurityPolicy>();
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public IOcelotBuilder AddDelegatingHandler(Type delegateType, bool global = false)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            if (!typeof(DelegatingHandler).IsAssignableFrom(delegateType)) throw new ArgumentOutOfRangeException(nameof(delegateType), delegateType.Name, "It is not a delegatin handler");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (global)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                Services.AddTransient(delegateType);
 | 
				
			||||||
 | 
					                Services.AddTransient<GlobalDelegatingHandler>(s =>
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    var service = s.GetService(delegateType) as DelegatingHandler;
 | 
				
			||||||
 | 
					                    return new GlobalDelegatingHandler(service);
 | 
				
			||||||
 | 
					                });
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            else
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                Services.AddTransient(typeof(DelegatingHandler), delegateType);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            return this;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        public IOcelotBuilder AddDelegatingHandler<THandler>(bool global = false)
 | 
					        public IOcelotBuilder AddDelegatingHandler<THandler>(bool global = false)
 | 
				
			||||||
            where THandler : DelegatingHandler
 | 
					            where THandler : DelegatingHandler
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -47,6 +47,17 @@ namespace Ocelot.UnitTests.DependencyInjection
 | 
				
			|||||||
                .BDDfy();
 | 
					                .BDDfy();
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void should_add_type_specific_delegating_handlers_transient()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            this.Given(x => WhenISetUpOcelotServices())
 | 
				
			||||||
 | 
					                .When(x => AddTypeSpecificTransientDelegatingHandler(typeof(FakeDelegatingHandler)))
 | 
				
			||||||
 | 
					                .And(x => AddTypeSpecificTransientDelegatingHandler(typeof(FakeDelegatingHandlerTwo)))
 | 
				
			||||||
 | 
					                .Then(x => ThenTheProviderIsRegisteredAndReturnsSpecificHandlers<FakeDelegatingHandler, FakeDelegatingHandlerTwo>())
 | 
				
			||||||
 | 
					                .And(x => ThenTheSpecificHandlersAreTransient())
 | 
				
			||||||
 | 
					                .BDDfy();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        [Fact]
 | 
					        [Fact]
 | 
				
			||||||
        public void should_add_global_delegating_handlers_transient()
 | 
					        public void should_add_global_delegating_handlers_transient()
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
@@ -58,6 +69,17 @@ namespace Ocelot.UnitTests.DependencyInjection
 | 
				
			|||||||
                .BDDfy();
 | 
					                .BDDfy();
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        [Fact]
 | 
				
			||||||
 | 
					        public void should_add_global_type_delegating_handlers_transient()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            this.Given(x => WhenISetUpOcelotServices())
 | 
				
			||||||
 | 
					                .When(x => AddTransientGlobalDelegatingHandler<FakeDelegatingHandler>())
 | 
				
			||||||
 | 
					                .And(x => AddTransientGlobalDelegatingHandler<FakeDelegatingHandlerTwo>())
 | 
				
			||||||
 | 
					                .Then(x => ThenTheProviderIsRegisteredAndReturnsHandlers<FakeDelegatingHandler, FakeDelegatingHandlerTwo>())
 | 
				
			||||||
 | 
					                .And(x => ThenTheGlobalHandlersAreTransient())
 | 
				
			||||||
 | 
					                .BDDfy();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        [Fact]
 | 
					        [Fact]
 | 
				
			||||||
        public void should_set_up_services()
 | 
					        public void should_set_up_services()
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
@@ -156,6 +178,16 @@ namespace Ocelot.UnitTests.DependencyInjection
 | 
				
			|||||||
            _ocelotBuilder.AddDelegatingHandler<T>();
 | 
					            _ocelotBuilder.AddDelegatingHandler<T>();
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        private void AddTypeTransientGlobalDelegatingHandler(Type type)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            _ocelotBuilder.AddDelegatingHandler(type, true);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        private void AddTypeSpecificTransientDelegatingHandler(Type type)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            _ocelotBuilder.AddDelegatingHandler(type);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        private void ThenTheProviderIsRegisteredAndReturnsHandlers<TOne, TWo>()
 | 
					        private void ThenTheProviderIsRegisteredAndReturnsHandlers<TOne, TWo>()
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            _serviceProvider = _services.BuildServiceProvider();
 | 
					            _serviceProvider = _services.BuildServiceProvider();
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user