Я столкнулся со странной проблемой, которая смущала меня в течение последних двух дней. Поскольку я исследовал и пробовал другое решение, оно еще не решено.
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. Любая помощь приветствуется