riversong code showcase
This commit is contained in:
53
Source/Engine/Core/ServiceLocator.cs
Normal file
53
Source/Engine/Core/ServiceLocator.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user