mirror of
https://github.com/nsnail/Ocelot.git
synced 2025-04-22 18:22:49 +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.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();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user