add di for runner

This commit is contained in:
DCFApixels 2025-03-13 20:46:51 +08:00
parent 0f41895093
commit a7d9350332
4 changed files with 54 additions and 26 deletions

View File

@ -32,7 +32,6 @@ namespace DCFApixels.DragonECS
public sealed partial class EcsPipeline
{
private readonly IConfigContainer _configs;
private Injector.Builder _injectorBuilder;
private Injector _injector;
private IEcsProcess[] _allSystems;
@ -79,8 +78,15 @@ namespace DCFApixels.DragonECS
{
_configs = configs;
_allSystems = systems;
_injectorBuilder = injectorBuilder;
_injectorBuilder.Inject(this);
injectorBuilder.Inject(this);
var members = GetProcess<IEcsPipelineMember>();
for (int i = 0; i < members.Length; i++)
{
members[i].Pipeline = this;
}
_injector = injectorBuilder.Build(this);
}
#endregion
@ -130,14 +136,18 @@ namespace DCFApixels.DragonECS
{
return (TRunner)result;
}
TRunner instance = new TRunner();
#if DEBUG
EcsRunner.CheckRunnerTypeIsValide(runnerType, instance.Interface);
TRunner runnerInstance = new TRunner();
#if DEBUG && !DISABLE_DEBUG
EcsRunner.CheckRunnerTypeIsValide(runnerType, runnerInstance.Interface);
#endif
instance.Init_Internal(this);
_runners.Add(runnerType, instance);
_runners.Add(instance.Interface, instance);
return instance;
runnerInstance.Init_Internal(this);
_runners.Add(runnerType, runnerInstance);
_runners.Add(runnerInstance.Interface, runnerInstance);
Injector.ExtractAllTo(runnerInstance);
// init after.
Injector.Inject(runnerInstance);
return runnerInstance;
}
public T GetRunner<T>() where T : IEcsProcess
{
@ -178,13 +188,6 @@ namespace DCFApixels.DragonECS
#if (DEBUG && !DISABLE_DEBUG) || ENABLE_DRAGONECS_ASSERT_CHEKS
_initMarker.Begin();
#endif
var members = GetProcess<IEcsPipelineMember>();
for (int i = 0; i < members.Length; i++)
{
members[i].Pipeline = this;
}
_injector = _injectorBuilder.Build(this);
_injectorBuilder = null;
GetRunnerInstance<EcsPreInitRunner>().PreInit();
GetRunnerInstance<EcsInitRunner>().Init();

View File

@ -6,16 +6,11 @@ namespace DCFApixels.DragonECS
public abstract class InjectionNodeBase
{
private readonly Type _type;
public Type Type
{
get { return _type; }
}
public Type Type { get { return _type; } }
public abstract object CurrentInjectedDependencyRaw { get; }
protected InjectionNodeBase(Type type)
{
_type = type;
}
protected InjectionNodeBase(Type type) { _type = type; }
public abstract void Inject(object obj);
public abstract void ExtractTo(object target);
public abstract void Init(EcsPipeline pipeline);
}
}
@ -23,6 +18,7 @@ namespace DCFApixels.DragonECS.Internal
{
internal sealed class InjectionNode<T> : InjectionNodeBase
{
private EcsPipeline _pipeline;
private EcsProcess<IEcsInject<T>> _process;
private T _currentInjectedDependency;
public sealed override object CurrentInjectedDependencyRaw
@ -38,6 +34,7 @@ namespace DCFApixels.DragonECS.Internal
public InjectionNode() : base(typeof(T)) { }
public sealed override void Init(EcsPipeline pipeline)
{
_pipeline = pipeline;
_process = pipeline.GetProcess<IEcsInject<T>>();
}
public sealed override void Inject(object raw)
@ -48,6 +45,24 @@ namespace DCFApixels.DragonECS.Internal
{
_process[i].Inject(obj);
}
foreach (var runner in _pipeline.AllRunners)
{
ExtractTo_Internal(runner.Value);
}
}
public sealed override void ExtractTo(object target)
{
if (_currentInjectedDependency == null) { return; }
ExtractTo_Internal(target);
}
private void ExtractTo_Internal(object target)
{
var type = target.GetType();
var intrfs = type.GetInterfaces();
if (target is IEcsInject<T> intrf)
{
intrf.Inject(_currentInjectedDependency);
}
}
}
}

View File

@ -62,6 +62,15 @@ namespace DCFApixels.DragonECS
}
branch.Inject(raw);
}
public void ExtractAllTo(object target)
{
if (target is IEcsInjectProcess == false) { return; }
foreach (var node in _nodes)
{
node.Value.ExtractTo(target);
}
}
public T Extract<T>()
{
return (T)Extract_Internal(typeof(T));

View File

@ -1,11 +1,12 @@
namespace DCFApixels.DragonECS
{
public interface IEcsInjectProcess : IEcsProcess { }
[MetaName(nameof(Inject))]
[MetaColor(MetaColor.DragonRose)]
[MetaGroup(EcsConsts.PACK_GROUP, EcsConsts.DI_GROUP)]
[MetaDescription(EcsConsts.AUTHOR, "The interface of the dependency injection process.")]
[MetaID("4C86537C92019AA24383CBF53CBD456C")]
public interface IEcsInject<T> : IEcsProcess
public interface IEcsInject<T> : IEcsInjectProcess
{
void Inject(T obj);
}