使用MVC4的Autofac:控制器没有默认构造函数

Voc*_*cte 15 asp.net dependency-injection autofac asp.net-mvc-4

我一直在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);

    }
Run Code Online (Sandbox Code Playgroud)

当我运行应用程序(通过访问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)
        {
          '...
        }  
    } 
}
Run Code Online (Sandbox Code Playgroud)

我错过了什么吗?我没有正确设置吗?任何帮助将不胜感激!

更新

我的API控制器位于同一解决方案中的单独项目中.如果我将API控制器放在我的主MVC项目中,它就可以工作.有人可以请教我如何让Autofac在我的API项目中注册API控制器吗?

nem*_*esv 25

通过这种RegisterApiControllers方法,您可以告诉Autofac它应该在哪里(在哪个程序集中)ApiControllers

所以接下来的电话:

builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
Run Code Online (Sandbox Code Playgroud)

注册ApiControllers从目前的组件(项目).

如果你还有ApiController一个不同的项目,你需要像这样使用它:

builder.RegisterApiControllers(typeof(UserController).Assembly);
Run Code Online (Sandbox Code Playgroud)

这意味着:注册所有ApiController形式组件(项目),其中UserController生活.因此,RegisterApiControllers即使ApiController组件(项目)中有多个组件,每个组件也只需要一个.

  • @drozzy有两个方法`RegisterControllers`用于MVC控制器,`RegisterApiController`用于web.api控制器.只有使用Autofac.WebAPi扩展名时,`RegisterApiController`才可用. (3认同)