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