Не удалось настроить autofac в проекте Web Api

Я столкнулся со странной проблемой, которая смущала меня в течение последних двух дней. Поскольку я исследовал и пробовал другое решение, оно еще не решено.

Autofac используется как контейнер DI. Решение содержит несколько проектов, включая ASP.NET MVC 5 и веб-API. Мы не можем настроить и зарегистрировать Autofac в проекте API, хотя он правильно работает в веб-проекте.

Я пробовал несколько решений, таких как ссылки ниже, но ни одно из них не работает.

https://stackoverflow.com/a/15910758/7855321

https://stackoverflow.com/a/36063722/7855321

https://stackoverflow.com/a/12277002/7855321

...

Я сталкиваюсь с ошибкой «Произошла ошибка при попытке создать контроллер типа OperationController. Убедитесь, что у контроллера есть открытый конструктор без параметров».

Коды представлены ниже

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. Любая помощь приветствуется


person Mahyar Mottaghi Zadeh    schedule 15.07.2019    source источник


Ответы (1)


Вы используете OWIN, а не классическую настройку веб-API. Согласно документации:

Распространенной ошибкой интеграции OWIN является использование файла GlobalConfiguration.Configuration. В OWIN вы создаете конфигурацию с нуля. При использовании интеграции OWIN нигде не следует ссылаться на GlobalConfiguration.Configuration.

Переключите это:

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

to

httpConfig.DependencyResolver = new AutofacWebApiDependencyResolver(container);

Кроме того, не уверен, почему вы устанавливаете преобразователь зависимостей MVC. Для веб-API вам не нужно:

DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
person Travis Illig    schedule 15.07.2019