mirror of
https://github.com/nsnail/Ocelot.git
synced 2025-04-23 00:32:50 +08:00
allow to add delegating handlers by type (#943)
This commit is contained in:
parent
c08f873dab
commit
176a7bb960
@ -1,6 +1,7 @@
|
||||
using Microsoft.Extensions.Configuration;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Ocelot.Middleware.Multiplexer;
|
||||
using System;
|
||||
using System.Net.Http;
|
||||
|
||||
namespace Ocelot.DependencyInjection
|
||||
@ -13,6 +14,8 @@ namespace Ocelot.DependencyInjection
|
||||
|
||||
IMvcCoreBuilder MvcCoreBuilder { get; }
|
||||
|
||||
IOcelotBuilder AddDelegatingHandler(Type type, bool global = false);
|
||||
|
||||
IOcelotBuilder AddDelegatingHandler<T>(bool global = false)
|
||||
where T : DelegatingHandler;
|
||||
|
||||
|
@ -35,6 +35,7 @@ namespace Ocelot.DependencyInjection
|
||||
using Ocelot.Security;
|
||||
using Ocelot.Security.IPSecurity;
|
||||
using Ocelot.ServiceDiscovery;
|
||||
using System;
|
||||
using System.Net.Http;
|
||||
using System.Reflection;
|
||||
|
||||
@ -165,6 +166,28 @@ namespace Ocelot.DependencyInjection
|
||||
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)
|
||||
where THandler : DelegatingHandler
|
||||
{
|
||||
|
@ -47,6 +47,17 @@ namespace Ocelot.UnitTests.DependencyInjection
|
||||
.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]
|
||||
public void should_add_global_delegating_handlers_transient()
|
||||
{
|
||||
@ -58,6 +69,17 @@ namespace Ocelot.UnitTests.DependencyInjection
|
||||
.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]
|
||||
public void should_set_up_services()
|
||||
{
|
||||
@ -156,6 +178,16 @@ namespace Ocelot.UnitTests.DependencyInjection
|
||||
_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>()
|
||||
{
|
||||
_serviceProvider = _services.BuildServiceProvider();
|
||||
|
Loading…
x
Reference in New Issue
Block a user