Unity/VContainer
유니티를 위한 DI 프레임워크 VContainer, Lifetime Overview
VR하는소년
2023. 3. 12. 15:00
Lifetime Overview
VContainer 코드를 살펴보면 Register<T>(Lifetime. ~) 이런 구문을 본적이 있을 것입니다!
이때 Lifetime에는 총 3가지의 옵션이 있는데
첫 번째, Singleton
두 번째, Transient
세 번째, Scoped 이렇게 있습니다
차례대로 살펴보겠습니다!
- Singleton은 모든 컨테이너에 단 하나의 인스턴스입니다! 똑같은 Type은 같은 컨테이너에 등록될 수 없습니다!
- Transient 은 Resolving당 하나의 인스턴스입니다
- Scope는 LifetimeScope당 하나의 인스턴스 입니다
- LifetimeScope가 하나만 존재한다면, 싱글톤과 비슷합니다
- 만약 LifetimeScope 자식을 만든다면, 그 인스턴스는 각 자식마다 달라집니다
- LifetimeScope 가 파괴될 때, LifetimeScope 를 참조한 것들을 release하기 위해 IDisposable를 호출해야합니다
Lifetime with Parent/Child relationship
LifetimeScope 는 부모-자식 관계를 build할 수 있습니다, 다음 행동을 따릅니다!
- 만약 등록된 오브젝트를 찾지 못하면, LifetimeScope는 부모 LifetimeScope를 찾을 것입니다
- Lifetime.Singleton에 대해
- 기본적으로, 항상 같은 인스턴스를 return해줍니다
- 만약 부모와 자식이 같은 Type을 가진다면, 가까운 scope의 인스턴스를 return해줍니다
- LifetimeScope가 파괴될 때, 오브젝트는 구현된 IDisposable에 있는 Dispose()에 호출됩니다
- Lifetime.Transient에 대해
- 각 Resolving에 대한 인스턴스를 생성합니다
- 만약 부모와 자식이 같은 registration을 가졌다면, 자식의 인스턴스를 만들어냅니다
- Lifetime.Scope에 대해
- 인스턴스는 자식마다 다릅니다
- (만약 자식이 같으면, 같은 인스턴스를 return합니다)
- 만약 부모와 자식이 같은 registration을 가진다면, 자식의 인스턴스를 만들어냅니다
- LifetimeScope이 파괴될 때, 오브젝트는 구현된 IDisposable에 있는 Dispose()에 호출됩니다
- 인스턴스는 자식마다 다릅니다
[CAUTION]
만약 씬이 살아있고 LifetimeScope만 파괴될 때, Lifetime.Scoped에 등록된 모노비헤이비어들은 자동으로 파괴되지 않습니다. 만약 LifetimeScope와 함께 파괴되길 바란다면, LifetimeScope의 자식 transform으로 만들거나, IDisposable를 실행하는것을 고려하면 됩니다!
How to pre-set the parent in the Inspector
LifetimeScope를 상속받는 친구들을 보면 이렇게 Parent가 달려 있는데 여기에
부모를 Set해주면 된다!