无法在 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));
我遇到了一个奇怪的问题,这两天一直让我很困惑。由于我已经研究并尝试了不同的解决方案,因此尚未解决。
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 referenceGlobalConfiguration.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));