.NET 6 API 系统.InvalidOperationException

问题描述 投票:0回答:1

我在一堂课上有这样的 Autofac 模块;

  public class AutofacBusinessModule:Module
  {
    protected override void Load(ContainerBuilder builder)
    {
      builder.RegisterType<ProductManager>().As<IProductService>();
      builder.RegisterType<EfProductDal>().As<IProductDal>();

      builder.RegisterType<CategoryManager>().As<ICategoryService>();
      builder.RegisterType<EfCategoryDal>().As<ICategoryDal>();

      builder.RegisterType<CustomerManager>().As<ICustomerService>();
      builder.RegisterType<EfCustomerDal>().As<ICustomerDal>();

      builder.RegisterType<RegionManager>().As<IRegionService>();
      builder.RegisterType<EfRegionDal>().As<IRegionDal>();

      builder.RegisterType<TerritoryManager>().As<ITerritoryService>();
      builder.RegisterType<EfTerritoryDal>().As<ITerritoryDal>();

      builder.RegisterType<ShipperManager>().As<IShipperService>();
      builder.RegisterType<EfShipperDal>().As<IShipperDal>();

      builder.RegisterType<EmployeeManager>().As<IEmployeeDal>();
      builder.RegisterType<EfEmployeeDal>().As<IEmployeeDal>();



      var assembly = System.Reflection.Assembly.GetExecutingAssembly();
      builder.RegisterAssemblyTypes(assembly).AsImplementedInterfaces()
        .EnableInterfaceInterceptors(new ProxyGenerationOptions()
        {
          Selector = new AspectInterceptorSelector()
        }).SingleInstance();
    }

我的 API 代码就在那里;

  [Route("api/[controller]")]
  [ApiController]
  public class ProductsController : Controller
  {

    private readonly IProductService _productService;
    public ProductsController(IProductService productService)
    {
      _productService = productService;
    }

    [HttpGet("getall")]
    public IActionResult GetAllProducts()
    {
      var result = _productService.GetAll();
      if (result.Success)
      {
        return Ok(result);
      }

      return BadRequest(result);
    }
  }
}

我将其添加到program.cs上,但不起作用,如果较低,我使用.net 6,我会像这样修复它,但我不知道如何修复.net 6,因为启动不再存在。

IHostBuilder CreateHostBuilder(string[] args) =>
  Host.CreateDefaultBuilder(args)
    .UseServiceProviderFactory(new AutofacServiceProviderFactory())
    .ConfigureContainer<ContainerBuilder>(builder =>
    {
      builder.RegisterModule(new AutofacBusinessModule());
    });

我该如何解决这个问题?

它给了我这个错误

System.InvalidOperationException:尝试激活“TAO.WebApi.Controllers.ProductsController”时无法解析类型“TAO.Business.Abstract.IProductService”的服务。 在 Microsoft.Extensions.DependencyInjection.ActivatorUtilities.GetService(IServiceProvider sp,类型 type,类型 requiredBy,布尔 isDefaultParameterRequired) 在 lambda_method3( 闭包 , IServiceProvider , Object[] ) 在 Microsoft.AspNetCore.Mvc.Controllers.ControllerActivatorProvider.<>c__DisplayClass7_0.b__0(ControllerContext controllerContext) 在 Microsoft.AspNetCore.Mvc.Controllers.ControllerFactoryProvider.<>c__DisplayClass6_0.g__CreateController|0(ControllerContext controllerContext) 在 Microsoft.AspNetCore.Mvc.Infrastruct.ControllerActionInvoker.Next(状态&下一个,范围&范围,对象&状态,布尔& isCompleted) 在 Microsoft.AspNetCore.Mvc.Infrastruct.ControllerActionInvoker.InvokeInnerFilterAsync() --- 先前位置的堆栈跟踪结束 --- 在 Microsoft.AspNetCore.Mvc.Infrastruct.ResourceInvoker.g__Awaited|20_0(ResourceInvoker 调用程序、任务lastTask、状态下一个、范围范围、对象状态、布尔值已完成) 在 Microsoft.AspNetCore.Mvc.Infrastruct.ResourceInvoker.g__Awaited|17_0(ResourceInvoker 调用程序、任务任务、IDisposable 范围) 在 Microsoft.AspNetCore.Mvc.Infrastruct.ResourceInvoker.g__Awaited|17_0(ResourceInvoker 调用程序、任务任务、IDisposable 范围) 在 Microsoft.AspNetCore.Routing.EndpointMiddleware.g__AwaitRequestTask|6_0(端点端点、任务 requestTask、ILogger 记录器) 在 Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext 上下文) 在 Swashbuckle.AspNetCore.SwaggerUI.SwaggerUIMiddleware.Invoke(HttpContext httpContext) 在 Swashbuckle.AspNetCore.Swagger.SwaggerMiddleware.Invoke(HttpContext httpContext,ISwaggerProvider swaggerProvider) 在 Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext 上下文)

HEADERS
=======
Accept: */*
Connection: keep-alive
Host: localhost:7019
User-Agent: PostmanRuntime/7.30.0
Accept-Encoding: gzip, deflate, br
Postman-Token: fbff062e-ca49-4f37-afc5-e8785afbd43c
c# api .net-core .net-6.0 autofac
1个回答
1
投票

尝试使用迁移文档中的以下代码:

builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory());

// Register services directly with Autofac here. Don't
// call builder.Populate(), that happens in AutofacServiceProviderFactory.
builder.Host.ConfigureContainer<ContainerBuilder>(builder => builder.RegisterModule(new AutofacBusinessModule()));

请注意,“旧”通用托管模型在 .NET 6 中仍然有效,不需要使用新的最小托管模型(但您不仅需要将

CreateHostBuilder
方法,还需要将旧
Program.Main
的内容复制到新的
Program
顶级语句文件)。

© www.soinside.com 2019 - 2024. All rights reserved.