### **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]]