From 569e14f50f5f4448c6bde914c3f0d97e3668c91b Mon Sep 17 00:00:00 2001 From: MapleWheels Date: Tue, 30 Dec 2025 12:00:14 -0500 Subject: [PATCH] - Removed generic exception from LuaCsSetup.cs services retrival, replaced with exception propagation. - Fixed `PerScopeLifetime` and `Transient` lifetimes for container services. --- .../SharedSource/LuaCs/LuaCsSetup.cs | 33 +++++++--------- .../LuaCs/Services/ServicesProvider.cs | 38 ++++++++++++------- .../Services/_Interfaces/IServicesProvider.cs | 7 ++++ 3 files changed, 46 insertions(+), 32 deletions(-) diff --git a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsSetup.cs b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsSetup.cs index 691486a54..030427c3f 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsSetup.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsSetup.cs @@ -111,25 +111,20 @@ namespace Barotrauma */ private readonly IServicesProvider _servicesProvider; - - public PerformanceCounterService PerformanceCounter => _servicesProvider.TryGetService(out var svc) - ? svc : throw new NullReferenceException("Performance counter service not found!"); - public ILoggerService Logger => _servicesProvider.TryGetService(out var svc) - ? svc : throw new NullReferenceException("Logger service not found!"); - public IConfigService ConfigService => _servicesProvider.TryGetService(out var svc) - ? svc : throw new NullReferenceException("Config Manager service not found!"); - public IPackageManagementService PackageManagementService => _servicesProvider.TryGetService(out var svc) - ? svc : throw new NullReferenceException("Package Manager service not found!"); - public IPluginManagementService PluginManagementService => _servicesProvider.TryGetService(out var svc) - ? svc : throw new NullReferenceException("Plugin Manager service not found!"); - public ILuaScriptManagementService LuaScriptManagementService => _servicesProvider.TryGetService(out var svc) - ? svc : throw new NullReferenceException("Lua Script Manager service not found!"); - public INetworkingService NetworkingService => _servicesProvider.TryGetService(out var svc) - ? svc : throw new NullReferenceException("Networking Manager service not found!"); - public IEventService EventService => _servicesProvider.TryGetService(out var svc) - ? svc : throw new NullReferenceException("Networking Manager service not found!"); - public LuaGame Game => _servicesProvider.TryGetService(out var svc) - ? svc : throw new NullReferenceException("LuaGame service not found!"); + + public PerformanceCounterService PerformanceCounter => + _servicesProvider.GetService(); + public ILoggerService Logger => _servicesProvider.GetService(); + public IConfigService ConfigService => _servicesProvider.GetService(); + public IPackageManagementService PackageManagementService => + _servicesProvider.GetService(); + public IPluginManagementService PluginManagementService => + _servicesProvider.GetService(); + public ILuaScriptManagementService LuaScriptManagementService => + _servicesProvider.GetService(); + public INetworkingService NetworkingService => _servicesProvider.GetService(); + public IEventService EventService => _servicesProvider.GetService(); + public LuaGame Game => _servicesProvider.GetService(); /* * === Config Vars diff --git a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Services/ServicesProvider.cs b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Services/ServicesProvider.cs index 9b2c6420b..17213a0cf 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Services/ServicesProvider.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Services/ServicesProvider.cs @@ -11,18 +11,14 @@ namespace Barotrauma.LuaCs.Services; public class ServicesProvider : IServicesProvider { private ServiceContainer _serviceContainerInst; - private ServiceContainer ServiceContainer - { - get - { - // ReSharper disable once ConvertIfStatementToNullCoalescingExpression - if (_serviceContainerInst is null) - _serviceContainerInst = new ServiceContainer(); - return _serviceContainerInst; - } - } + private ServiceContainer ServiceContainer => _serviceContainerInst; private readonly ReaderWriterLockSlim _serviceLock = new(); + + public ServicesProvider() + { + _serviceContainerInst = new ServiceContainer(); + } public void RegisterServiceType(ServiceLifetime lifetime, ILifetime lifetimeInstance = null) where TSvcInterface : class, IService where TService : class, IService, TSvcInterface { @@ -39,9 +35,9 @@ public class ServicesProvider : IServicesProvider // treat these as transient case ServiceLifetime.Transient: case ServiceLifetime.Invalid: - case ServiceLifetime.Custom: // lifetime should not be null here + case ServiceLifetime.Custom: default: - lifetimeInstance = new PerRequestLifeTime(); + lifetimeInstance = null; break; } } @@ -49,7 +45,10 @@ public class ServicesProvider : IServicesProvider try { _serviceLock.EnterReadLock(); - ServiceContainer.Register(lifetimeInstance); + if (lifetimeInstance is not null) + ServiceContainer.Register(lifetimeInstance); + else + ServiceContainer.Register(); OnServiceRegistered?.Invoke(typeof(TSvcInterface), typeof(TService)); } finally @@ -145,6 +144,19 @@ public class ServicesProvider : IServicesProvider } } + public TSvcInterface GetService() where TSvcInterface : class, IService + { + try + { + _serviceLock.EnterReadLock(); + return ServiceContainer.GetInstance(); + } + finally + { + _serviceLock.ExitReadLock(); + } + } + public bool TryGetService(string name, out TSvcInterface service) where TSvcInterface : class, IService { try diff --git a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Services/_Interfaces/IServicesProvider.cs b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Services/_Interfaces/IServicesProvider.cs index 40dd31e6c..cce7a24c7 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Services/_Interfaces/IServicesProvider.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Services/_Interfaces/IServicesProvider.cs @@ -62,6 +62,13 @@ public interface IServicesProvider /// bool TryGetService(out TSvcInterface service) where TSvcInterface : class, IService; + /// + /// Tries to get a service for the given interface, throws an exception upon failure. + /// + /// + /// + TSvcInterface GetService() where TSvcInterface : class, IService; + /// /// Tries to get a service for the given name and interface, returns success/failure. ///