You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否利用.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 00:10:34