Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 11 additions & 8 deletions src/SuperSocket.Server/Host/MultipleServerHostBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -106,10 +106,10 @@ public static MultipleServerHostBuilder Create(string[] args)
return new MultipleServerHostBuilder(args);
}

private ServerHostBuilderAdapter<TReceivePackage> CreateServerHostBuilder<TReceivePackage>(Action<SuperSocketHostBuilder<TReceivePackage>> hostBuilderDelegate)
private ServerHostBuilderAdapter<TReceivePackage> CreateServerHostBuilder<TReceivePackage>(Action<SuperSocketHostBuilder<TReceivePackage>> hostBuilderDelegate, string serverName = null)
where TReceivePackage : class
{
var hostBuilder = new ServerHostBuilderAdapter<TReceivePackage>(this);
var hostBuilder = new ServerHostBuilderAdapter<TReceivePackage>(this, serverName);
hostBuilderDelegate(hostBuilder);
return hostBuilder;
}
Expand All @@ -119,11 +119,12 @@ private ServerHostBuilderAdapter<TReceivePackage> CreateServerHostBuilder<TRecei
/// </summary>
/// <typeparam name="TReceivePackage">The type of the package received by the server.</typeparam>
/// <param name="hostBuilderDelegate">The action to configure the server host builder.</param>
/// <param name="serverName">The optional server name for keyed service registration. Use this to register multiple instances of the same server type.</param>
/// <returns>The updated host builder.</returns>
public MultipleServerHostBuilder AddServer<TReceivePackage>(Action<ISuperSocketHostBuilder<TReceivePackage>> hostBuilderDelegate)
public MultipleServerHostBuilder AddServer<TReceivePackage>(Action<ISuperSocketHostBuilder<TReceivePackage>> hostBuilderDelegate, string serverName = null)
where TReceivePackage : class
{
var hostBuilder = CreateServerHostBuilder<TReceivePackage>(hostBuilderDelegate);
var hostBuilder = CreateServerHostBuilder<TReceivePackage>(hostBuilderDelegate, serverName);
_hostBuilderAdapters.Add(hostBuilder);
return this;
}
Expand All @@ -134,12 +135,13 @@ public MultipleServerHostBuilder AddServer<TReceivePackage>(Action<ISuperSocketH
/// <typeparam name="TReceivePackage">The type of the package received by the server.</typeparam>
/// <typeparam name="TPipelineFilter">The type of the pipeline filter.</typeparam>
/// <param name="hostBuilderDelegate">The action to configure the server host builder.</param>
/// <param name="serverName">The optional server name for keyed service registration. Use this to register multiple instances of the same server type.</param>
/// <returns>The updated host builder.</returns>
public MultipleServerHostBuilder AddServer<TReceivePackage, TPipelineFilter>(Action<ISuperSocketHostBuilder<TReceivePackage>> hostBuilderDelegate)
public MultipleServerHostBuilder AddServer<TReceivePackage, TPipelineFilter>(Action<ISuperSocketHostBuilder<TReceivePackage>> hostBuilderDelegate, string serverName = null)
where TReceivePackage : class
where TPipelineFilter : class, IPipelineFilter<TReceivePackage>
{
var hostBuilder = CreateServerHostBuilder<TReceivePackage>(hostBuilderDelegate);
var hostBuilder = CreateServerHostBuilder<TReceivePackage>(hostBuilderDelegate, serverName);
_hostBuilderAdapters.Add(hostBuilder);
hostBuilder.UsePipelineFilter<TPipelineFilter>();
return this;
Expand All @@ -163,13 +165,14 @@ public MultipleServerHostBuilder AddServer(IServerHostBuilderAdapter hostBuilder
/// <typeparam name="TReceivePackage">The type of the package received by the server.</typeparam>
/// <typeparam name="TPipelineFilter">The type of the pipeline filter.</typeparam>
/// <param name="hostBuilderDelegate">The action to configure the server host builder.</param>
/// <param name="serverName">The optional server name for keyed service registration. Use this to register multiple instances of the same server type.</param>
/// <returns>The updated host builder.</returns>
public MultipleServerHostBuilder AddServer<TSuperSocketService, TReceivePackage, TPipelineFilter>(Action<SuperSocketHostBuilder<TReceivePackage>> hostBuilderDelegate)
public MultipleServerHostBuilder AddServer<TSuperSocketService, TReceivePackage, TPipelineFilter>(Action<SuperSocketHostBuilder<TReceivePackage>> hostBuilderDelegate, string serverName = null)
where TReceivePackage : class
where TPipelineFilter : class, IPipelineFilter<TReceivePackage>
where TSuperSocketService : SuperSocketService<TReceivePackage>
{
var hostBuilder = CreateServerHostBuilder<TReceivePackage>(hostBuilderDelegate);
var hostBuilder = CreateServerHostBuilder<TReceivePackage>(hostBuilderDelegate, serverName);

_hostBuilderAdapters.Add(hostBuilder);

Expand Down
36 changes: 34 additions & 2 deletions src/SuperSocket.Server/Host/ServerHostBuilderAdapter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
using System.Linq;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using SuperSocket.Server.Abstractions;
Expand All @@ -28,14 +29,18 @@ public class ServerHostBuilderAdapter<TReceivePackage> : SuperSocketHostBuilder<

private List<IConfigureContainerAdapter> _configureContainerActions = new List<IConfigureContainerAdapter>();

private string _serverName;

/// <summary>
/// Initializes a new instance of the <see cref="ServerHostBuilderAdapter{TReceivePackage}"/> class.
/// </summary>
/// <param name="hostBuilder">The host builder to adapt.</param>
public ServerHostBuilderAdapter(IHostBuilder hostBuilder)
/// <param name="serverName">The optional server name for keyed service registration.</param>
public ServerHostBuilderAdapter(IHostBuilder hostBuilder, string serverName = null)
: base(hostBuilder)
{
_hostBuilder = hostBuilder;
_serverName = serverName;
}

/// <summary>
Expand All @@ -57,6 +62,20 @@ protected void ConfigureServer(HostBuilderContext context, IServiceCollection ho
{
var services = _currentServices;

// If a server name is provided, configure server options and register the server name
if (!string.IsNullOrEmpty(_serverName))
{
this.ConfigureServerOptions((ctx, options) =>
{
return options.GetSection(_serverName);
});

services.PostConfigure<ServerOptions>(options =>
{
options.Name = _serverName;
});
}

CopyGlobalServices(hostServices, services);

RegisterBasicServices(context, hostServices, services);
Expand Down Expand Up @@ -179,7 +198,20 @@ protected override void RegisterHostedService<THostedService>(IServiceCollection
{
_currentServices.AddSingleton<IHostedService, THostedService>();
_currentServices.AddSingleton<IServerInfo>(s => s.GetService<IHostedService>() as IServerInfo);
servicesInHost.AddHostedService<THostedService>(s => GetHostedService<THostedService>());

if (_serverName != null)
{
// Register as keyed service
servicesInHost.AddKeyedSingleton<IHostedService>(_serverName, (s, k) => GetHostedService<THostedService>());
servicesInHost.AddKeyedSingleton<THostedService>(_serverName, (s, k) => GetHostedService<THostedService>());
servicesInHost.AddKeyedSingleton<IServerInfo>(_serverName, (s, k) => GetHostedService<THostedService>() as IServerInfo);
servicesInHost.AddSingleton<IHostedService>(_ => GetHostedService<THostedService>());
servicesInHost.AddSingleton<THostedService>(_ => GetHostedService<THostedService>());
}
else
{
servicesInHost.AddHostedService<THostedService>(s => GetHostedService<THostedService>());
}
}

/// <summary>
Expand Down
Loading
Loading