Files
riversong-code-showcase/Source/Engine/Core/ServiceLocator.cs
2026-05-21 16:04:49 +02:00

53 lines
1.6 KiB
C#

using System;
using System.Collections.Generic;
using System.Reflection;
using UnityEngine;
namespace DanieleMarotta.RiversongCodeShowcase
{
public class ServiceLocator : IServiceLocator
{
private Dictionary<Type, object> _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<InjectServiceAttribute>();
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;
}
}
}
}