我一直在MVC3中使用Autofac并喜欢它。现在,我试图用MVC4来实现它。
我通过程序包管理器控制台安装了Autofac MVC4和Autofac WebApi的预发布版本(Install-Package Autofac.Mvc4 -Pre和Install-Package Autofac.WebApi -Pre)
我调整了IoC容器,如下所示:
private static void SetAutofacContainer()
{
var builder = new ContainerBuilder();
builder.RegisterControllers(Assembly.GetExecutingAssembly());
builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
builder.RegisterType<UnitOfWork>().As<IUnitOfWork>().InstancePerHttpRequest().InstancePerApiRequest();
builder.RegisterType<DatabaseFactory>().As<IDatabaseFactory>().InstancePerHttpRequest().InstancePerApiRequest();
builder.RegisterType<RepositoryWrapper>().As<RepositoryWrapper>().InstancePerHttpRequest().InstancePerApiRequest();
builder.RegisterType<ServiceWrapper>().As<ServiceWrapper>().InstancePerHttpRequest().InstancePerApiRequest();
// Repositories
builder.RegisterAssemblyTypes(typeof(UserRepository).Assembly).Where(t => t.Name.EndsWith("Repository")).AsImplementedInterfaces().InstancePerHttpRequest().InstancePerApiRequest();
// Services
builder.RegisterAssemblyTypes(typeof(UserService).Assembly).Where(t => t.Name.EndsWith("Service")).AsImplementedInterfaces().InstancePerHttpRequest().InstancePerApiRequest();
IContainer container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
GlobalConfiguration.Configuration.DependencyResolver = new AutofacWebApiDependencyResolver(container);
}
当我运行应用程序(通过访问API控制器)时,出现异常:
“ Controllers.UserController'没有默认的构造函数”
控制器如下所示:
namespace Controllers
{
[Authorize]
public class UserController : ApiController
{
private ServiceWrapper _services;
public UserController(ServiceWrapper services)
{
_services = services;
}
// GET api/user/{userrequest}
public IQueryable<User> Get(UserRequest request)
{
if (ModelState.IsValid)
{
'...
}
}
}
我想念什么吗?我设置不正确吗?任何帮助将不胜感激!
更新资料
我的API控制器位于同一解决方案的单独项目中。如果我将API控制器放置在我的主MVC项目中,那么它将起作用。有人可以启发我如何使Autofac在我的API项目中注册API控制器吗?
最佳答案
使用RegisterApiControllers
方法,您告诉Autofac它应该在哪里(在哪个程序集中)寻找您的ApiControllers
所以下面的调用:
builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
从当前程序集(项目)中注册
ApiControllers
。如果在其他项目中也有
ApiController
,则需要像这样使用它:builder.RegisterApiControllers(typeof(UserController).Assembly);
这意味着:在
ApiController
所在的程序集(项目)中注册所有UserController
。因此,即使一个程序集(项目)中有多个RegisterApiControllers
,每个程序集也只需要一个ApiController
。关于asp.net - 使用MVC4的Autofac: Controller 没有默认构造函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13423992/