无法在 Web Api 项目中配置 autofac

Unable to configure autofac in Web Api project

我遇到了一个奇怪的问题,这两天一直让我很困惑。由于我已经研究并尝试了不同的解决方案,因此尚未解决。

Autofac 用作 DI 容器。该解决方案包含多个项目,包括 ASP.NET MVC 5 和 Web API。我们无法在 API 项目中配置和注册 Autofac,而它在 Web 项目上正常工作。

我已经尝试了多种解决方案,例如下面的链接,但其中 none 有效。

...

我遇到了错误“ 尝试创建 'OperationController' 类型的控制器时出错。确保控制器具有无参数 public 构造函数".

代码如下

Startup.cs

public void Configuration(IAppBuilder app)
        {
            var httpConfig = new HttpConfiguration();

            ConfigureOAuth(app);

            WebApiConfig.Register(httpConfig);
            app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);

            RegisterMappers();

            var builder = new ContainerBuilder();
            //builder.RegisterApiControllers(Assembly.GetExecutingAssembly()).PropertiesAutowired();
            builder.RegisterApiControllers(typeof(OperationController).Assembly).PropertiesAutowired();

            builder.RegisterAssemblyTypes(Assembly.Load("PSMS.Repository"))
                .Where(t => t.Name.EndsWith("Repository"))
                .AsImplementedInterfaces()
                .InstancePerLifetimeScope();

            builder.RegisterType<PsmsDbContext>().InstancePerRequest();
            builder.RegisterType<TransactionDbContext>().InstancePerRequest();
            builder.RegisterGeneric(typeof(UnitOfWork<>)).As(typeof(IUnitOfWork<>)).InstancePerDependency();

            var container = builder.Build();
            DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
            GlobalConfiguration.Configuration.DependencyResolver = new AutofacWebApiDependencyResolver(container);

            app.UseWebApi(httpConfig);
        }

OperationController.cs

[RoutePrefix("api/Operation")]
public class OperationController : ApiController
{
    private readonly IUserRepository _userRepository;
    private readonly ITerminalsRepository _terminalsRepository;
    private readonly ITaskHeaderRepository _taskHeaderRepository;

    public OperationController(
        IUserRepository userRepository,
        ITerminalsRepository terminalsRepository,
        ITaskHeaderRepository taskHeaderRepository)
    {
        _userRepository = userRepository;
        _terminalsRepository = terminalsRepository;
        _taskHeaderRepository = taskHeaderRepository;
    }

[Authorize]
    [Route("~/api/Operation/FindTerminal")]
    [HttpPost]
    public IHttpActionResult FindTerminal(GetTerminalInputDto inputDto)
    {
        if (string.IsNullOrEmpty(inputDto.TerminalNo))
            return ResponseMessage(new HttpResponseMessage(HttpStatusCode.NotAcceptable));

        var userPersonnel = _userRepository.GetPersonnelUser(inputDto.TerminalNo);

        var terminal = _terminalsRepository.SearchTerminals(new TerminalsSearchContext
        {
            Terminal = new Terminals
            {
                TerminalNo = inputDto.TerminalNo
            },
            PersonnelId = userPersonnel.PersonnelId ?? 0,
            PersonnelType = (Enumeration.PersonnelTypeEnum)userPersonnel.PersonnelTypeId,
            Take = 1,
            Skip = 0
        }).FirstOrDefault();

        var result = new GetTerminalOutputDto(terminal);
        return Json(result);
    }
}

我再次重复,相同的配置在 ASP.NET MVC 项目中有效。感谢任何帮助

您使用的是 OWIN,而不是经典 Web API 设置。 Per the docs:

A common error in OWIN integration is use of the GlobalConfiguration.Configuration. In OWIN you create the configuration from scratch. You should not reference GlobalConfiguration.Configuration anywhere when using the OWIN integration.

切换这个:

GlobalConfiguration.Configuration.DependencyResolver = new AutofacWebApiDependencyResolver(container);

httpConfig.DependencyResolver = new AutofacWebApiDependencyResolver(container);

另外,不确定您为什么要设置 MVC 依赖解析器。对于 Web API,您不需要:

DependencyResolver.SetResolver(new AutofacDependencyResolver(container));