This commit is contained in:
DCFApixels 2025-07-12 01:28:24 +08:00
parent ab50dcb7e3
commit b3571e3ed8
3 changed files with 49 additions and 16 deletions

View File

@ -37,13 +37,51 @@ namespace DCFApixels.DragonECS
private readonly List<InitDeclaredRunner> _initDeclaredRunners = new List<InitDeclaredRunner>(4);
public readonly LayersMap Layers;
public readonly Injector.Builder Injector;
public readonly InitInjector Injector;
public readonly Configurator Configs;
private AddParams _defaultAddParams = new AddParams(BASIC_LAYER, 0, false);
private HashSet<Type> _uniqueSystemsSet = new HashSet<Type>();
#region InitInjector
public readonly struct InitInjector
{
public readonly Injector.Builder Instance;
public readonly Builder PipelineBuilder;
public InitInjector(Injector.Builder instance, Builder pipelineBuilder)
{
Instance = instance;
PipelineBuilder = pipelineBuilder;
}
public Builder AddNode<T>()
{
Instance.AddNode<T>();
return PipelineBuilder;
}
public Builder Inject<T>(T obj)
{
Instance.Inject(obj);
return PipelineBuilder;
}
public Builder Extract<T>(ref T obj)
{
Instance.Extract(ref obj);
return PipelineBuilder;
}
public Builder Add(Injector.Builder other)
{
Instance.Add(other);
return PipelineBuilder;
}
public Injector Build(EcsPipeline pipeline)
{
return Instance.Build(pipeline);
}
}
#endregion
#region Properties
//private ReadOnlySpan<SystemNode> SystemRecords
//{
@ -57,7 +95,8 @@ namespace DCFApixels.DragonECS
if (config == null) { config = new ConfigContainer(); }
Configs = new Configurator(config, this);
Injector = new Injector.Builder(this);
var injectorBuilder = new Injector.Builder();
Injector = new InitInjector(injectorBuilder, this);
Injector.AddNode<object>();
Injector.AddNode<EcsWorld>();
Injector.AddNode<EcsAspect>();
@ -368,7 +407,7 @@ namespace DCFApixels.DragonECS
}
}
EcsPipeline pipeline = new EcsPipeline(allSystems, Configs.Instance.GetContainer(), Injector);
EcsPipeline pipeline = new EcsPipeline(allSystems, Configs.Instance.GetContainer(), Injector.Instance);
foreach (var item in _initDeclaredRunners)
{
item.Declare(pipeline);

View File

@ -90,7 +90,7 @@ namespace DCFApixels.DragonECS
}
if(injectorBuilder == null)
{
injectorBuilder = new Injector.Builder(null);
injectorBuilder = new Injector.Builder();
}
_configs = configs;

View File

@ -176,21 +176,18 @@ namespace DCFApixels.DragonECS
public class Builder : IInjector
{
private EcsPipeline.Builder _source;
private Injector _instance;
private List<InitInjectBase> _initInjections = new List<InitInjectBase>(32);
private EcsWorld _monoWorld;
internal Builder(EcsPipeline.Builder source)
internal Builder()
{
_source = source;
_instance = new Injector();
}
public EcsPipeline.Builder AddNode<T>()
public void AddNode<T>()
{
_instance.TryDeclare<T>();
return _source;
}
public EcsPipeline.Builder Inject<T>(T obj)
public void Inject<T>(T obj)
{
if (obj is EcsWorld objWorld)
{
@ -217,9 +214,8 @@ namespace DCFApixels.DragonECS
}
}
_initInjections.Add(new InitInject<T>(obj));
return _source;
}
public EcsPipeline.Builder Extract<T>(ref T obj) // TODO проверить
public void Extract<T>(ref T obj) // TODO проверить
{
Type type = typeof(T);
for (int i = _initInjections.Count - 1; i >= 0; i--)
@ -228,11 +224,10 @@ namespace DCFApixels.DragonECS
if (type.IsAssignableFrom(item.Type))
{
obj = (T)item.Raw;
return _source;
return;
}
}
Throw.UndefinedException();
return default;
}
public Injector Build(EcsPipeline pipeline)
{
@ -242,7 +237,6 @@ namespace DCFApixels.DragonECS
monoWorldSystem.World = _monoWorld;
}
var initInjectionCallbacks = pipeline.GetProcess<IOnInitInjectionComplete>();
foreach (var system in initInjectionCallbacks)
{
@ -292,7 +286,7 @@ namespace DCFApixels.DragonECS
}
public override void InjectTo(Injector instance)
{
instance.Inject<T>(_injectedData);
instance.Inject(_injectedData);
}
}
}