의존성 주입 받는 방법
기본적으로 VContainer 네임스페이스에 Inject Attribute를 사용하여 주입받을 맴버를 선언하도록 설정하고 있습니다.
프로퍼티, 필드
class ClassA
{
[Inject]
IServiceA serviceA { get; set; }
[Inject]
IServiceB serviceB;
}
이전 글에서도 잠깐 다뤘던 프로퍼티나 필드에 주입하는 방법입니다.
생성자
class ClassA
{
readonly IServiceA serviceA;
readonly IServiceB serviceB;
readonly SomeUnityComponent component;
public ClassA(
IServiceA serviceA,
IServiceB serviceB,
SomeUnityComponent component)
{
this.serviceA = serviceA;
this.serviceB = serviceB;
this.component = component;
}
}
LifetimeScope에서 Regist함수를 통해 등록된 객체의 경우에는 생성자에서 주입이 가능합니다.
함수
public class SomeBehaviour : MonoBehaviour
{
float speed;
[Inject]
public void Construct(GameSettings settings)
{
speed = settings.speed;
}
}
의존성 주입하는 방법
Inject
var classA = new ClassA();
m_HelloWorldLifetimeScope.Container.Inject(classA);
LifetimeScope가 가지고있는 Container를 통해서 Inject 함수를 통해 의존성을 주입하고 있습니다.
생성자를 통한 의존성 주입을 제외하고는 모두 Container의 Inject함수를 사용합니다.
InjectGameObject
m_HelloWorldLifetimeScope.Container.InjectGameObject(obj);
Container에 InjectGameObject함수가 있는데 내부적으로는 GameObject가 가지고있는 모든 MonoBehaviour 컴포넌트를 찾아서 위에 Inject함수를 통해 의존성을 주입해주는 기능입니다.
하위에 모든 오브젝트와 컴포넌트를 뒤지는 만큼 성능상 좋지는 못합니다. Object Pooling과 함께 이용해야합니다.
Instantiate
var instance = m_HelloWorldLifetimeScope.Container.Instantiate(prefab, transform);
Container에 Instantiate함수가 있는데 내부에는 GameObject.Instantiate함수를 실행하고 만들어진 GameObject를 InjectGameObject함수를 실행하도록 되어있습니다.
참고
https://vcontainer.hadashikick.jp/
About | VContainer
VContainer - the fastest DI (Dependency Injection) for Unity Game Engine
vcontainer.hadashikick.jp
'Unity VContainer' 카테고리의 다른 글
VContainer #1 - 설치 및 실행 (0) | 2024.08.04 |
---|---|
VContainer #0 - Unity에서 DI(Depencency Injection)를 사용하기 (0) | 2024.08.03 |