53 lines
1.6 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|
|
} |