### **컨테이너 API (Container API)** VContainer는 `IObjectResolver`를 자동으로 등록하고 필요한 곳에 주입하므로, 다른 의존성처럼 쉽게 얻을 수 있습니다. **`IObjectResolver` 활용 예시:** `ClassA.cs` C# ``` class ClassA { public ClassA(IObjectResolver container) // IObjectResolver를 생성자 주입으로 받음 { // ServiceA로 등록된 인스턴스(또는 생성)를 가져옵니다. // 만약 ServiceA의 서브클래스를 등록했다면, 그 서브클래스가 해결될 수 있습니다. var serviceA = container.Resolve<ServiceA>(); // foo에 모든 관련 의존성을 주입합니다. // 객체에 두 번 주입하면 [Inject]로 표시된 모든 속성 또는 필드를 덮어쓰거나, 메서드를 다시 호출합니다. container.Inject(foo); // 이 GameObject와 그 자손들의 MonoBehaviour에 의존성을 주입합니다. // 대상 GameObject와 MonoBehaviour가 활성화되어 있는지 여부와 관계없이 주입합니다. container.InjectGameObject(gameObject); // 프리팹에서 GameObject를 인스턴스화하고, // 그 GameObject 및 그 자손들의 MonoBehaviour에 의존성을 주입합니다. // 다른 방법 (예: 프로시저 생성 또는 Addressables)으로 GameObject를 생성하는 경우 // InjectGameObject를 고려하십시오. var object1 = container.Instantiate(prefab); // Object.Instantiate를 모방하는 오버로드도 있습니다. var object2 = container.Instantiate(prefab, parent); var object3 = container.Instantiate(prefab, position, rotation, parent); } } ``` **설명:** - **`container.Resolve<T>()`**: 컨테이너에 등록된 특정 타입 `T`의 인스턴스를 가져오거나 새로 생성합니다. 이는 VContainer의 핵심 기능 중 하나로, 의존성 그래프를 탐색하여 필요한 객체를 제공합니다. - **`container.Inject(object instance)`**: 이미 생성된 객체 `instance`의 `[Inject]` 속성이 붙은 필드, 속성, 또는 메서드에 의존성을 주입합니다. 이는 MonoBehaviour와 같이 VContainer가 직접 인스턴스를 생성하지 않는 경우에 특히 유용합니다. (3.4 MonoBehaviour.pdf에서 설명된 것처럼) - **`container.InjectGameObject(GameObject gameObject)`**: 특정 `GameObject`와 그 하위 자식들에 붙어있는 모든 `MonoBehaviour` 컴포넌트에 의존성을 주입합니다. 이 기능은 씬에 이미 존재하는 GameObject에 DI를 적용할 때 유용합니다. - **`container.Instantiate(GameObject prefab, ...)`**: Unity의 `Object.Instantiate`와 유사하게 프리팹으로부터 `GameObject`를 생성하지만, 추가적으로 새로 생성된 `GameObject`에 붙어있는 `MonoBehaviour` 및 그 자식들의 `MonoBehaviour`에 자동으로 의존성을 주입합니다. 이는 런타임에 동적으로 프리팹을 생성하고 주입해야 할 때 매우 강력합니다. **추가 팁:** - **확장 메서드 작성:** `IObjectResolver.Inject`를 특정 패턴으로 자주 사용한다면, 해당 패턴에 대한 확장 메서드를 작성하는 것을 고려할 수 있습니다. `IObjectResolver`의 거의 모든 API가 확장 메서드입니다. - **`IObjectResolver.Resolve`의 명시적 사용:** 일반적으로는 생성자/메서드/속성/필드 주입과 같은 다른 주입 기법이 더 권장됩니다. `IObjectResolver.Resolve`를 명시적으로 사용하는 경우는 주로 다른 주입 기법이 적합하지 않거나, VContainer 콜백(예: 빌드 콜백 또는 특정 팩토리 함수)에서 `IObjectResolver`가 노출될 때입니다. - IL 제너레이터를 사용하면 모든 해결(resolution) 기법의 성능은 유사하지만, `Resolve`를 직접 사용하는 것은 더 많은 코드를 요구하고 의도를 모호하게 할 수 있습니다. - **`LifetimeScope`의 `Container` 속성:** `LifetimeScope`는 `Container` 속성을 통해 `IObjectResolver`에 대한 참조를 가지고 있습니다. VContainer는 이를 자동으로 등록하지만, 컨테이너가 빌드된 후에는 자주 필요하지 않을 것입니다. **예시 (LifetimeScope 주입):** C# ``` class ClassA { public ClassA(LifetimeScope currentScope) // LifetimeScope 자체를 주입받을 수 있습니다. { // 이 경우, ServiceA를 주입받는 것만으로도 충분했을 것입니다. var foo = currentScope.Container.Resolve<ServiceA>(); } } ``` ### 요약 개발자가 VContainer의 `IObjectResolver` 인터페이스를 사용하여 DI 컨테이너와 직접 상호작용하는 방법을 상세히 설명합니다. 이 인터페이스는 의존성 해결, 기존 객체 주입, 그리고 Unity `GameObject`의 동적 인스턴스화 및 주입을 위한 강력한 도구를 제공합니다. 또한, 직접적인 `Resolve` 호출은 특정 상황에 한정하여 사용하고, 대부분의 경우 더 간결한 주입 방식을 활용하도록 권장하는 VContainer의 철학을 보여줍니다. --- 이전 : [[3.4 Injecting into MonoBehaviours]] | 다음 : [[4.1 Register Plain CSharp Type]]