VContainer - 3KGames/rules GitHub Wiki

Обзор DI системы VContainer

DI - Dependency Injection. Это такая штука которая сама прокидыват всякие зависимости. -Что такое зависимость? -Это класс, объект, GameObject который нужен для работы в разных частях кода. (то что мы раньше прокидывали через [SerializeField], или GetComponent)

В VContainer есть LifetimeScope'ы - это классы которые мы сами создаем, наследуя их от LifetimeScope. Каждый такой класс хранит свой контейнер зависимостей, откуда VContainer берет зависимости и прокидывает. Зачем нужны разные LifetimeScope'ы? - Чтобы задавать разные сроки жизни для разных зависимостей и вообще чтобы их разделять. На пример, у нас есть GameLifetimeScope и LevelLifeteimeScope. Ясно что второй скоуп дочерний к первому (мы входим в игру, а потом в игре уже входим в уровень), и те зависимости, что создаются для уровня, должны очиститься после завершения уровня.

Чтобы DI работал нужно просто создать *LifetimeScope : LifetimeScope класс и в нем зарегистрировать зависимости через builder.Register* и DI сам прокинит эту зависимость в конструкторы, функции, поля других классов, вообщем - куда угодно. Пример с официальной документации

Основные виды зависимостей и как их регистрировать:

  • C# Классы builder.Register(LifeTime.Singleton|LifeTime.Scoped|и тд). VContainer сам создаст и очистит объект для этого класса когда надо
  • объекты класса bulder.RegisterInstance(someInstance). VContainer просто прокидывает эту объект куда надо, но создает ее и не удалят. На деле очень похоже на builder.Register(LifeTime.Singelton)
  • Unity Monobehaviour builder.RegisterComponent(MonobehaviourClass). То же самое что и выше, только для монобехов
  • C# Классы с проброшенными функциями событий из Unity (Update, Start...) builder.RegisterEntryPoint(Lifetime.*). То же самое что обычный Register но позволяет запускать Update, FixedUpdate и тд в обынчных C# классах (sic!)

После моего небольшого введения рекомендую просмотреть документацию, слава богу она не большая и понятная. Рекомендую просмотреть только статью /Getting Start/Hello World и разделы /Resolving с /Regestering, остальное - по желанию

⚠️ **GitHub.com Fallback** ⚠️