Unity/VContainer

유니티를 위한 DI 프레임워크 VContainer, Lifetime Overview

VR하는소년 2023. 3. 12. 15:00

Lifetime Overview

Boss Room Code 일부

VContainer 코드를 살펴보면 Register<T>(Lifetime. ~) 이런 구문을 본적이 있을 것입니다!

이때 Lifetime에는 총 3가지의 옵션이 있는데

 

첫 번째, Singleton

두 번째, Transient

세 번째, Scoped 이렇게 있습니다

 

차례대로 살펴보겠습니다!


  • Singleton은 모든 컨테이너에 단 하나의 인스턴스입니다! 똑같은 Type은 같은 컨테이너에 등록될 수 없습니다!
  • Transient 은 Resolving당 하나의 인스턴스입니다
  • Scope는 LifetimeScope당 하나의 인스턴스 입니다
    1. LifetimeScope가 하나만 존재한다면, 싱글톤과 비슷합니다
    2. 만약 LifetimeScope 자식을 만든다면, 그 인스턴스는 각 자식마다 달라집니다
    3. LifetimeScope 가 파괴될 때, LifetimeScope 를 참조한 것들을 release하기 위해 IDisposable를 호출해야합니다

 


Lifetime with Parent/Child relationship

LifetimeScope 는 부모-자식 관계를 build할 수 있습니다, 다음 행동을 따릅니다!

  • 만약 등록된 오브젝트를 찾지 못하면, LifetimeScope는 부모 LifetimeScope를 찾을 것입니다
  • Lifetime.Singleton에 대해
    1. 기본적으로, 항상 같은 인스턴스를 return해줍니다
    2. 만약 부모와 자식이 같은 Type을 가진다면, 가까운 scope의 인스턴스를 return해줍니다
    3. LifetimeScope가 파괴될 때, 오브젝트는 구현된 IDisposable에 있는 Dispose()에 호출됩니다
  • Lifetime.Transient에 대해
    1. 각 Resolving에 대한 인스턴스를 생성합니다
    2. 만약 부모와 자식이 같은 registration을 가졌다면, 자식의 인스턴스를 만들어냅니다
  • Lifetime.Scope에 대해
    1. 인스턴스는 자식마다 다릅니다
      • (만약 자식이 같으면, 같은 인스턴스를 return합니다)
    2. 만약 부모와 자식이 같은 registration을 가진다면, 자식의 인스턴스를 만들어냅니다
    3. LifetimeScope이 파괴될 때, 오브젝트는 구현된 IDisposable에 있는 Dispose()에 호출됩니다
 

 

[CAUTION]

만약 씬이 살아있고 LifetimeScope만 파괴될 때, Lifetime.Scoped에 등록된 모노비헤이비어들은 자동으로 파괴되지 않습니다. 만약 LifetimeScope와 함께 파괴되길 바란다면, LifetimeScope의 자식 transform으로 만들거나, IDisposable를 실행하는것을 고려하면 됩니다!

 


How to pre-set the parent in the Inspector

LifetimeScope를 상속받는 친구들을 보면 이렇게 Parent가 달려 있는데 여기에

부모를 Set해주면 된다!