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

.NET 6单文件模板配置Autofac JSON依赖注入遇异常

.NET 6 Web API集成Autofac并读取JSON配置失败问题

环境信息

  • Autofac版本:
    • Autofac.Configuration (6.0.0)
    • Autofac.Extensions.DependencyInjection (8.0.0)
  • .NET版本:
    • Microsoft.AspNetCore.App 6.0.20
    • Microsoft.NETCore.App 6.0.20

问题描述

在采用单文件Program.cs模板(无Startup类)的.NET 6 Web API中,尝试通过JSON文件配置Autofac组件注册,但运行时出现依赖无法解析的异常。手动在代码中注册组件(取消注释containerBuilder.RegisterType<IpTablesDotNetSystem>().As<IIpTablesSystem>().SingleInstance();)时项目可正常运行,但JSON配置方式无效。

Program.cs代码

var configurationBuilder = new ConfigurationBuilder();
configurationBuilder.AddJsonFile("autofac.json");
var autoFacConfigurationModule = new ConfigurationModule(configurationBuilder.Build());
var temp = new IpTablesDotNetSystem();

var builder = WebApplication.CreateBuilder(args);

builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory((containerBuilder) =>
{
    containerBuilder.RegisterModule(autoFacConfigurationModule);
    //containerBuilder.RegisterType<IpTablesDotNetSystem>().As<IIpTablesSystem>().SingleInstance();
}
));

// Add services to the container.
builder.Services.AddControllers();

// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

var app = builder.Build();

// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

app.UseAuthorization();

app.MapControllers();

app.Run();

异常信息

System.InvalidOperationException: Unable to resolve service for type 'BSN.IpTables.Domain.IIpTablesSystem' while attempting to activate 'BSN.IpTables.Api.Controllers.HomeController'.
   at Microsoft.Extensions.DependencyInjection.ActivatorUtilities.GetService(IServiceProvider sp, Type type, Type requiredBy, Boolean isDefaultParameterRequired)
   at lambda_method364(Closure , IServiceProvider , Object[] )
   at Microsoft.AspNetCore.Mvc.Controllers.ControllerActivatorProvider.<>c__DisplayClass7_0.<CreateActivator>b__0(ControllerContext controllerContext)
   at Microsoft.AspNetCore.Mvc.Controllers.ControllerFactoryProvider.<>c__DisplayClass6_0.<CreateControllerFactory>g__CreateController|0(ControllerContext controllerContext)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeInnerFilterAsync()
--- End of stack trace from previous location ---
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeFilterPipelineAsync>g__Awaited|20_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Logged|17_1(ResourceInvoker invoker)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Logged|17_1(ResourceInvoker invoker)
   at Microsoft.AspNetCore.Routing.EndpointMiddleware.<Invoke>g__AwaitRequestTask|6_0(Endpoint endpoint, Task requestTask, ILogger logger)
   at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)
   at Swashbuckle.AspNetCore.SwaggerUI.SwaggerUIMiddleware.Invoke(HttpContext httpContext)
   at Swashbuckle.AspNetCore.Swagger.SwaggerMiddleware.Invoke(HttpContext httpContext, ISwaggerProvider swaggerProvider)
   at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)

最新autofac.json配置

{
  "components": [
    {
      "type": "BSN.IpTables.Data.IpTablesDotNetSystem, BSN.IpTables.Data",
      "services": [
        {
          "type": "BSN.IpTables.Domain.IIpTablesSystem, BSN.IpTables.Domain"
        }
      ],
      "instanceScope": "single-instance"
    }
  ]
}

解决方案

1. 修正配置文件格式

Autofac.Configuration 6.x版本要求配置根节点为autofac,直接写components会导致配置无法被识别。修改autofac.json为:

{
  "autofac": {
    "components": [
      {
        "type": "BSN.IpTables.Data.IpTablesDotNetSystem, BSN.IpTables.Data",
        "services": [
          {
            "type": "BSN.IpTables.Domain.IIpTablesSystem, BSN.IpTables.Domain"
          }
        ],
        "instanceScope": "single-instance"
      }
    ]
  }
}

2. 确保配置文件被正确加载

右键autofac.json文件→属性→设置“复制到输出目录”为如果较新则复制,避免文件未被复制到运行目录。

3. 优化配置加载逻辑

复用Web应用的配置源,避免独立创建ConfigurationBuilder导致的路径问题:

var builder = WebApplication.CreateBuilder(args);

// 加载autofac配置文件
builder.Configuration.AddJsonFile("autofac.json", optional: false, reloadOnChange: true);
var autoFacConfigurationModule = new ConfigurationModule(builder.Configuration.GetSection("autofac"));

builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory((containerBuilder) =>
{
    containerBuilder.RegisterModule(autoFacConfigurationModule);
}));

4. 验证类型和程序集名称

确认type字段中的类全名、程序集名称完全正确,包括大小写、命名空间,且目标程序集已被正确引用并复制到输出目录。


内容的提问来源于stack exchange,提问作者sorosh_sabz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 03:06:05