WebApi DI Autofac-确保控制器具有无参数的公共构造函数

本文关键字:参数 构造函数 Autofac- DI 确保 控制器 WebApi | 更新日期: 2023-09-27 18:22:04

我正在使用依赖注入编写web api,这是在存储库和Autofac作为容器的帮助下的工作单元。依赖关系在24小时前被完美地注入,但突然间,当我今天开始工作时,我一直收到错误

"消息":"发生错误。","ExceptionMessage":"错误尝试创建类型为的控制器时发生"SearchController"。确保控制器具有无参数公共构造函数。","ExceptionType":"System.InvalidOperationException",

我将包括我的签名以及我如何注册类型,如果有人能指出我的代码可能出了什么问题,我会非常高兴。

在我的web api控制器上,我有

 private IUnitOfWork<Listing> _unitOfWork = null;
 public SearchController(IUnitOfWork<Listing> unitOfWork)
 {
     _unitOfWork = unitOfWork;
 }

工作单元采用泛型类型参数来创建存储库。

在我的WebApiConfig.cs中,我注册了以下类型的

 builder.RegisterGeneric(typeof(Repository<>)).As(typeof(IRepository<>));
 builder.RegisterGeneric(typeof(UnitOfWork<>)).As(typeof(IUnitOfWork<>)).InstancePerDependency();
 builder.RegisterType(typeof(SearchController)).UsingConstructor(typeof(IUnitOfWork<Listing>));

我正在注册SearchController以使用接受IUnitOfWork<>的构造函数。在我添加Mocked单元测试之前,一切都很好,但出于某种目的,我现在不断出现这个错误。我还注册了DependencyResolver

var container = builder.Build();
var resolver = new AutofacWebApiDependencyResolver(container);
config.DependencyResolver = resolver;

WebApi DI Autofac-确保控制器具有无参数的公共构造函数

由于这个问题有很多人投了赞成票,但还没有任何答案,我也不太记得我是如何做到的,但我想分享在许多项目中完美运行的最新技术。

1) 这就是我如何注册我的通用代表和工作单位

 builder.RegisterType(typeof(YourContextInRepository));
 builder.RegisterGeneric(typeof(Repository<>)).As(typeof(IRepository<>));
 builder.RegisterGeneric(typeof(UnitOfWork<>)).As(typeof(IUnitOfWork<>));

2) 这就是我为WebAPI 设置依赖解析程序的方式

// Set the dependency resolver for Web API.
var webApiResolver = new AutofacWebApiDependencyResolver(container);
GlobalConfiguration.Configuration.DependencyResolver = webApiResolver;

3) 为了将其注册到MVC控制器,

// Set MVC DI resolver to use our Autofac container
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

这种方法适用于MVC和WebAPI控制器,我可以简单地进行

private IUnitOfWork<Listing> _uow;
public SearchController(IUnitOfWork<Listing> uow)
{
    _uow = uow;
}

希望它将来能帮助到别人。

我也遇到了同样的问题,问题是我为MVC控制器而不是API的ContainerBuilder()对象使用了Autofac代码示例。

下面是一个如何使用ApiController 配置它的好示例