Remove static IoC from client & server EntryPoint (#40562)

* Remove static IoC from client & server EntryPoint

* Fix missing log manager initialization

* file namespace
This commit is contained in:
Leon Friedrich
2025-10-03 03:32:56 +13:00
committed by GitHub
parent 368d4dd273
commit de9593c0e7
7 changed files with 176 additions and 164 deletions

View File

@@ -77,18 +77,21 @@ namespace Content.Client.Entry
[Dependency] private readonly IEntitySystemManager _entitySystemManager = default!; [Dependency] private readonly IEntitySystemManager _entitySystemManager = default!;
[Dependency] private readonly ClientsidePlaytimeTrackingManager _clientsidePlaytimeManager = 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) foreach (var callback in TestingCallbacks)
{ {
var cast = (ClientModuleTestingCallbacks) callback; var cast = (ClientModuleTestingCallbacks) callback;
cast.ClientBeforeIoC?.Invoke(); cast.ClientBeforeIoC?.Invoke();
} }
}
IoCManager.BuildGraph(); public override void Init()
IoCManager.InjectDependencies(this); {
Dependencies.BuildGraph();
Dependencies.InjectDependencies(this);
_contentLoc.Initialize(); _contentLoc.Initialize();
_componentFactory.DoAutoRegistrations(); _componentFactory.DoAutoRegistrations();

View File

@@ -23,6 +23,7 @@ using Content.Client.Lobby;
using Content.Client.Players.RateLimiting; using Content.Client.Players.RateLimiting;
using Content.Shared.Administration.Managers; using Content.Shared.Administration.Managers;
using Content.Shared.Chat; using Content.Shared.Chat;
using Content.Shared.IoC;
using Content.Shared.Players.PlayTimeTracking; using Content.Shared.Players.PlayTimeTracking;
using Content.Shared.Players.RateLimiting; using Content.Shared.Players.RateLimiting;
@@ -30,10 +31,9 @@ namespace Content.Client.IoC
{ {
internal static class ClientContentIoC internal static class ClientContentIoC
{ {
public static void Register() public static void Register(IDependencyCollection collection)
{ {
var collection = IoCManager.Instance!; SharedContentIoC.Register(collection);
collection.Register<IParallaxManager, ParallaxManager>(); collection.Register<IParallaxManager, ParallaxManager>();
collection.Register<GeneratedParallaxCache>(); collection.Register<GeneratedParallaxCache>();
collection.Register<IChatManager, ChatManager>(); collection.Register<IChatManager, ChatManager>();

View File

@@ -15,8 +15,6 @@ using Content.Server.Info;
using Content.Server.IoC; using Content.Server.IoC;
using Content.Server.Maps; using Content.Server.Maps;
using Content.Server.NodeContainer.NodeGroups; using Content.Server.NodeContainer.NodeGroups;
using Content.Server.Objectives;
using Content.Server.Players;
using Content.Server.Players.JobWhitelist; using Content.Server.Players.JobWhitelist;
using Content.Server.Players.PlayTimeTracking; using Content.Server.Players.PlayTimeTracking;
using Content.Server.Players.RateLimiting; using Content.Server.Players.RateLimiting;
@@ -42,124 +40,131 @@ namespace Content.Server.Entry
internal const string ConfigPresetsDir = "/ConfigPresets/"; internal const string ConfigPresetsDir = "/ConfigPresets/";
private const string ConfigPresetsDirBuild = $"{ConfigPresetsDir}Build/"; private const string ConfigPresetsDirBuild = $"{ConfigPresetsDir}Build/";
private EuiManager _euiManager = default!; [Dependency] private readonly CVarControlManager _cvarCtrl = default!;
private IVoteManager _voteManager = default!; [Dependency] private readonly ContentLocalizationManager _loc = default!;
private ServerUpdateManager _updateManager = default!; [Dependency] private readonly ContentNetworkResourceManager _netResMan = default!;
private PlayTimeTrackingManager? _playTimeTracking; [Dependency] private readonly DiscordChatLink _discordChatLink = default!;
private IEntitySystemManager? _sysMan; [Dependency] private readonly DiscordLink _discordLink = default!;
private IServerDbManager? _dbManager; [Dependency] private readonly EuiManager _euiManager = default!;
private IWatchlistWebhookManager _watchlistWebhookManager = default!; [Dependency] private readonly GhostKickManager _ghostKick = default!;
private IConnectionManager? _connectionManager; [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();
}
}
/// <inheritdoc /> /// <inheritdoc />
public override void Init() public override void Init()
{ {
base.Init(); base.Init();
Dependencies.BuildGraph();
Dependencies.InjectDependencies(this);
var cfg = IoCManager.Resolve<IConfigurationManager>(); LoadConfigPresets(_cfg, _res, _log.GetSawmill("configpreset"));
var res = IoCManager.Resolve<IResourceManager>();
var logManager = IoCManager.Resolve<ILogManager>();
LoadConfigPresets(cfg, res, logManager.GetSawmill("configpreset")); var aczProvider = new ContentMagicAczProvider(Dependencies);
_host.SetMagicAczProvider(aczProvider);
var aczProvider = new ContentMagicAczProvider(IoCManager.Resolve<IDependencyCollection>()); _factory.DoAutoRegistrations();
IoCManager.Resolve<IStatusHost>().SetMagicAczProvider(aczProvider); _factory.IgnoreMissingComponents("Visuals");
_factory.RegisterIgnore(IgnoredComponents.List);
_factory.GenerateNetIds();
var factory = IoCManager.Resolve<IComponentFactory>(); _proto.RegisterIgnore("parallax");
var prototypes = IoCManager.Resolve<IPrototypeManager>();
factory.DoAutoRegistrations(); _loc.Initialize();
factory.IgnoreMissingComponents("Visuals");
factory.RegisterIgnore(IgnoredComponents.List); var dest = _cfg.GetCVar(CCVars.DestinationFile);
if (!string.IsNullOrEmpty(dest))
return; //hacky but it keeps load times for the generator down.
prototypes.RegisterIgnore("parallax"); _log.GetSawmill("Storage").Level = LogLevel.Info;
_log.GetSawmill("db.ef").Level = LogLevel.Info;
ServerContentIoC.Register(); _adminLog.Initialize();
_connection.Initialize();
foreach (var callback in TestingCallbacks) _dbManager.Init();
{ _preferences.Init();
var cast = (ServerModuleTestingCallbacks) callback; _nodeFactory.Initialize();
cast.ServerBeforeIoC?.Invoke(); _netResMan.Initialize();
} _ghostKick.Initialize();
_serverInfo.Initialize();
IoCManager.BuildGraph(); _serverApi.Initialize();
factory.GenerateNetIds(); _voteManager.Initialize();
var configManager = IoCManager.Resolve<IConfigurationManager>(); _updateManager.Initialize();
var dest = configManager.GetCVar(CCVars.DestinationFile); _playTimeTracking.Initialize();
IoCManager.Resolve<ContentLocalizationManager>().Initialize(); _watchlistWebhookManager.Initialize();
if (string.IsNullOrEmpty(dest)) //hacky but it keeps load times for the generator down. _job.Initialize();
{ _rateLimit.Initialize();
_euiManager = IoCManager.Resolve<EuiManager>();
_voteManager = IoCManager.Resolve<IVoteManager>();
_updateManager = IoCManager.Resolve<ServerUpdateManager>();
_playTimeTracking = IoCManager.Resolve<PlayTimeTrackingManager>();
_connectionManager = IoCManager.Resolve<IConnectionManager>();
_sysMan = IoCManager.Resolve<IEntitySystemManager>();
_dbManager = IoCManager.Resolve<IServerDbManager>();
_watchlistWebhookManager = IoCManager.Resolve<IWatchlistWebhookManager>();
logManager.GetSawmill("Storage").Level = LogLevel.Info;
logManager.GetSawmill("db.ef").Level = LogLevel.Info;
IoCManager.Resolve<IAdminLogManager>().Initialize();
IoCManager.Resolve<IConnectionManager>().Initialize();
_dbManager.Init();
IoCManager.Resolve<IServerPreferencesManager>().Init();
IoCManager.Resolve<INodeGroupFactory>().Initialize();
IoCManager.Resolve<ContentNetworkResourceManager>().Initialize();
IoCManager.Resolve<GhostKickManager>().Initialize();
IoCManager.Resolve<ServerInfoManager>().Initialize();
IoCManager.Resolve<ServerApi>().Initialize();
_voteManager.Initialize();
_updateManager.Initialize();
_playTimeTracking.Initialize();
_watchlistWebhookManager.Initialize();
IoCManager.Resolve<JobWhitelistManager>().Initialize();
IoCManager.Resolve<PlayerRateLimitManager>().Initialize();
}
} }
public override void PostInit() public override void PostInit()
{ {
base.PostInit(); base.PostInit();
IoCManager.Resolve<IChatSanitizationManager>().Initialize(); _chatSan.Initialize();
IoCManager.Resolve<IChatManager>().Initialize(); _chat.Initialize();
var configManager = IoCManager.Resolve<IConfigurationManager>(); var dest = _cfg.GetCVar(CCVars.DestinationFile);
var resourceManager = IoCManager.Resolve<IResourceManager>();
var dest = configManager.GetCVar(CCVars.DestinationFile);
if (!string.IsNullOrEmpty(dest)) if (!string.IsNullOrEmpty(dest))
{ {
var resPath = new ResPath(dest).ToRootedPath(); 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); ChemistryJsonGenerator.PublishJson(file);
file.Flush(); file.Flush();
file = resourceManager.UserData.OpenWriteText(resPath.WithName("react_" + dest)); file = _res.UserData.OpenWriteText(resPath.WithName("react_" + dest));
ReactionJsonGenerator.PublishJson(file); ReactionJsonGenerator.PublishJson(file);
file.Flush(); file.Flush();
IoCManager.Resolve<IBaseServer>().Shutdown("Data generation done"); Dependencies.Resolve<IBaseServer>().Shutdown("Data generation done");
return;
} }
else
{
IoCManager.Resolve<RecipeManager>().Initialize();
IoCManager.Resolve<IAdminManager>().Initialize();
IoCManager.Resolve<IAfkManager>().Initialize();
IoCManager.Resolve<RulesManager>().Initialize();
IoCManager.Resolve<DiscordLink>().Initialize(); _recipe.Initialize();
IoCManager.Resolve<DiscordChatLink>().Initialize(); _admin.Initialize();
_afk.Initialize();
_euiManager.Initialize(); _rules.Initialize();
_discordLink.Initialize();
IoCManager.Resolve<IGameMapManager>().Initialize(); _discordChatLink.Initialize();
IoCManager.Resolve<IEntitySystemManager>().GetEntitySystem<GameTicker>().PostInitialize(); _euiManager.Initialize();
IoCManager.Resolve<IBanManager>().Initialize(); _gameMap.Initialize();
IoCManager.Resolve<IConnectionManager>().PostInit(); _entSys.GetEntitySystem<GameTicker>().PostInitialize();
IoCManager.Resolve<MultiServerKickManager>().Initialize(); _ban.Initialize();
IoCManager.Resolve<CVarControlManager>().Initialize(); _connection.PostInit();
} _multiServerKick.Initialize();
_cvarCtrl.Initialize();
} }
public override void Update(ModUpdateLevel level, FrameEventArgs frameEventArgs) public override void Update(ModUpdateLevel level, FrameEventArgs frameEventArgs)
@@ -177,21 +182,27 @@ namespace Content.Server.Entry
case ModUpdateLevel.FramePostEngine: case ModUpdateLevel.FramePostEngine:
_updateManager.Update(); _updateManager.Update();
_playTimeTracking?.Update(); _playTimeTracking.Update();
_watchlistWebhookManager.Update(); _watchlistWebhookManager.Update();
_connectionManager?.Update(); _connection.Update();
break; break;
} }
} }
protected override void Dispose(bool disposing) protected override void Dispose(bool disposing)
{ {
_playTimeTracking?.Shutdown(); var dest = _cfg.GetCVar(CCVars.DestinationFile);
_dbManager?.Shutdown(); if (!string.IsNullOrEmpty(dest))
IoCManager.Resolve<ServerApi>().Shutdown(); {
_playTimeTracking.Shutdown();
_dbManager.Shutdown();
}
IoCManager.Resolve<DiscordLink>().Shutdown(); _serverApi.Shutdown();
IoCManager.Resolve<DiscordChatLink>().Shutdown();
// TODO Should this be awaited?
_discordLink.Shutdown();
_discordChatLink.Shutdown();
} }
private static void LoadConfigPresets(IConfigurationManager cfg, IResourceManager res, ISawmill sawmill) private static void LoadConfigPresets(IConfigurationManager cfg, IResourceManager res, ISawmill sawmill)

View File

@@ -26,59 +26,59 @@ using Content.Server.Worldgen.Tools;
using Content.Shared.Administration.Logs; using Content.Shared.Administration.Logs;
using Content.Shared.Administration.Managers; using Content.Shared.Administration.Managers;
using Content.Shared.Chat; using Content.Shared.Chat;
using Content.Shared.IoC;
using Content.Shared.Kitchen; using Content.Shared.Kitchen;
using Content.Shared.Players.PlayTimeTracking; using Content.Shared.Players.PlayTimeTracking;
using Content.Shared.Players.RateLimiting; using Content.Shared.Players.RateLimiting;
namespace Content.Server.IoC namespace Content.Server.IoC;
{
internal static class ServerContentIoC
{
public static void Register()
{
IoCManager.Register<IChatManager, ChatManager>();
IoCManager.Register<ISharedChatManager, ChatManager>();
IoCManager.Register<IChatSanitizationManager, ChatSanitizationManager>();
IoCManager.Register<IServerPreferencesManager, ServerPreferencesManager>();
IoCManager.Register<IServerDbManager, ServerDbManager>();
IoCManager.Register<RecipeManager, RecipeManager>();
IoCManager.Register<INodeGroupFactory, NodeGroupFactory>();
IoCManager.Register<IConnectionManager, ConnectionManager>();
IoCManager.Register<ServerUpdateManager>();
IoCManager.Register<IAdminManager, AdminManager>();
IoCManager.Register<ISharedAdminManager, AdminManager>();
IoCManager.Register<EuiManager, EuiManager>();
IoCManager.Register<IVoteManager, VoteManager>();
IoCManager.Register<IPlayerLocator, PlayerLocator>();
IoCManager.Register<IAfkManager, AfkManager>();
IoCManager.Register<IGameMapManager, GameMapManager>();
IoCManager.Register<RulesManager, RulesManager>();
IoCManager.Register<IBanManager, BanManager>();
IoCManager.Register<ContentNetworkResourceManager>();
IoCManager.Register<IAdminNotesManager, AdminNotesManager>();
IoCManager.Register<GhostKickManager>();
IoCManager.Register<ISharedAdminLogManager, AdminLogManager>();
IoCManager.Register<IAdminLogManager, AdminLogManager>();
IoCManager.Register<PlayTimeTrackingManager>();
IoCManager.Register<UserDbDataManager>();
IoCManager.Register<ServerInfoManager>();
IoCManager.Register<PoissonDiskSampler>();
IoCManager.Register<DiscordWebhook>();
IoCManager.Register<VoteWebhooks>();
IoCManager.Register<ServerDbEntryManager>();
IoCManager.Register<ISharedPlaytimeManager, PlayTimeTrackingManager>();
IoCManager.Register<ServerApi>();
IoCManager.Register<JobWhitelistManager>();
IoCManager.Register<PlayerRateLimitManager>();
IoCManager.Register<SharedPlayerRateLimitManager, PlayerRateLimitManager>();
IoCManager.Register<MappingManager>();
IoCManager.Register<IWatchlistWebhookManager, WatchlistWebhookManager>();
IoCManager.Register<ConnectionManager>();
IoCManager.Register<MultiServerKickManager>();
IoCManager.Register<CVarControlManager>();
IoCManager.Register<DiscordLink>(); internal static class ServerContentIoC
IoCManager.Register<DiscordChatLink>(); {
} public static void Register(IDependencyCollection deps)
{
SharedContentIoC.Register(deps);
deps.Register<IChatManager, ChatManager>();
deps.Register<ISharedChatManager, ChatManager>();
deps.Register<IChatSanitizationManager, ChatSanitizationManager>();
deps.Register<IServerPreferencesManager, ServerPreferencesManager>();
deps.Register<IServerDbManager, ServerDbManager>();
deps.Register<RecipeManager, RecipeManager>();
deps.Register<INodeGroupFactory, NodeGroupFactory>();
deps.Register<IConnectionManager, ConnectionManager>();
deps.Register<ServerUpdateManager>();
deps.Register<IAdminManager, AdminManager>();
deps.Register<ISharedAdminManager, AdminManager>();
deps.Register<EuiManager, EuiManager>();
deps.Register<IVoteManager, VoteManager>();
deps.Register<IPlayerLocator, PlayerLocator>();
deps.Register<IAfkManager, AfkManager>();
deps.Register<IGameMapManager, GameMapManager>();
deps.Register<RulesManager, RulesManager>();
deps.Register<IBanManager, BanManager>();
deps.Register<ContentNetworkResourceManager>();
deps.Register<IAdminNotesManager, AdminNotesManager>();
deps.Register<GhostKickManager>();
deps.Register<ISharedAdminLogManager, AdminLogManager>();
deps.Register<IAdminLogManager, AdminLogManager>();
deps.Register<PlayTimeTrackingManager>();
deps.Register<UserDbDataManager>();
deps.Register<ServerInfoManager>();
deps.Register<PoissonDiskSampler>();
deps.Register<DiscordWebhook>();
deps.Register<VoteWebhooks>();
deps.Register<ServerDbEntryManager>();
deps.Register<ISharedPlaytimeManager, PlayTimeTrackingManager>();
deps.Register<ServerApi>();
deps.Register<JobWhitelistManager>();
deps.Register<PlayerRateLimitManager>();
deps.Register<SharedPlayerRateLimitManager, PlayerRateLimitManager>();
deps.Register<MappingManager>();
deps.Register<IWatchlistWebhookManager, WatchlistWebhookManager>();
deps.Register<ConnectionManager>();
deps.Register<MultiServerKickManager>();
deps.Register<CVarControlManager>();
deps.Register<DiscordLink>();
deps.Register<DiscordChatLink>();
} }
} }

View File

@@ -27,7 +27,6 @@ namespace Content.Shared.Entry
public override void PreInit() public override void PreInit()
{ {
IoCManager.InjectDependencies(this); IoCManager.InjectDependencies(this);
SharedContentIoC.Register();
} }
public override void Shutdown() public override void Shutdown()

View File

@@ -5,10 +5,10 @@ namespace Content.Shared.IoC
{ {
public static class SharedContentIoC public static class SharedContentIoC
{ {
public static void Register() public static void Register(IDependencyCollection deps)
{ {
IoCManager.Register<MarkingManager, MarkingManager>(); deps.Register<MarkingManager, MarkingManager>();
IoCManager.Register<ContentLocalizationManager, ContentLocalizationManager>(); deps.Register<ContentLocalizationManager, ContentLocalizationManager>();
} }
} }
} }

View File

@@ -2,8 +2,8 @@ using System.Collections.Generic;
using System.Reflection; using System.Reflection;
using Content.Client.IoC; using Content.Client.IoC;
using Content.Server.IoC; using Content.Server.IoC;
using Content.Shared.IoC;
using Robust.Shared.Analyzers; using Robust.Shared.Analyzers;
using Robust.Shared.IoC;
using Robust.UnitTesting; using Robust.UnitTesting;
using EntryPoint = Content.Server.Entry.EntryPoint; using EntryPoint = Content.Server.Entry.EntryPoint;
@@ -15,16 +15,15 @@ namespace Content.Tests
protected override void OverrideIoC() protected override void OverrideIoC()
{ {
base.OverrideIoC(); base.OverrideIoC();
var dependencies = IoCManager.Instance!;
SharedContentIoC.Register();
if (Project == UnitTestProject.Server) if (Project == UnitTestProject.Server)
{ {
ServerContentIoC.Register(); ServerContentIoC.Register(dependencies);
} }
else if (Project == UnitTestProject.Client) else if (Project == UnitTestProject.Client)
{ {
ClientContentIoC.Register(); ClientContentIoC.Register(dependencies);
} }
} }