首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >WebApi DI Autofac -确保控制器具有无参数的公共构造函数

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

Stack Overflow用户
提问于 2015-11-14 14:59:46
回答 2查看 7.4K关注 0票数 9

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

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

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

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

代码语言:javascript
运行
复制
 private IUnitOfWork<Listing> _unitOfWork = null;
 public SearchController(IUnitOfWork<Listing> unitOfWork)
 {
     _unitOfWork = unitOfWork;
 }

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

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

代码语言:javascript
运行
复制
 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<>的构造函数。在我添加模拟的单元测试之前,这一切都运行得很好,但是为了某种目的,我现在继续得到这个错误。我也注册了DependencyResolver

代码语言:javascript
运行
复制
var container = builder.Build();
var resolver = new AutofacWebApiDependencyResolver(container);
config.DependencyResolver = resolver;
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-28 22:25:17

由于在这个问题上有相当多的人没有任何答案,而且我不记得我是如何使它工作的,但我想分享一下在许多项目中一直非常有效的最新技术。

1)这就是我如何注册我的通用爬虫库和工作单位。

代码语言:javascript
运行
复制
 builder.RegisterType(typeof(YourContextInRepository));
 builder.RegisterGeneric(typeof(Repository<>)).As(typeof(IRepository<>));
 builder.RegisterGeneric(typeof(UnitOfWork<>)).As(typeof(IUnitOfWork<>));

2)我就是这样为我的WebAPI设置依赖解析器的

代码语言:javascript
运行
复制
// Set the dependency resolver for Web API.
var webApiResolver = new AutofacWebApiDependencyResolver(container);
GlobalConfiguration.Configuration.DependencyResolver = webApiResolver;

3)向MVC控制器注册,

代码语言:javascript
运行
复制
// Set MVC DI resolver to use our Autofac container
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

这种方法适用于MVC以及WebAPI控制器,我可以简单地做。

代码语言:javascript
运行
复制
private IUnitOfWork<Listing> _uow;
public SearchController(IUnitOfWork<Listing> uow)
{
    _uow = uow;
}

希望它能对未来的人有所帮助。

票数 7
EN

Stack Overflow用户

发布于 2017-09-03 23:35:09

我也面临着同样的问题,问题是我对ContainerBuilder()对象使用Autofac代码示例,用于MVC控制器,而不是API。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33709710

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档