【问题标题】:Autofac with MVC4: controller does not have a default constructorAutofac with MVC4:控制器没有默认构造函数
【发布时间】:2012-11-16 20:32:30
【问题描述】:

我一直在 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 控制器吗?

【问题讨论】:

  • 你能展示你的用户控制器类吗?
  • 从哪里调用SetAutofacContainer 方法?
  • 在 Global.asax 的 Application_Start() 中

标签: asp.net dependency-injection asp.net-mvc-4 autofac


【解决方案1】:

使用 RegisterApiControllers 方法,您可以告诉 Autofac 它应该在哪里(在哪个程序集中)寻找您的 ApiControllers

所以下面的调用:

builder.RegisterApiControllers(Assembly.GetExecutingAssembly());

从当前程序集(项目)注册ApiControllers

如果您在另一个项目中也有ApiControllers,则需要像这样使用它:

builder.RegisterApiControllers(typeof(UserController).Assembly);

这意味着:在UserController 所在的程序集(项目)中注册所有 ApiController。因此,即使您在程序集(项目)中有多个 ApiController,每个程序集也只需要一个 RegisterApiControllers

【讨论】:

  • 你的意思是RegisterControllers?好像没有RegisterApiControllers 方法。
  • @drozzy 有两种方法 RegisterControllers 用于 MVC 控制器,RegisterApiController 用于 web.api 控制器。 RegisterApiController 仅在您使用 Autofac.WebAPi 扩展时可用。
  • @nemesv 哦,谢谢!即使我确实必须同时致电RegisterControllersRegisterApiControllers。很奇怪。
  • @nemesv 你知道是否有任何问题:builder.RegisterControllers(System.Reflection.Assembly.GetExecutingAssembly()); builder.RegisterApiControllers(System.Reflection.Assembly.GetExecutingAssembly());同时?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-06
  • 2023-03-20
  • 2013-07-01
  • 1970-01-01
  • 2016-07-18
相关资源
最近更新 更多