### **델리게이트를 사용한 등록 (Register using delegate)**
- **정의:** 인스턴스 생성 과정을 람다 표현식, 또는 다른 메서드나 클래스에 위임하여 등록할 수 있습니다.
**기본 예시:**
C#
```
builder.Register<IFoo>(_ =>
{
var foo = new Foo();
// Some custom logic or initialization
return foo;
}, Lifetime.Scoped);
```
- **설명:** `IFoo` 타입의 인스턴스를 생성하는 델리게이트를 등록합니다. 이 델리게이트 내부에서 `Foo` 객체를 직접 생성하고 추가적인 초기화 로직을 수행할 수 있습니다.
- **해결 방법:**
C#
```
class ClassA
{
public ClassA (IFoo foo) { /* ... */ }
}
```
`ClassA`는 `IFoo` 타입으로 등록된 인스턴스를 주입받습니다.
**`IObjectResolver`를 활용한 예시:**
델리게이트의 첫 번째 인자로 `IObjectResolver`를 받을 수 있습니다. 이를 통해 컨테이너에 이미 등록된 다른 객체를 가져와서 인스턴스 생성에 활용할 수 있습니다.
C#
```
builder.Register<IFoo>(container =>
{
var serviceA = container.Resolve<ServiceA>(); // 컨테이너에서 ServiceA를 가져옴
return serviceA.ProvideFoo(); // ServiceA의 메서드를 사용하여 IFoo 인스턴스를 생성
}, Lifetime.Scoped);
```
- **설명:** 이 델리게이트는 `IObjectResolver`를 사용하여 `ServiceA` 인스턴스를 먼저 해결(resolve)한 다음, `ServiceA`의 `ProvideFoo()` 메서드를 호출하여 `IFoo` 인스턴스를 생성합니다. 이는 복잡한 객체 생성 로직이 다른 의존성을 필요로 할 때 유용합니다.
**`IObjectResolver.Instantiate`를 활용한 예시 (GameObject 주입):**
`IObjectResolver.Instantiate`는 Unity의 `GameObject`를 생성하고 해당 `GameObject`에 `[Inject]` 속성이 붙은 `MonoBehaviour`를 주입하는 기능이 있습니다. 델리게이트 내에서 이를 활용할 수 있습니다.
C#
```
builder.Register(container =>
{
return container.Instantiate(prefab); // 프리팹으로부터 GameObject를 인스턴스화하고 주입 수행
}, Lifetime.Scoped);
```
- **설명:** 이 델리게이트는 `IObjectResolver.Instantiate`를 사용하여 프리팹으로부터 `GameObject`를 생성합니다. 이렇게 생성된 `GameObject`에 연결된 `MonoBehaviour`들은 VContainer에 의해 자동으로 의존성 주입을 받게 됩니다.
- "Container API" 섹션에서 `IObjectResolver`에 대한 더 많은 정보를 찾아볼 수 있다고 안내합니다. (이는 3.5 Container API.pdf 문서에 해당합니다.)
**주의사항 (중요):**
- **실행 시점:** "이 델리게이트는 스코프 생성 시 한 번만 실행됩니다."라고 명시되어 있습니다.
- **런타임 동적 생성:** 만약 런타임에 언제든지 인스턴스를 생성하고 싶다면, "Register Factory" 섹션을 참조하라고 안내합니다. (이는 4.3 Factories.pdf 문서에 해당합니다.)
- 이는 델리게이트 등록이 해당 스코프가 처음 빌드될 때 한 번만 인스턴스를 생성한다는 것을 의미합니다. 만약 게임 도중에 필요할 때마다 새로운 인스턴스를 만들고 싶다면 팩토리 패턴을 사용해야 합니다.
### 요약
VContainer에서 델리게이트를 사용하여 의존성을 등록하는 방법을 설명합니다. 이 방법은 객체 생성 및 초기화에 대한 세밀한 제어가 필요할 때 유용하며, `IObjectResolver`를 통해 컨테이너 내부의 다른 의존성을 활용하거나 `MonoBehaviour`를 포함한 `GameObject`를 동적으로 인스턴스화할 수 있도록 합니다. 다만, 델리게이트는 스코프 빌드 시점에 한 번만 실행되므로, 동적인 인스턴스 생성이 필요할 때는 팩토리 패턴을 사용해야 함을 강조합니다.
---
이전 : [[4.1 Register Plain CSharp Type]] | 다음 : [[4.3 Registering Factories]]