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 없는 환경) |
| 권장 상황 | 모든 서비스·View | VContainer 없는 MonoBehaviour |
| 테스트 용이성 | 높음 | 중간 |
수동 초기화 (VContainer 없는 경우)
VContainer 없이 ServiceLocator를 사용하려면 엔진 내부에서 Setup()이 호출됩니다.
직접 호출하는 퍼블릭 API는 제공되지 않으며, AchEngineScope와 같은 내부 부트스트랩 코드가
컨테이너 준비 시 자동으로 연결합니다.
비 VContainer 환경
ACHENGINE_VCONTAINER 심볼 없이 빌드할 경우, 커스텀 AchEngineInstaller를 구현하여
IServiceBuilder에 서비스를 등록하면 런타임에 ServiceLocator.Resolve<T>()로 접근할 수 있습니다.