using System; using AIImages.Settings; using Verse; namespace AIImages.Services { /// /// Простой DI контейнер для управления зависимостями мода /// Используется вместо статического Service Locator паттерна /// public class ServiceContainer : IDisposable { private bool _disposed; // Сервисы public IPawnDescriptionService PawnDescriptionService { get; } public IPromptGeneratorService PromptGeneratorService { get; } public IStableDiffusionApiService ApiService { get; private set; } // Настройки public AIImagesModSettings Settings { get; } public ServiceContainer(AIImagesModSettings settings) { if (settings == null) { throw new ArgumentNullException(nameof(settings)); } Settings = settings; // Инициализируем сервисы с внедрением зависимостей PawnDescriptionService = new PawnDescriptionService(); PromptGeneratorService = new AdvancedPromptGenerator(); // Создаем API сервис с текущими настройками RecreateApiService(); Log.Message("[AI Images] ServiceContainer initialized successfully"); } /// /// Пересоздает API сервис с новыми настройками (например, когда изменился endpoint) /// public void RecreateApiService() { // Освобождаем старый сервис, если он был if (ApiService is IDisposable disposable) { disposable.Dispose(); } // Создаем новый с актуальными настройками ApiService = new StableDiffusionNetAdapter(Settings.apiEndpoint, Settings.savePath); Log.Message($"[AI Images] API service recreated with endpoint: {Settings.apiEndpoint}"); } /// /// Проверяет, нужно ли пересоздать API сервис (например, если изменился endpoint) /// public bool ShouldRecreateApiService(string newEndpoint) { // Можно добавить более сложную логику проверки return Settings.apiEndpoint != newEndpoint; } public void Dispose() { if (_disposed) return; // Освобождаем ресурсы API сервиса if (ApiService is IDisposable disposable) { disposable.Dispose(); } _disposed = true; Log.Message("[AI Images] ServiceContainer disposed"); } } }