### **컨테이너 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]]