본문으로 건너뛰기

ServiceLocator

ServiceLocator는 런타임에 등록된 서비스를 타입으로 조회하는 정적 파사드입니다. DI 컨테이너(AchEngineScope)가 초기화되면 자동으로 연결됩니다.

API

csharp
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);
    }
}

사용 예시

csharp
// 기본 조회
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 필요
사용 위치DI 컨테이너가 생성한 객체어디서든
권장 상황일반 서비스·ViewMonoBehaviour, 씬 전환 중
테스트 용이성높음중간

권장 패턴

가능하면 [Inject]를 사용하고, MonoBehaviour처럼 DI 컨테이너가 직접 생성하지 않는 객체에서만 ServiceLocator를 사용하세요.

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

VContainer 없이 ServiceLocator를 사용하려면 직접 리졸버를 설정합니다.

csharp
// 부트스트랩 코드
var container = new Dictionary<Type, object>();
container[typeof(IGameService)] = new GameService();

ServiceLocator.Setup(type =>
{
    container.TryGetValue(type, out var obj);
    return obj;
});

MIT License