diff --git a/Runtime/ServiceLocator.cs b/Runtime/ServiceLocator.cs index 25c07db..a3cd782 100644 --- a/Runtime/ServiceLocator.cs +++ b/Runtime/ServiceLocator.cs @@ -11,6 +11,7 @@ public interface IService { } public static class ServiceLocator { + public delegate void ServiceCallback(T service, bool registered); private delegate void ServiceLocatorDelegate(IService service, bool registered); private static readonly Dictionary k_Services = new(); @@ -55,7 +56,7 @@ public static bool Unregister(T service) where T : class, IService return false; } - private static bool TryGetService(out T result) where T : class, IService + public static bool TryGetService(out T result) where T : class, IService { if (k_Services.TryGetValue(typeof(T), out var service)) { @@ -67,7 +68,7 @@ private static bool TryGetService(out T result) where T : class, IService return false; } - public static void AddServiceListener(Action serviceCallback) where T : class, IService + public static void AddServiceListener(ServiceCallback serviceCallback) where T : class, IService { if (k_RegisteredCallbacks.ContainsKey(serviceCallback)) { @@ -75,6 +76,7 @@ public static void AddServiceListener(Action serviceCallback) where return; } + // If the service is registered immediately notify the listener if (TryGetService(out var service)) { serviceCallback.Invoke(service, true); @@ -96,13 +98,20 @@ public static void AddServiceListener(Action serviceCallback) where k_RegisteredCallbacks.Add(serviceCallback, callbackWrapper); } - public static void RemoveServiceListener(Action serviceCallback) where T : class, IService + public static void RemoveServiceListener(ServiceCallback serviceCallback) where T : class, IService { if (!k_RegisteredCallbacks.TryGetValue(serviceCallback, out var callbackWrapper)) { return; } + // If the service is registered immediately notify the listener + if (TryGetService(out var service)) + { + // behave as if the service unregistered. + callbackWrapper.Invoke(service, false); + } + var type = typeof(T); if (k_Callbacks.ContainsKey(type))