update injector

This commit is contained in:
Mikhail 2024-09-07 19:07:47 +08:00
parent acfb902dbe
commit 0430e5d9e5
2 changed files with 52 additions and 27 deletions

View File

@ -5,28 +5,6 @@ using System.Runtime.CompilerServices;
namespace DCFApixels.DragonECS 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<T> : 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>(T obj);
T Extract<T>();
}
public class Injector : IInjector public class Injector : IInjector
{ {
private EcsPipeline _pipeline; private EcsPipeline _pipeline;
@ -175,7 +153,7 @@ namespace DCFApixels.DragonECS
return true; return true;
} }
public class Builder public class Builder : IInjector
{ {
private EcsPipeline.Builder _source; private EcsPipeline.Builder _source;
private Injector _instance; private Injector _instance;
@ -195,6 +173,21 @@ namespace DCFApixels.DragonECS
_initInjections.Add(new InitInject<T>(obj)); _initInjections.Add(new InitInject<T>(obj));
return _source; return _source;
} }
public EcsPipeline.Builder Extract<T>(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) public Injector Build(EcsPipeline pipeline)
{ {
_instance.Init(pipeline); _instance.Init(pipeline);
@ -216,13 +209,25 @@ namespace DCFApixels.DragonECS
} }
} }
void IInjector.Inject<T>(T obj) { Inject(obj); }
T IInjector.Extract<T>()
{
T result = default;
Extract(ref result);
return result;
}
private abstract class InitInjectBase private abstract class InitInjectBase
{ {
public abstract Type Type { get; }
public abstract object Raw { get; }
public abstract void InjectTo(Injector instance); public abstract void InjectTo(Injector instance);
} }
private sealed class InitInject<T> : InitInjectBase private sealed class InitInject<T> : InitInjectBase
{ {
private T _injectedData; private T _injectedData;
public override Type Type { get { return typeof(T); } }
public override object Raw { get { return _injectedData; } }
public InitInject(T injectedData) public InitInject(T injectedData)
{ {
_injectedData = injectedData; _injectedData = injectedData;
@ -236,4 +241,3 @@ namespace DCFApixels.DragonECS
#endregion #endregion
} }
} }

View File

@ -1,5 +1,26 @@
namespace DCFApixels.DragonECS 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<T> : 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>(T obj);
T Extract<T>();
}
public interface IInjectionBlock public interface IInjectionBlock
{ {
void InjectTo(Injector inj); void InjectTo(Injector inj);
@ -7,11 +28,11 @@
public readonly struct InjectionBranchIniter public readonly struct InjectionBranchIniter
{ {
private readonly Injector _injector; private readonly Injector _injector;
public InjectionBranchIniter(Injector injector) internal InjectionBranchIniter(Injector injector)
{ {
_injector = injector; _injector = injector;
} }
public void AddNode<T>() public void AddNode<T>(T obj = default)
{ {
_injector.AddNode<T>(); _injector.AddNode<T>();
} }