我正在使用依赖注入编写web,在存储库和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<>的构造函数。在我添加模拟的单元测试之前,这一切都运行得很好,但是为了某种目的,我现在继续得到这个错误。我也注册了DependencyResolver
var container = builder.Build();
var resolver = new AutofacWebApiDependencyResolver(container);
config.DependencyResolver = resolver;
发布于 2016-10-28 22:25:17
由于在这个问题上有相当多的人没有任何答案,而且我不记得我是如何使它工作的,但我想分享一下在许多项目中一直非常有效的最新技术。
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;
}
希望它能对未来的人有所帮助。
发布于 2017-09-03 23:35:09
我也面临着同样的问题,问题是我对ContainerBuilder()对象使用Autofac代码示例,用于MVC控制器,而不是API。
Here is一个很好的示例--如何用ApiController配置它
https://stackoverflow.com/questions/33709710
复制相似问题