Files
caliverse_server/MatchServer/MatchServerExtensions.cs
2025-11-28 16:54:56 +09:00

90 lines
3.4 KiB
C#

using System.Reflection;
using ControlCenter.NamedPipeHost.Extensions;
using ControlCenter.NamedPipeHost.Manager;
using MatchServer;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using NLog.Extensions.Logging;
using ServerBase;
using ServerCommon;
using ServerCore;
using StackExchange.Redis;
public static class MatchServerExtensions
{
public static void AddNLog(this HostApplicationBuilder builder)
{
builder.Logging.ClearProviders();
builder.Logging.AddNLog(Log.NLogFileName);
}
public static void AddMatchServerService(this IServiceCollection services, string[] args)
{
services.AddSingleton<MatchServerService>();
services.AddSingleton<ServerConfig>(x =>
{
var server = x.GetRequiredService<MatchServerService>();
return server.MatchServerLogic.getServerConfig();
});
services.AddSingleton<DynamoDbClient>(x =>
{
var server = x.GetRequiredService<MatchServerService>();
return server.MatchServerLogic.getDynamoDbClient();
});
services.AddSingleton<RedisConnector>(x =>
{
var server = x.GetRequiredService<MatchServerService>();
return server.MatchServerLogic.getRedisConnector();
});
services.AddSingleton<IDatabase>(x =>
{
var server = x.GetRequiredService<MatchServerService>();
return server.MatchServerLogic.getRedisConnector().getDatabase();
});
services.AddSingleton<IMatchMq>(x =>
{
var server = x.GetRequiredService<MatchServerService>();
return server.MatchServerLogic.getRabbitMqConnector() as RabbitMq4Match;
});
services.AddTransient<GameInstanceRoomStorage>();
services.AddSingleton<IMatchMetaManager, MatchMetaManager>();
services.AddSingleton<MatchUserRepository>();
services.AddSingleton<MatchRoomRepository>();
services.AddSingleton<MatchService>();
// Factories
services.AddSingleton<IMatchGroupProcessorFactory, MatchGroupProcessorFactory>();
services.AddSingleton<IMatchProcessorFactory, MatchProcessorFactory>();
services.AddSingleton<IMatchRoomFactory, MatchRoomFactory>();
services.AddSingleton<InstanceRoomRepo>();
// 인던 서버 정보
services.AddSingleton<IServerInfoProvider>(x => x.GetRequiredService<MatchServerService>());
// 게임 이벤트 관리
services.AddSingleton<GameEventManager>();
// BackgroundService
services.AddHostedService<GameEventCheckWorker>();
}
public static void UseMatchServerService(this IHost app, string[] args)
{
var server = app.Services.GetRequiredService<MatchServerService>();
_ = server.Run(args);
server.WaitOnStart().Wait();
var serviceProvider = app.Services;
// Mq의 핸들러에 강제 주입을 위해 정의함
ServiceProviderHelper.SetServiceProvider(serviceProvider);
// 호스트 시작 종료 콜백 처리
serviceProvider.GetRequiredService<IHostApplicationLifetime>().ApplicationStarted.Register(() =>
{
var logger = Log.getLogger();
logger.info($"Match Server Service Started");
});
serviceProvider.GetRequiredService<IHostApplicationLifetime>().ApplicationStopped.Register(Log.shutdown);
}
}