using CoreAgent.Domain.Interfaces.Common; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; namespace CoreAgent.Infrastructure.Services.Common; /// /// 服务作用域管理器实现 /// 用于在单例服务中创建瞬时服务 /// public class ServiceScopeManager : IServiceScopeManager { private readonly IServiceScopeFactory _scopeFactory; private readonly ILogger _logger; public ServiceScopeManager( IServiceScopeFactory scopeFactory, ILogger logger) { _scopeFactory = scopeFactory ?? throw new ArgumentNullException(nameof(scopeFactory)); _logger = logger ?? throw new ArgumentNullException(nameof(logger)); } /// /// 在作用域中执行异步操作 /// /// 返回类型 /// 要执行的操作 /// 操作结果 public async Task ExecuteInScopeAsync(Func> operation) { if (operation == null) throw new ArgumentNullException(nameof(operation)); using var scope = _scopeFactory.CreateScope(); var serviceProvider = scope.ServiceProvider; try { _logger.LogDebug("开始在执行作用域中执行异步操作"); var result = await operation(serviceProvider); _logger.LogDebug("在执行作用域中执行异步操作完成"); return result; } catch (Exception ex) { _logger.LogError(ex, "在执行作用域中执行异步操作时发生异常"); throw; } } /// /// 在作用域中执行异步操作(无返回值) /// /// 要执行的操作 /// 任务 public async Task ExecuteInScopeAsync(Func operation) { if (operation == null) throw new ArgumentNullException(nameof(operation)); using var scope = _scopeFactory.CreateScope(); var serviceProvider = scope.ServiceProvider; try { _logger.LogDebug("开始在执行作用域中执行异步操作"); await operation(serviceProvider); _logger.LogDebug("在执行作用域中执行异步操作完成"); } catch (Exception ex) { _logger.LogError(ex, "在执行作用域中执行异步操作时发生异常"); throw; } } /// /// 在作用域中执行同步操作 /// /// 返回类型 /// 要执行的操作 /// 操作结果 public T ExecuteInScope(Func operation) { if (operation == null) throw new ArgumentNullException(nameof(operation)); using var scope = _scopeFactory.CreateScope(); var serviceProvider = scope.ServiceProvider; try { _logger.LogDebug("开始在执行作用域中执行同步操作"); var result = operation(serviceProvider); _logger.LogDebug("在执行作用域中执行同步操作完成"); return result; } catch (Exception ex) { _logger.LogError(ex, "在执行作用域中执行同步操作时发生异常"); throw; } } /// /// 在作用域中执行同步操作(无返回值) /// /// 要执行的操作 public void ExecuteInScope(Action operation) { if (operation == null) throw new ArgumentNullException(nameof(operation)); using var scope = _scopeFactory.CreateScope(); var serviceProvider = scope.ServiceProvider; try { _logger.LogDebug("开始在执行作用域中执行同步操作"); operation(serviceProvider); _logger.LogDebug("在执行作用域中执行同步操作完成"); } catch (Exception ex) { _logger.LogError(ex, "在执行作用域中执行同步操作时发生异常"); throw; } } }