using System; using System.Collections.Generic; using System.Reflection; using UnityEngine; namespace DanieleMarotta.RiversongCodeShowcase { public class ServiceLocator : IServiceLocator { private Dictionary _services = new(); public void RegisterService(Type serviceType, object service) { _services.Add(serviceType, service); } public object GetService(Type serviceType) { _services.TryGetValue(serviceType, out var service); return service; } public void Inject(object target) { var type = target.GetType(); while (type != typeof(object)) { var bindingAttr = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance; var fields = type.GetFields(bindingAttr); foreach (var field in fields) { var serviceAttribute = field.GetCustomAttribute(); if (serviceAttribute == null) continue; var serviceType = serviceAttribute.ServiceType ?? field.FieldType; var service = GetService(serviceType); if (service == null) { Debug.LogError($"Could not resolve service of type {serviceType} when injecting {type}"); continue; } field.SetValue(target, service); } type = type.BaseType; } } } }