### **MonoBehaviour 등록 (Register MonoBehaviour)**
`MonoBehaviour`는 C# 클래스와는 다르게 Unity 씬이나 프리팹에 존재하므로, 등록 방식에 차이가 있습니다.
**1. LifetimeScope의 [SerializeField]를 통한 등록:**
- **설명:** `LifetimeScope` 스크립트의 인스펙터에 `[SerializeField]`로 노출된 `MonoBehaviour` 인스턴스를 직접 참조하여 등록합니다.
- **코드:**
C#
```
[SerializeField]
YourBehaviour yourBehaviour;
// ...
protected override void Configure (IContainerBuilder builder)
{
builder.RegisterComponent(yourBehaviour);
}
```
- **참고:** `RegisterComponent`는 `RegisterInstance`와 유사하지만, `RegisterComponent`로 등록된 `MonoBehaviour`는 `Resolve`되지 않아도 자동으로 주입(Inject)됩니다. 이는 씬에 이미 존재하는 `MonoBehaviour`에 의존성을 주입할 때 유용합니다.
**2. 씬에서 LifetimeScope를 통한 등록 (Hierarchy에서 찾기):**
- **설명:** 현재 씬 계층(Hierarchy)에서 특정 타입의 `MonoBehaviour`를 찾아 컨테이너에 등록합니다.
- **코드:**
C#
```
builder.RegisterComponentInHierarchy<YourBehaviour>();
```
- **참고:** `RegisterComponentInHierarchy`는 항상 `Lifetime.Scoped`를 가집니다. 이는 `MonoBehaviour`의 수명이 씬의 수명과 같기 때문입니다.
**3. 해결 시점에 프리팹에서 인스턴스화하여 등록:**
- **설명:** 컨테이너가 특정 타입의 의존성을 해결(resolve)하려고 할 때, 등록된 프리팹으로부터 `GameObject`를 인스턴스화하고, 그 `GameObject`에 붙어있는 `MonoBehaviour`에 의존성을 주입합니다.
- **코드:**
C#
```
[SerializeField]
YourBehaviour prefab;
// ...
protected override void Configure (IContainerBuilder builder)
{
builder.RegisterComponentInNewPrefab(prefab, Lifetime.Scoped);
}
```
**4. 해결 시점에 새로운 GameObject에 컴포넌트를 추가하여 등록:**
- **설명:** 컨테이너가 특정 타입의 의존성을 해결할 때, 새로운 `GameObject`를 생성하고, 해당 `GameObject`에 지정된 `MonoBehaviour` 컴포넌트를 추가한 후 의존성을 주입합니다.
- **코드:**
C#
```
builder.RegisterComponentOnNewGameObject<YourBehaviour>(Lifetime.Scoped, "NewGameObjectName");
```
**5. `MonoBehaviour`를 인터페이스로 등록:**
- **설명:** `MonoBehaviour` 구현체를 해당 `MonoBehaviour`가 구현하는 인터페이스로 등록합니다.
- **코드:**
C#
```
builder.RegisterComponentInHierarchy<YourBehaviour>()
.AsImplementedInterfaces();
```
**6. 특정 부모 `Transform` 아래에 등록 (Instantiate 또는 찾기):**
- **설명:** 새로운 `GameObject`를 인스턴스화하거나 기존 `GameObject`를 찾을 때, 지정된 부모 `Transform` 아래에 위치하도록 합니다.
- **코드:**
C#
```
// 새로운 GameObject를 지정된 Transform 아래에 인스턴스화
builder.RegisterComponentOnNewGameObject<YourBehaviour>(Lifetime.Scoped)
.UnderTransform(parent);
// 새로운 프리팹을 지정된 Transform 아래에 인스턴스화
builder.RegisterComponentInNewPrefab(prefab, Lifetime.Scoped)
.UnderTransform(parent);
// 지정된 Transform 아래에서 컴포넌트 찾기
builder.RegisterComponentInHierarchy<YourBehaviour>()
.UnderTransform(parentTransform);
```
**7. DontDestroyOnLoad로 등록:**
- **설명:** 등록된 `MonoBehaviour`가 씬이 전환되어도 파괴되지 않고 유지되도록 설정합니다.
- **코드:**
C#
```
// 기존 씬의 MonoBehaviour를 DontDestroyOnLoad로 등록
builder.RegisterComponent(yourBehaviour)
.DontDestroyOnLoad();
// 새로운 프리팹을 DontDestroyOnLoad로 인스턴스화
builder.RegisterComponentInNewPrefab(prefab, Lifetime.Scoped)
.DontDestroyOnLoad();
```
**8. `MonoBehaviour` 등록 그룹화 (`builder.UseComponents`):**
- **설명:** 여러 `MonoBehaviour` 등록을 하나의 그룹으로 묶어 코드를 간결하게 만듭니다. `builder.UseComponents` 람다 내에서 `components` 객체를 통해 `AddInstance`, `AddInHierarchy`, `AddInNewPrefab`, `AddOnNewGameObject`를 호출합니다.
- **코드 (기본):**
C#
```
builder.UseComponents(components =>
{
components.AddInstance(yourBehaviour);
components.AddInHierarchy<YourBehaviour>();
components.AddInNewPrefab(prefab, Lifetime.Scoped);
components.AddOnNewGameObject<YourBehaviour>(Lifetime.Scoped, "name");
});
```
- **코드 (부모 `Transform` 지정 그룹):**
C#
```
builder.UseComponents(parentTransform, components =>
{
// parentTransform 아래에서 GetComponentInChildren
components.AddInHierarchy<YourBehaviour>();
// parentTransform 아래에 인스턴스화
components.AddInNewPrefab(prefab, Lifetime.Scoped);
components.AddOnNewGameObject<YourBehaviour>(Lifetime.Scoped, "name");
});
```
이 그룹화 방식은 개별 `RegisterComponent...` 호출에 `.UnderTransform(parentTransform)`를 사용하는 것과 동일합니다.
### 요약
VContainer에서 `MonoBehaviour`를 DI 컨테이너에 등록하는 매우 유연하고 다양한 방법을 제공합니다. 씬에 존재하는 컴포넌트, 프리팹으로부터 생성되는 컴포넌트, 새로운 `GameObject`에 추가되는 컴포넌트 등 다양한 시나리오에 맞춰 `MonoBehaviour`를 DI 시스템에 통합할 수 있도록 지원하며, `DontDestroyOnLoad` 설정이나 특정 `Transform` 아래로의 배치와 같은 Unity 관련 기능도 함께 제공합니다. `builder.UseComponents`를 통한 그룹화는 코드의 가독성과 유지보수성을 높이는 데 기여합니다.
---
이전 : [[4.3 Registering Factories]] | 다음 : [[4.5 Register ScriptableObject]]