Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions KludgeBox/DI/Requests/RequestsScanner.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
using KludgeBox.DI.Requests.MpSyncInjection;
using KludgeBox.DI.Requests.NotNullCheck;
using KludgeBox.DI.Requests.ParentInjection;
using KludgeBox.DI.Requests.SceneServiceInjection;
using KludgeBox.Reflection.Access;

namespace KludgeBox.DI.Requests;
Expand All @@ -21,6 +22,7 @@ public static RequestsScanner CreateDefault()
{
var scanner = new RequestsScanner();
scanner.RegisterRequestScanner(new LoggerInjectionRequestScanner());
scanner.RegisterRequestScanner(new SceneServiceInjectionRequestScanner());
scanner.RegisterRequestScanner(new DependencyCreationRequestScanner());
scanner.RegisterRequestScanner(new ChildInjectionRequestScanner());
scanner.RegisterRequestScanner(new ParentInjectionRequestScanner());
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
namespace KludgeBox.DI.Requests.SceneServiceInjection;

public interface ISceneServiceProvider
{
/// <summary>
/// Returns service of specified type if found in scene or null.
/// </summary>
/// <param name="serviceType">Type of required service</param>
/// <returns></returns>
object GetService(Type serviceType);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
using Godot;
using KludgeBox.Reflection.Access;

namespace KludgeBox.DI.Requests.SceneServiceInjection;

public class SceneServiceInjectionRequest : IProcessingRequest
{

private readonly IMemberAccessor _memberAccessor;
private readonly Type _serviceType;

public SceneServiceInjectionRequest(IMemberAccessor memberAccessor, Type serviceType)
{
_memberAccessor = memberAccessor;
_serviceType = serviceType;
}


public void ProcessOnInstance(object instance)
{
var nodeInstance = (Node)instance; // All checks are done in scanner
var serviceType = _serviceType ?? _memberAccessor.ValueType;
var service = GetService(serviceType, nodeInstance);

if (service is null)
{
throw new InvalidOperationException($"Service of type {serviceType} not found for node {nodeInstance.GetPath()}@{nodeInstance.GetType().Name}.");
}

_memberAccessor.SetValue(instance, service);
}

private object GetService(Type serviceType, Node possibleServiceProvider)
{
object foundService = null;

if (possibleServiceProvider is ISceneServiceProvider serviceProvider)
{
foundService = serviceProvider.GetService(serviceType);
}

if (foundService is not null)
{
return foundService;
}

var parent = possibleServiceProvider.GetParent();
if (!parent.IsValid())
{
return null;
}

return GetService(serviceType, parent);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
using Godot;
using KludgeBox.Logging;
using KludgeBox.Reflection.Access;
using Serilog;

namespace KludgeBox.DI.Requests.SceneServiceInjection;

public class SceneServiceInjectionRequestScanner : IProcessingRequestScanner
{

private readonly ILogger _log = LogFactory.GetForStatic<SceneServiceInjectionRequestScanner>();
public bool TryGetRequest(IMemberAccessor accessor, out IProcessingRequest injectionRequest)
{
if (!accessor.TryGetAttribute<SceneServiceAttribute>(out var attribute))
{
injectionRequest = null;
return false;
}

if (!accessor.Member.ReflectedType.IsAssignableTo(typeof(Node)))
{
injectionRequest = null;
return false;
}

injectionRequest = new SceneServiceInjectionRequest(accessor,attribute.ServiceType);
return true;
}
}
13 changes: 13 additions & 0 deletions KludgeBox/DI/Requests/SceneServiceInjection/ServiceAttribute.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
namespace KludgeBox.DI.Requests.SceneServiceInjection;

public class SceneServiceAttribute : Attribute
{
public Type ServiceType { get; }

public SceneServiceAttribute() : this(null) { }

public SceneServiceAttribute(Type serviceType)
{
ServiceType = serviceType;
}
}
4 changes: 2 additions & 2 deletions KludgeBox/KludgeBox.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
Minor - добавление новх фич, запланированое плавное устаревание API
Patch - небольшие фиксы и незначительный функционал
-->
<GeneralVersion>2.2.1</GeneralVersion>
<GeneralVersion>2.3.0</GeneralVersion>

<!--
Пререлизный тег, на случай, когда надо зарелизить что-то, что не должно попасть в релиз
Expand Down Expand Up @@ -40,7 +40,7 @@

<PropertyGroup>
<!-- Базовые настройки проекта -->
<TargetFramework>net8.0</TargetFramework>
<TargetFramework>net10.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>

<!-- Метаданные проекта -->
Expand Down