mirror of
https://github.com/DCFApixels/DragonECS.git
synced 2025-09-17 17:34:36 +08:00
add di for runner
This commit is contained in:
parent
0f41895093
commit
a7d9350332
@ -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();
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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));
|
||||
|
@ -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);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user