能否利用.NET Core依赖注入创建未注册为服务的类实例?
.NET Core依赖注入创建未注册类型实例的方法
当然可以,你可以使用ActivatorUtilities.CreateInstance方法来实现这个需求。这个方法能从.NET Core的依赖注入容器中自动解析目标类型构造函数所需的已注册服务,进而实例化未注册的具体类型。
具体用法示例
假设你有以下已注册的服务:
// 注册依赖服务 services.AddScoped<IDataRepository, SqlDataRepository>(); services.AddSingleton<ILogger<SummaryReportService>, Logger<SummaryReportService>>();
而SummaryReportService未注册到DI容器,但其构造函数依赖上述服务:
public class SummaryReportService { private readonly IDataRepository _dataRepo; private readonly ILogger<SummaryReportService> _logger; public SummaryReportService(IDataRepository dataRepo, ILogger<SummaryReportService> logger) { _dataRepo = dataRepo; _logger = logger; } // 业务方法 public string GenerateReport() { // 实现逻辑 _logger.LogInformation("生成报告"); return _dataRepo.GetSummaryData(); } }
要创建SummaryReportService的实例,只需在能获取到IServiceProvider的地方(比如控制器、已注册的服务中)调用ActivatorUtilities.CreateInstance:
public class ReportController : ControllerBase { private readonly IServiceProvider _serviceProvider; public ReportController(IServiceProvider serviceProvider) { _serviceProvider = serviceProvider; } [HttpGet] public IActionResult GetReport() { // 创建未注册的SummaryReportService实例,自动注入构造函数依赖 var reportService = ActivatorUtilities.CreateInstance<SummaryReportService>(_serviceProvider); var reportContent = reportService.GenerateReport(); return Ok(reportContent); } }
注意事项
- 目标类型必须是具体类,不能是接口或抽象类,否则无法实例化。
- 构造函数的参数要么是已在DI容器中注册的服务,要么带有默认值,否则会抛出解析失败的异常。
- 如果目标类有多个构造函数,
ActivatorUtilities会自动选择参数数量最多且所有参数都能被DI容器解析的那个构造函数。
内容的提问来源于stack exchange,提问作者Jonathan Wood
相关产品推荐
相关产品推荐

