본문으로 건너뛰기

ServiceLocator

VContainer 미설치 전용

ACHENGINE_VCONTAINER 심볼이 정의된 환경(VContainer 설치 시)에서는 ServiceLocator가 컴파일되지 않습니다. VContainer 프로젝트에서는 [Inject]를 사용하세요.

ServiceLocator는 VContainer 없이 런타임에 서비스를 타입으로 조회하는 정적 파사드입니다.

API

namespace AchEngine.DI
{
public static class ServiceLocator
{
// 컨테이너가 준비되었는지 여부
public static bool IsReady { get; }

// 서비스 조회 (없으면 InvalidOperationException)
public static T Resolve<T>();

// 안전한 서비스 조회 (없으면 false 반환)
public static bool TryResolve<T>(out T result);
}
}

사용 예시

// 기본 조회
var ui = ServiceLocator.Resolve<IUIService>();
ui.Show<MainMenuView>();

// 안전한 조회
if (ServiceLocator.TryResolve<IAudioService>(out var audio))
{
audio.PlayBGM("main_theme");
}

// 준비 여부 확인
if (!ServiceLocator.IsReady)
{
Debug.LogWarning("서비스 컨테이너가 아직 초기화되지 않았습니다.");
return;
}

[Inject] vs ServiceLocator

[Inject]ServiceLocator
VContainer✅ 필요❌ VContainer 미설치 시만 사용 가능
사용 위치DI 컨테이너가 생성한 객체어디서든 (VContainer 없는 환경)
권장 상황모든 서비스·ViewVContainer 없는 MonoBehaviour
테스트 용이성높음중간

수동 초기화 (VContainer 없는 경우)

VContainer 없이 ServiceLocator를 사용하려면 엔진 내부에서 Setup()이 호출됩니다. 직접 호출하는 퍼블릭 API는 제공되지 않으며, AchEngineScope와 같은 내부 부트스트랩 코드가 컨테이너 준비 시 자동으로 연결합니다.

비 VContainer 환경

ACHENGINE_VCONTAINER 심볼 없이 빌드할 경우, 커스텀 AchEngineInstaller를 구현하여 IServiceBuilder에 서비스를 등록하면 런타임에 ServiceLocator.Resolve<T>()로 접근할 수 있습니다.

관련 문서