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