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

时间:2015-11-14 14:59:46

标签: c# dependency-injection asp.net-web-api2 autofac unit-of-work

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

  

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

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

在我的网络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&lt;&gt;的构造函数。在我添加Mocked单元测试之前一切正常,但出于某种目的,我现在继续得到这个错误。我还注册了DependencyResolver

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

2 个答案:

答案 0 :(得分:6)

因为在这个问题上有很多赞成还没有任何答案,我并不完全记得我是如何工作的,但我想分享在许多项目中一直运作良好的最新技术。

1)这是我注册我的通用repsoitory和工作单元的方式

 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;
}

希望将来帮助某人。

答案 1 :(得分:1)

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

Here is一个很好的示例如何使用ApiController配置它