From 0430e5d9e54493878393afb2babc89c56389734b Mon Sep 17 00:00:00 2001 From: Mikhail <99481254+DCFApixels@users.noreply.github.com> Date: Sat, 7 Sep 2024 19:07:47 +0800 Subject: [PATCH] update injector --- src/Injections/Injector.cs | 54 ++++++++++++++++-------------- src/Injections/Utils/Interfaces.cs | 25 ++++++++++++-- 2 files changed, 52 insertions(+), 27 deletions(-) diff --git a/src/Injections/Injector.cs b/src/Injections/Injector.cs index 48c1ae5..072a007 100644 --- a/src/Injections/Injector.cs +++ b/src/Injections/Injector.cs @@ -5,28 +5,6 @@ using System.Runtime.CompilerServices; namespace DCFApixels.DragonECS { - [MetaName(nameof(Inject))] - [MetaColor(MetaColor.DragonRose)] - [MetaGroup(EcsConsts.PACK_GROUP, EcsConsts.DI_GROUP)] - [MetaDescription(EcsConsts.AUTHOR, "The interface of the dependency injection process.")] - public interface IEcsInject : IEcsProcess - { - void Inject(T obj); - } - [MetaName(nameof(OnInitInjectionComplete))] - [MetaColor(MetaColor.DragonRose)] - [MetaGroup(EcsConsts.PACK_GROUP, EcsConsts.DI_GROUP)] - [MetaDescription(EcsConsts.AUTHOR, "The process interface that signals the completion of injection during pipeline initialization via the EcsPipeline.Init() method.")] - public interface IOnInitInjectionComplete : IEcsProcess - { - void OnInitInjectionComplete(); - } - - public interface IInjector - { - void Inject(T obj); - T Extract(); - } public class Injector : IInjector { private EcsPipeline _pipeline; @@ -175,7 +153,7 @@ namespace DCFApixels.DragonECS return true; } - public class Builder + public class Builder : IInjector { private EcsPipeline.Builder _source; private Injector _instance; @@ -195,6 +173,21 @@ namespace DCFApixels.DragonECS _initInjections.Add(new InitInject(obj)); return _source; } + public EcsPipeline.Builder Extract(ref T obj) + { + Type type = typeof(T); + for (int i = _initInjections.Count - 1; i >= 0; i--) + { + var item = _initInjections[i]; + if (item.Type.IsAssignableFrom(type)) + { + obj = (T)item.Raw; + return _source; + } + } + Throw.UndefinedException(); + return _source; + } public Injector Build(EcsPipeline pipeline) { _instance.Init(pipeline); @@ -216,13 +209,25 @@ namespace DCFApixels.DragonECS } } + void IInjector.Inject(T obj) { Inject(obj); } + T IInjector.Extract() + { + T result = default; + Extract(ref result); + return result; + } + private abstract class InitInjectBase { + public abstract Type Type { get; } + public abstract object Raw { get; } public abstract void InjectTo(Injector instance); } private sealed class InitInject : InitInjectBase { private T _injectedData; + public override Type Type { get { return typeof(T); } } + public override object Raw { get { return _injectedData; } } public InitInject(T injectedData) { _injectedData = injectedData; @@ -235,5 +240,4 @@ namespace DCFApixels.DragonECS } #endregion } -} - +} \ No newline at end of file diff --git a/src/Injections/Utils/Interfaces.cs b/src/Injections/Utils/Interfaces.cs index 51791f6..3bb4402 100644 --- a/src/Injections/Utils/Interfaces.cs +++ b/src/Injections/Utils/Interfaces.cs @@ -1,5 +1,26 @@ namespace DCFApixels.DragonECS { + [MetaName(nameof(Inject))] + [MetaColor(MetaColor.DragonRose)] + [MetaGroup(EcsConsts.PACK_GROUP, EcsConsts.DI_GROUP)] + [MetaDescription(EcsConsts.AUTHOR, "The interface of the dependency injection process.")] + public interface IEcsInject : IEcsProcess + { + void Inject(T obj); + } + [MetaName(nameof(OnInitInjectionComplete))] + [MetaColor(MetaColor.DragonRose)] + [MetaGroup(EcsConsts.PACK_GROUP, EcsConsts.DI_GROUP)] + [MetaDescription(EcsConsts.AUTHOR, "The process interface that signals the completion of injection during pipeline initialization via the EcsPipeline.Init() method.")] + public interface IOnInitInjectionComplete : IEcsProcess + { + void OnInitInjectionComplete(); + } + public interface IInjector + { + void Inject(T obj); + T Extract(); + } public interface IInjectionBlock { void InjectTo(Injector inj); @@ -7,11 +28,11 @@ public readonly struct InjectionBranchIniter { private readonly Injector _injector; - public InjectionBranchIniter(Injector injector) + internal InjectionBranchIniter(Injector injector) { _injector = injector; } - public void AddNode() + public void AddNode(T obj = default) { _injector.AddNode(); }