riversong code showcase

This commit is contained in:
Daniele Marotta
2026-05-21 15:52:18 +02:00
commit 4c9eea1c02
462 changed files with 23406 additions and 0 deletions

View File

@@ -0,0 +1,53 @@
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;
}
}
}
}