namespace MrGameEng.Core;
///
/// Minimal service locator used by engine modules to expose their services
/// (input, audio, assets, …) to scenes and systems without coupling modules to each other.
///
public sealed class ServiceRegistry
{
private readonly Dictionary _services = new();
/// Registers a service instance under type . Throws if already registered.
public void Add(T service) where T : class
{
if (!_services.TryAdd(typeof(T), service))
{
throw new InvalidOperationException($"Service of type {typeof(T)} is already registered.");
}
}
/// Returns the registered service of type . Throws if missing.
public T Get() where T : class
{
return _services.TryGetValue(typeof(T), out var service)
? (T)service
: throw new InvalidOperationException($"Service of type {typeof(T)} is not registered.");
}
/// Returns the registered service of type or null.
public T? GetOrDefault() where T : class
{
return _services.TryGetValue(typeof(T), out var service) ? (T)service : null;
}
///
/// Disposes every registered service (each instance once, even
/// when registered under several types) and clears the registry.
/// is skipped. Called on host shutdown.
///
internal void DisposeServices(object? except = null)
{
var disposed = new HashSet