allow to add delegating handlers by type (#943)

This commit is contained in:
Marcelo Castagna 2019-07-01 08:23:06 -03:00 committed by GitHub
parent c08f873dab
commit 176a7bb960
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 58 additions and 0 deletions

View File

@ -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;

View File

@ -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
{ {

View File

@ -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();