From de9593c0e7206189fc2b3ded585390a53f75405b Mon Sep 17 00:00:00 2001 From: Leon Friedrich <60421075+ElectroJr@users.noreply.github.com> Date: Fri, 3 Oct 2025 03:32:56 +1300 Subject: [PATCH] Remove static IoC from client & server EntryPoint (#40562) * Remove static IoC from client & server EntryPoint * Fix missing log manager initialization * file namespace --- Content.Client/Entry/EntryPoint.cs | 11 +- Content.Client/IoC/ClientContentIoC.cs | 6 +- Content.Server/Entry/EntryPoint.cs | 215 +++++++++++++------------ Content.Server/IoC/ServerContentIoC.cs | 96 +++++------ Content.Shared/Entry/EntryPoint.cs | 1 - Content.Shared/IoC/SharedContentIoC.cs | 6 +- Content.Tests/ContentUnitTest.cs | 9 +- 7 files changed, 178 insertions(+), 166 deletions(-) diff --git a/Content.Client/Entry/EntryPoint.cs b/Content.Client/Entry/EntryPoint.cs index a458e24aed..f35272b63a 100644 --- a/Content.Client/Entry/EntryPoint.cs +++ b/Content.Client/Entry/EntryPoint.cs @@ -77,18 +77,21 @@ namespace Content.Client.Entry [Dependency] private readonly IEntitySystemManager _entitySystemManager = default!; [Dependency] private readonly ClientsidePlaytimeTrackingManager _clientsidePlaytimeManager = default!; - public override void Init() + public override void PreInit() { - ClientContentIoC.Register(); + ClientContentIoC.Register(Dependencies); foreach (var callback in TestingCallbacks) { var cast = (ClientModuleTestingCallbacks) callback; cast.ClientBeforeIoC?.Invoke(); } + } - IoCManager.BuildGraph(); - IoCManager.InjectDependencies(this); + public override void Init() + { + Dependencies.BuildGraph(); + Dependencies.InjectDependencies(this); _contentLoc.Initialize(); _componentFactory.DoAutoRegistrations(); diff --git a/Content.Client/IoC/ClientContentIoC.cs b/Content.Client/IoC/ClientContentIoC.cs index ed2199bb81..8f81f90311 100644 --- a/Content.Client/IoC/ClientContentIoC.cs +++ b/Content.Client/IoC/ClientContentIoC.cs @@ -23,6 +23,7 @@ using Content.Client.Lobby; using Content.Client.Players.RateLimiting; using Content.Shared.Administration.Managers; using Content.Shared.Chat; +using Content.Shared.IoC; using Content.Shared.Players.PlayTimeTracking; using Content.Shared.Players.RateLimiting; @@ -30,10 +31,9 @@ namespace Content.Client.IoC { internal static class ClientContentIoC { - public static void Register() + public static void Register(IDependencyCollection collection) { - var collection = IoCManager.Instance!; - + SharedContentIoC.Register(collection); collection.Register(); collection.Register(); collection.Register(); diff --git a/Content.Server/Entry/EntryPoint.cs b/Content.Server/Entry/EntryPoint.cs index df4af14f1e..7ebb546879 100644 --- a/Content.Server/Entry/EntryPoint.cs +++ b/Content.Server/Entry/EntryPoint.cs @@ -15,8 +15,6 @@ using Content.Server.Info; using Content.Server.IoC; using Content.Server.Maps; using Content.Server.NodeContainer.NodeGroups; -using Content.Server.Objectives; -using Content.Server.Players; using Content.Server.Players.JobWhitelist; using Content.Server.Players.PlayTimeTracking; using Content.Server.Players.RateLimiting; @@ -42,124 +40,131 @@ namespace Content.Server.Entry internal const string ConfigPresetsDir = "/ConfigPresets/"; private const string ConfigPresetsDirBuild = $"{ConfigPresetsDir}Build/"; - private EuiManager _euiManager = default!; - private IVoteManager _voteManager = default!; - private ServerUpdateManager _updateManager = default!; - private PlayTimeTrackingManager? _playTimeTracking; - private IEntitySystemManager? _sysMan; - private IServerDbManager? _dbManager; - private IWatchlistWebhookManager _watchlistWebhookManager = default!; - private IConnectionManager? _connectionManager; + [Dependency] private readonly CVarControlManager _cvarCtrl = default!; + [Dependency] private readonly ContentLocalizationManager _loc = default!; + [Dependency] private readonly ContentNetworkResourceManager _netResMan = default!; + [Dependency] private readonly DiscordChatLink _discordChatLink = default!; + [Dependency] private readonly DiscordLink _discordLink = default!; + [Dependency] private readonly EuiManager _euiManager = default!; + [Dependency] private readonly GhostKickManager _ghostKick = default!; + [Dependency] private readonly IAdminManager _admin = default!; + [Dependency] private readonly IAdminLogManager _adminLog = default!; + [Dependency] private readonly IAfkManager _afk = default!; + [Dependency] private readonly IBanManager _ban = default!; + [Dependency] private readonly IChatManager _chatSan = default!; + [Dependency] private readonly IChatSanitizationManager _chat = default!; + [Dependency] private readonly IComponentFactory _factory = default!; + [Dependency] private readonly IConfigurationManager _cfg = default!; + [Dependency] private readonly IConnectionManager _connection = default!; + [Dependency] private readonly IEntitySystemManager _entSys = default!; + [Dependency] private readonly IGameMapManager _gameMap = default!; + [Dependency] private readonly ILogManager _log = default!; + [Dependency] private readonly INodeGroupFactory _nodeFactory = default!; + [Dependency] private readonly IPrototypeManager _proto = default!; + [Dependency] private readonly IResourceManager _res = default!; + [Dependency] private readonly IServerDbManager _dbManager = default!; + [Dependency] private readonly IServerPreferencesManager _preferences = default!; + [Dependency] private readonly IStatusHost _host = default!; + [Dependency] private readonly IVoteManager _voteManager = default!; + [Dependency] private readonly IWatchlistWebhookManager _watchlistWebhookManager = default!; + [Dependency] private readonly JobWhitelistManager _job = default!; + [Dependency] private readonly MultiServerKickManager _multiServerKick = default!; + [Dependency] private readonly PlayTimeTrackingManager _playTimeTracking = default!; + [Dependency] private readonly PlayerRateLimitManager _rateLimit = default!; + [Dependency] private readonly RecipeManager _recipe = default!; + [Dependency] private readonly RulesManager _rules = default!; + [Dependency] private readonly ServerApi _serverApi = default!; + [Dependency] private readonly ServerInfoManager _serverInfo = default!; + [Dependency] private readonly ServerUpdateManager _updateManager = default!; + + public override void PreInit() + { + ServerContentIoC.Register(Dependencies); + foreach (var callback in TestingCallbacks) + { + var cast = (ServerModuleTestingCallbacks)callback; + cast.ServerBeforeIoC?.Invoke(); + } + } /// public override void Init() { base.Init(); + Dependencies.BuildGraph(); + Dependencies.InjectDependencies(this); - var cfg = IoCManager.Resolve(); - var res = IoCManager.Resolve(); - var logManager = IoCManager.Resolve(); - - LoadConfigPresets(cfg, res, logManager.GetSawmill("configpreset")); + LoadConfigPresets(_cfg, _res, _log.GetSawmill("configpreset")); - var aczProvider = new ContentMagicAczProvider(IoCManager.Resolve()); - IoCManager.Resolve().SetMagicAczProvider(aczProvider); + var aczProvider = new ContentMagicAczProvider(Dependencies); + _host.SetMagicAczProvider(aczProvider); - var factory = IoCManager.Resolve(); - var prototypes = IoCManager.Resolve(); + _factory.DoAutoRegistrations(); + _factory.IgnoreMissingComponents("Visuals"); + _factory.RegisterIgnore(IgnoredComponents.List); + _factory.GenerateNetIds(); - factory.DoAutoRegistrations(); - factory.IgnoreMissingComponents("Visuals"); + _proto.RegisterIgnore("parallax"); - factory.RegisterIgnore(IgnoredComponents.List); + _loc.Initialize(); - prototypes.RegisterIgnore("parallax"); - - ServerContentIoC.Register(); - - foreach (var callback in TestingCallbacks) - { - var cast = (ServerModuleTestingCallbacks) callback; - cast.ServerBeforeIoC?.Invoke(); - } - - IoCManager.BuildGraph(); - factory.GenerateNetIds(); - var configManager = IoCManager.Resolve(); - var dest = configManager.GetCVar(CCVars.DestinationFile); - IoCManager.Resolve().Initialize(); - if (string.IsNullOrEmpty(dest)) //hacky but it keeps load times for the generator down. - { - _euiManager = IoCManager.Resolve(); - _voteManager = IoCManager.Resolve(); - _updateManager = IoCManager.Resolve(); - _playTimeTracking = IoCManager.Resolve(); - _connectionManager = IoCManager.Resolve(); - _sysMan = IoCManager.Resolve(); - _dbManager = IoCManager.Resolve(); - _watchlistWebhookManager = IoCManager.Resolve(); - - logManager.GetSawmill("Storage").Level = LogLevel.Info; - logManager.GetSawmill("db.ef").Level = LogLevel.Info; - - IoCManager.Resolve().Initialize(); - IoCManager.Resolve().Initialize(); - _dbManager.Init(); - IoCManager.Resolve().Init(); - IoCManager.Resolve().Initialize(); - IoCManager.Resolve().Initialize(); - IoCManager.Resolve().Initialize(); - IoCManager.Resolve().Initialize(); - IoCManager.Resolve().Initialize(); - - _voteManager.Initialize(); - _updateManager.Initialize(); - _playTimeTracking.Initialize(); - _watchlistWebhookManager.Initialize(); - IoCManager.Resolve().Initialize(); - IoCManager.Resolve().Initialize(); - } + var dest = _cfg.GetCVar(CCVars.DestinationFile); + if (!string.IsNullOrEmpty(dest)) + return; //hacky but it keeps load times for the generator down. + + _log.GetSawmill("Storage").Level = LogLevel.Info; + _log.GetSawmill("db.ef").Level = LogLevel.Info; + + _adminLog.Initialize(); + _connection.Initialize(); + _dbManager.Init(); + _preferences.Init(); + _nodeFactory.Initialize(); + _netResMan.Initialize(); + _ghostKick.Initialize(); + _serverInfo.Initialize(); + _serverApi.Initialize(); + _voteManager.Initialize(); + _updateManager.Initialize(); + _playTimeTracking.Initialize(); + _watchlistWebhookManager.Initialize(); + _job.Initialize(); + _rateLimit.Initialize(); } public override void PostInit() { base.PostInit(); - IoCManager.Resolve().Initialize(); - IoCManager.Resolve().Initialize(); - var configManager = IoCManager.Resolve(); - var resourceManager = IoCManager.Resolve(); - var dest = configManager.GetCVar(CCVars.DestinationFile); + _chatSan.Initialize(); + _chat.Initialize(); + var dest = _cfg.GetCVar(CCVars.DestinationFile); if (!string.IsNullOrEmpty(dest)) { var resPath = new ResPath(dest).ToRootedPath(); - var file = resourceManager.UserData.OpenWriteText(resPath.WithName("chem_" + dest)); + var file = _res.UserData.OpenWriteText(resPath.WithName("chem_" + dest)); ChemistryJsonGenerator.PublishJson(file); file.Flush(); - file = resourceManager.UserData.OpenWriteText(resPath.WithName("react_" + dest)); + file = _res.UserData.OpenWriteText(resPath.WithName("react_" + dest)); ReactionJsonGenerator.PublishJson(file); file.Flush(); - IoCManager.Resolve().Shutdown("Data generation done"); - } - else - { - IoCManager.Resolve().Initialize(); - IoCManager.Resolve().Initialize(); - IoCManager.Resolve().Initialize(); - IoCManager.Resolve().Initialize(); - - IoCManager.Resolve().Initialize(); - IoCManager.Resolve().Initialize(); - - _euiManager.Initialize(); - - IoCManager.Resolve().Initialize(); - IoCManager.Resolve().GetEntitySystem().PostInitialize(); - IoCManager.Resolve().Initialize(); - IoCManager.Resolve().PostInit(); - IoCManager.Resolve().Initialize(); - IoCManager.Resolve().Initialize(); + Dependencies.Resolve().Shutdown("Data generation done"); + return; } + + _recipe.Initialize(); + _admin.Initialize(); + _afk.Initialize(); + _rules.Initialize(); + _discordLink.Initialize(); + _discordChatLink.Initialize(); + _euiManager.Initialize(); + _gameMap.Initialize(); + _entSys.GetEntitySystem().PostInitialize(); + _ban.Initialize(); + _connection.PostInit(); + _multiServerKick.Initialize(); + _cvarCtrl.Initialize(); } public override void Update(ModUpdateLevel level, FrameEventArgs frameEventArgs) @@ -177,21 +182,27 @@ namespace Content.Server.Entry case ModUpdateLevel.FramePostEngine: _updateManager.Update(); - _playTimeTracking?.Update(); + _playTimeTracking.Update(); _watchlistWebhookManager.Update(); - _connectionManager?.Update(); + _connection.Update(); break; } } protected override void Dispose(bool disposing) { - _playTimeTracking?.Shutdown(); - _dbManager?.Shutdown(); - IoCManager.Resolve().Shutdown(); + var dest = _cfg.GetCVar(CCVars.DestinationFile); + if (!string.IsNullOrEmpty(dest)) + { + _playTimeTracking.Shutdown(); + _dbManager.Shutdown(); + } + + _serverApi.Shutdown(); - IoCManager.Resolve().Shutdown(); - IoCManager.Resolve().Shutdown(); + // TODO Should this be awaited? + _discordLink.Shutdown(); + _discordChatLink.Shutdown(); } private static void LoadConfigPresets(IConfigurationManager cfg, IResourceManager res, ISawmill sawmill) diff --git a/Content.Server/IoC/ServerContentIoC.cs b/Content.Server/IoC/ServerContentIoC.cs index b4d999bef4..b6b5316da7 100644 --- a/Content.Server/IoC/ServerContentIoC.cs +++ b/Content.Server/IoC/ServerContentIoC.cs @@ -26,59 +26,59 @@ using Content.Server.Worldgen.Tools; using Content.Shared.Administration.Logs; using Content.Shared.Administration.Managers; using Content.Shared.Chat; +using Content.Shared.IoC; using Content.Shared.Kitchen; using Content.Shared.Players.PlayTimeTracking; using Content.Shared.Players.RateLimiting; -namespace Content.Server.IoC +namespace Content.Server.IoC; + +internal static class ServerContentIoC { - internal static class ServerContentIoC + public static void Register(IDependencyCollection deps) { - public static void Register() - { - IoCManager.Register(); - IoCManager.Register(); - IoCManager.Register(); - IoCManager.Register(); - IoCManager.Register(); - IoCManager.Register(); - IoCManager.Register(); - IoCManager.Register(); - IoCManager.Register(); - IoCManager.Register(); - IoCManager.Register(); - IoCManager.Register(); - IoCManager.Register(); - IoCManager.Register(); - IoCManager.Register(); - IoCManager.Register(); - IoCManager.Register(); - IoCManager.Register(); - IoCManager.Register(); - IoCManager.Register(); - IoCManager.Register(); - IoCManager.Register(); - IoCManager.Register(); - IoCManager.Register(); - IoCManager.Register(); - IoCManager.Register(); - IoCManager.Register(); - IoCManager.Register(); - IoCManager.Register(); - IoCManager.Register(); - IoCManager.Register(); - IoCManager.Register(); - IoCManager.Register(); - IoCManager.Register(); - IoCManager.Register(); - IoCManager.Register(); - IoCManager.Register(); - IoCManager.Register(); - IoCManager.Register(); - IoCManager.Register(); - - IoCManager.Register(); - IoCManager.Register(); - } + SharedContentIoC.Register(deps); + deps.Register(); + deps.Register(); + deps.Register(); + deps.Register(); + deps.Register(); + deps.Register(); + deps.Register(); + deps.Register(); + deps.Register(); + deps.Register(); + deps.Register(); + deps.Register(); + deps.Register(); + deps.Register(); + deps.Register(); + deps.Register(); + deps.Register(); + deps.Register(); + deps.Register(); + deps.Register(); + deps.Register(); + deps.Register(); + deps.Register(); + deps.Register(); + deps.Register(); + deps.Register(); + deps.Register(); + deps.Register(); + deps.Register(); + deps.Register(); + deps.Register(); + deps.Register(); + deps.Register(); + deps.Register(); + deps.Register(); + deps.Register(); + deps.Register(); + deps.Register(); + deps.Register(); + deps.Register(); + deps.Register(); + deps.Register(); } } diff --git a/Content.Shared/Entry/EntryPoint.cs b/Content.Shared/Entry/EntryPoint.cs index df267b08cb..db8d6a6abd 100644 --- a/Content.Shared/Entry/EntryPoint.cs +++ b/Content.Shared/Entry/EntryPoint.cs @@ -27,7 +27,6 @@ namespace Content.Shared.Entry public override void PreInit() { IoCManager.InjectDependencies(this); - SharedContentIoC.Register(); } public override void Shutdown() diff --git a/Content.Shared/IoC/SharedContentIoC.cs b/Content.Shared/IoC/SharedContentIoC.cs index c20cdbc111..f23b9f8355 100644 --- a/Content.Shared/IoC/SharedContentIoC.cs +++ b/Content.Shared/IoC/SharedContentIoC.cs @@ -5,10 +5,10 @@ namespace Content.Shared.IoC { public static class SharedContentIoC { - public static void Register() + public static void Register(IDependencyCollection deps) { - IoCManager.Register(); - IoCManager.Register(); + deps.Register(); + deps.Register(); } } } diff --git a/Content.Tests/ContentUnitTest.cs b/Content.Tests/ContentUnitTest.cs index 827c4e2f43..18938ac4ea 100644 --- a/Content.Tests/ContentUnitTest.cs +++ b/Content.Tests/ContentUnitTest.cs @@ -2,8 +2,8 @@ using System.Collections.Generic; using System.Reflection; using Content.Client.IoC; using Content.Server.IoC; -using Content.Shared.IoC; using Robust.Shared.Analyzers; +using Robust.Shared.IoC; using Robust.UnitTesting; using EntryPoint = Content.Server.Entry.EntryPoint; @@ -15,16 +15,15 @@ namespace Content.Tests protected override void OverrideIoC() { base.OverrideIoC(); - - SharedContentIoC.Register(); + var dependencies = IoCManager.Instance!; if (Project == UnitTestProject.Server) { - ServerContentIoC.Register(); + ServerContentIoC.Register(dependencies); } else if (Project == UnitTestProject.Client) { - ClientContentIoC.Register(); + ClientContentIoC.Register(dependencies); } } -- 2.51.2