diff --git a/src/Orleans.Core/Core/DefaultClientServices.cs b/src/Orleans.Core/Core/DefaultClientServices.cs index 2dbff0c82a..0e313f4345 100644 --- a/src/Orleans.Core/Core/DefaultClientServices.cs +++ b/src/Orleans.Core/Core/DefaultClientServices.cs @@ -99,7 +99,11 @@ public static void AddDefaultServices(IClientBuilder builder, IServiceCollection // Networking services.TryAddSingleton(); services.AddSingleton, ConnectionManagerLifecycleAdapter>(); - services.TryAddSingleton(); + + services.AddSingletonKeyedService( + ClientOutboundConnectionFactory.ServicesKey, + (sp, key) => ActivatorUtilities.CreateInstance(sp)); + services.TryAddTransient(sp => ActivatorUtilities.CreateInstance(sp, sp.GetRequiredService>().Value.MaxMessageHeaderSize, sp.GetRequiredService>().Value.MaxMessageBodySize)); diff --git a/src/Orleans.Core/Networking/ClientOutboundConnectionFactory.cs b/src/Orleans.Core/Networking/ClientOutboundConnectionFactory.cs index 26561b0a71..ab7f7d97cd 100644 --- a/src/Orleans.Core/Networking/ClientOutboundConnectionFactory.cs +++ b/src/Orleans.Core/Networking/ClientOutboundConnectionFactory.cs @@ -9,6 +9,7 @@ namespace Orleans.Runtime.Messaging { internal sealed class ClientOutboundConnectionFactory : ConnectionFactory, IConnectionDirectionFeature { + internal static readonly object ServicesKey = new object(); private readonly IServiceProvider serviceProvider; private readonly ClientConnectionOptions clientConnectionOptions; private readonly MessageFactory messageFactory; @@ -22,10 +23,9 @@ public ClientOutboundConnectionFactory( IServiceProvider serviceProvider, IOptions connectionOptions, IOptions clientConnectionOptions, - IConnectionFactory connectionFactory, MessageFactory messageFactory, INetworkingTrace trace) - : base(connectionFactory, serviceProvider, connectionOptions) + : base(serviceProvider.GetRequiredServiceByKey(ServicesKey), serviceProvider, connectionOptions) { this.serviceProvider = serviceProvider; this.clientConnectionOptions = clientConnectionOptions.Value; diff --git a/src/Orleans.Runtime.Abstractions/Configuration/SiloConnectionOptions.cs b/src/Orleans.Runtime.Abstractions/Configuration/SiloConnectionOptions.cs index 48e2aa7378..b4609b1fd2 100644 --- a/src/Orleans.Runtime.Abstractions/Configuration/SiloConnectionOptions.cs +++ b/src/Orleans.Runtime.Abstractions/Configuration/SiloConnectionOptions.cs @@ -1,6 +1,4 @@ using System; -using System.Collections.Generic; -using System.Text; using Microsoft.AspNetCore.Connections; namespace Orleans.Configuration diff --git a/src/Orleans.Runtime/Hosting/DefaultSiloServices.cs b/src/Orleans.Runtime/Hosting/DefaultSiloServices.cs index 0eee655f74..71494c4519 100644 --- a/src/Orleans.Runtime/Hosting/DefaultSiloServices.cs +++ b/src/Orleans.Runtime/Hosting/DefaultSiloServices.cs @@ -351,8 +351,17 @@ internal static void AddDefaultServices(IApplicationPartManager applicationPartM services.TryAddSingleton(); services.AddSingleton, ConnectionManagerLifecycleAdapter>(); services.AddSingleton, SiloConnectionMaintainer>(); - services.TryAddSingleton(); - services.TryAddSingleton(); + + services.AddSingletonKeyedService( + SiloConnectionFactory.ServicesKey, + (sp, key) => ActivatorUtilities.CreateInstance(sp)); + services.AddSingletonKeyedService( + SiloConnectionListener.ServicesKey, + (sp, key) => ActivatorUtilities.CreateInstance(sp)); + services.AddSingletonKeyedService( + GatewayConnectionListener.ServicesKey, + (sp, key) => ActivatorUtilities.CreateInstance(sp)); + services.TryAddTransient(sp => ActivatorUtilities.CreateInstance(sp, sp.GetRequiredService>().Value.MaxMessageHeaderSize, sp.GetRequiredService>().Value.MaxMessageBodySize)); diff --git a/src/Orleans.Runtime/Networking/GatewayConnectionListener.cs b/src/Orleans.Runtime/Networking/GatewayConnectionListener.cs index 8d4ee9c3cb..9e581f62b4 100644 --- a/src/Orleans.Runtime/Networking/GatewayConnectionListener.cs +++ b/src/Orleans.Runtime/Networking/GatewayConnectionListener.cs @@ -11,6 +11,7 @@ namespace Orleans.Runtime.Messaging { internal sealed class GatewayConnectionListener : ConnectionListener, ILifecycleParticipant { + internal static readonly object ServicesKey = new object(); private readonly INetworkingTrace trace; private readonly ILocalSiloDetails localSiloDetails; private readonly IOptions multiClusterOptions; @@ -25,7 +26,6 @@ public GatewayConnectionListener( IServiceProvider serviceProvider, IOptions connectionOptions, IOptions siloConnectionOptions, - IConnectionListenerFactory listenerFactory, MessageFactory messageFactory, OverloadDetector overloadDetector, Gateway gateway, @@ -35,7 +35,7 @@ public GatewayConnectionListener( IOptions endpointOptions, MessageCenter messageCenter, ConnectionManager connectionManager) - : base(serviceProvider, listenerFactory, connectionOptions, connectionManager, trace) + : base(serviceProvider, serviceProvider.GetRequiredServiceByKey(ServicesKey), connectionOptions, connectionManager, trace) { this.siloConnectionOptions = siloConnectionOptions.Value; this.messageFactory = messageFactory; diff --git a/src/Orleans.Runtime/Networking/SiloConnectionFactory.cs b/src/Orleans.Runtime/Networking/SiloConnectionFactory.cs index fab41833e6..ead12a39a8 100644 --- a/src/Orleans.Runtime/Networking/SiloConnectionFactory.cs +++ b/src/Orleans.Runtime/Networking/SiloConnectionFactory.cs @@ -10,6 +10,7 @@ namespace Orleans.Runtime.Messaging { internal sealed class SiloConnectionFactory : ConnectionFactory { + internal static readonly object ServicesKey = new object(); private readonly INetworkingTrace trace; private readonly ILocalSiloDetails localSiloDetails; private readonly IServiceProvider serviceProvider; @@ -25,11 +26,10 @@ public SiloConnectionFactory( IServiceProvider serviceProvider, IOptions connectionOptions, IOptions siloConnectionOptions, - IConnectionFactory connectionFactory, MessageFactory messageFactory, INetworkingTrace trace, ILocalSiloDetails localSiloDetails) - : base(connectionFactory, serviceProvider, connectionOptions) + : base(serviceProvider.GetRequiredServiceByKey(ServicesKey), serviceProvider, connectionOptions) { this.serviceProvider = serviceProvider; this.siloConnectionOptions = siloConnectionOptions.Value; diff --git a/src/Orleans.Runtime/Networking/SiloConnectionListener.cs b/src/Orleans.Runtime/Networking/SiloConnectionListener.cs index 157b9bf804..7f22672614 100644 --- a/src/Orleans.Runtime/Networking/SiloConnectionListener.cs +++ b/src/Orleans.Runtime/Networking/SiloConnectionListener.cs @@ -11,6 +11,7 @@ namespace Orleans.Runtime.Messaging { internal sealed class SiloConnectionListener : ConnectionListener, ILifecycleParticipant { + internal static readonly object ServicesKey = new object(); private readonly INetworkingTrace trace; private readonly ILocalSiloDetails localSiloDetails; private readonly SiloConnectionOptions siloConnectionOptions; @@ -23,14 +24,13 @@ public SiloConnectionListener( IServiceProvider serviceProvider, IOptions connectionOptions, IOptions siloConnectionOptions, - IConnectionListenerFactory listenerFactory, MessageCenter messageCenter, MessageFactory messageFactory, INetworkingTrace trace, IOptions endpointOptions, ILocalSiloDetails localSiloDetails, ConnectionManager connectionManager) - : base(serviceProvider, listenerFactory, connectionOptions, connectionManager, trace) + : base(serviceProvider, serviceProvider.GetRequiredServiceByKey(ServicesKey), connectionOptions, connectionManager, trace) { this.siloConnectionOptions = siloConnectionOptions.Value; this.messageCenter = messageCenter;