본문으로 건너뛰기

AchEngineInstaller

AchEngineInstaller는 서비스 등록을 캡슐화하는 추상 MonoBehaviour입니다. VContainer의 IInstaller를 직접 상속하지 않아 VContainer 비의존 환경에서도 코드를 작성할 수 있습니다.

IServiceBuilder API

csharp
public interface IServiceBuilder
{
    // 인터페이스 없이 구체 타입 등록
    IServiceBuilder Register<T>(ServiceLifetime lifetime = ServiceLifetime.Singleton)
        where T : class;

    // 인터페이스 → 구현체 매핑 등록
    IServiceBuilder Register<TInterface, TImpl>(ServiceLifetime lifetime = ServiceLifetime.Singleton)
        where TImpl : class, TInterface;

    // 이미 생성된 인스턴스 등록
    IServiceBuilder RegisterInstance<T>(T instance)
        where T : class;

    // MonoBehaviour / Component 등록
    IServiceBuilder RegisterComponent<T>(T component)
        where T : UnityEngine.Component;
}

1. Installer 작성

csharp
using AchEngine.DI;

public class GameInstaller : AchEngineInstaller
{
    [SerializeField] private GameConfig _config;

    public override void Install(IServiceBuilder builder)
    {
        builder
            // 인터페이스 → 구현체 (Singleton)
            .Register<IGameService, GameService>()
            // 구체 타입만 (Transient)
            .Register<PlayerController>(ServiceLifetime.Transient)
            // ScriptableObject 인스턴스
            .RegisterInstance<IConfig>(_config)
            // 씬의 MonoBehaviour
            .RegisterComponent(GetComponent<AudioManager>());
    }
}

2. AchEngineScope에 등록

씬의 AchEngineScope 컴포넌트 Inspector에서 Installers 배열에 GameInstaller를 드래그하세요.

[AchEngineScope]
  Installers:
    ├── GameInstaller
    ├── UIInstaller
    └── AudioInstaller

3. 서비스 사용

[Inject] 어노테이션 (VContainer 필요)

csharp
public class PlayerController : MonoBehaviour
{
    [Inject] private readonly IGameService _gameService;
    [Inject] private readonly IConfig _config;

    private void Start()
    {
        _gameService.Initialize(_config);
    }
}

ServiceLocator (어디서든 사용 가능)

csharp
var service = ServiceLocator.Resolve<IGameService>();

스코프 수명 주기

AchEngineScope는 씬 로드 시 컨테이너를 빌드하고, 씬 언로드(OnDestroy) 시 컨테이너를 해제하며 ServiceLocator를 초기화합니다.

멀티 씬 주의

동시에 여러 씬에 AchEngineScope가 있으면 마지막으로 초기화된 것이 ServiceLocator에 등록됩니다. 부모-자식 스코프가 필요한 경우 VContainer 공식 문서를 참고하세요.

MIT License