Automatic dependency injections for DragonECS
Go to file
2023-05-28 19:41:33 +08:00
src refactoring 2023-05-28 05:53:37 +08:00
.gitattributes Initial commit 2023-03-29 04:50:13 +08:00
.gitignore Update .gitignore 2023-04-03 05:45:14 +08:00
DragonECS-AutoInjections.asmdef Init 2023-03-29 16:43:06 +08:00
DragonECS-AutoInjections.asmdef.meta Init 2023-03-29 16:43:06 +08:00
LICENSE Initial commit 2023-03-29 04:50:13 +08:00
README.md Update README.md 2023-05-28 19:41:33 +08:00

DragonECS - Auto Injections Extension

Данное ресширение призвано скоратить объем кода, упростив инбъекцию зависимостей, делая их автоматическими.

Инжекция зависимостей

Аттрибут [EcsInject] скрывает необходимость использования интерфейса IEcsInject<T>, поля помеченные таким атрибутом автоматически подхватят зависимости переданные в метод Inject. У атрибута есть не обязательный аргумент notNullDummyType, если он указан, то во время предварительной инъекции, если поле небыло проинициализировано, ему будет присвоен экземпляр этого типа.

Фабрикаа субъектов

Так же данное расширение упрощает построение субъектов, добавляя 3 сппециальных аттрибута [Inc], [Exc], [Opt]. Данные атрибуты аналогичны вызовам мтодов Include, Exclude, Optional в фабрике субъекта. Так же еще существует 2 атрибута для неявного задания ограничения [IncImplicit], [ExcImplicit], эти атрибуты в обход кеширования пула, задают ограничения длясубъекта.

Пример кода

  • С использованием AutoInjections

class VelocitySystemDI : IEcsRunProcess
{
    class Subject : EcsSubjectDI
    {
        [IncImplicit(typeof(PlayerTag))]
        [Inc] public EcsPool<Pose> poses;
        [Inc] public EcsPool<Velocity> velocities;
    }

    [EcsInject] EcsDefaultWorld _world;
    [EcsInject] TimeService _time;

    public void Run(EcsPipeline pipeline)
    {
        foreach (var e in _world.Where(out Subject s))
        {
            s.poses.Write(e).position += s.velocities.Read(e).value * _time.DeltaTime;
        }
    }
}
  • Без AutoInjections

class VelocitySystem : IEcsRunProcess, IEcsInject<EcsDefaultWorld>, IEcsInject<TimeService>
{
    class Subject : EcsSubject
    {
        public EcsPool<Pose> poses;
        public EcsPool<Velocity> velocities;
        public Subject(Builder b)
        {
            b.Include<PlayerTag>();
            poses = b.Include<Pose>();
            velocities = b.Include<Velocity>();
        }
    }

    EcsDefaultWorld _world;
    TimeService _time;

    public void Inject(EcsDefaultWorld obj) => _world = obj;
    public void Inject(TimeService obj) => _time = obj;

    public void Run(EcsPipeline pipeline)
    {
        foreach (var e in _world.Where(out Subject s))
        {
            s.poses.Write(e).position += s.velocities.Read(e).value * _time.DeltaTime;
        }
    }
}