using Microsoft.Extensions.DependencyInjection; namespace AxCopilot.Services; /// /// 전역 DI 서비스 로케이터. /// 기존 수동 new 패턴에서 DI 컨테이너로의 점진적 전환을 지원합니다. /// App.OnStartup()에서 Configure()를 호출하여 초기화합니다. /// /// 사용법: /// var settings = ServiceLocator.Get<ISettingsService>(); /// var storage = ServiceLocator.Get<IChatStorageService>(); /// public static class ServiceLocator { private static IServiceProvider? _provider; /// DI 컨테이너를 구성합니다. 앱 시작 시 1회만 호출합니다. public static IServiceProvider Configure(Action configureServices) { var services = new ServiceCollection(); configureServices(services); _provider = services.BuildServiceProvider(validateScopes: true); return _provider; } /// 이미 생성된 ServiceProvider를 직접 설정합니다. public static void SetProvider(IServiceProvider provider) { _provider = provider ?? throw new ArgumentNullException(nameof(provider)); } /// 등록된 서비스를 가져옵니다. public static T Get() where T : notnull { if (_provider == null) throw new InvalidOperationException("ServiceLocator가 초기화되지 않았습니다. App.OnStartup()에서 Configure()를 호출하세요."); return _provider.GetRequiredService(); } /// 등록된 서비스를 가져옵니다. 미등록 시 null을 반환합니다. public static T? GetOptional() where T : class { return _provider?.GetService(); } /// 내부 ServiceProvider에 직접 접근합니다. (테스트/마이그레이션용) public static IServiceProvider? Provider => _provider; }