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

前端之家收集整理的这篇文章主要介绍了asp.net – 使用MVC4的Autofac:控制器没有默认构造函数前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我一直在使用MVC3中的Autofac,并喜欢它.现在我试图用MVC4实现它.

我通过软件包管理器控制台(Install-Package Autofac.Mvc4 -Pre和Install-Package Autofac.WebApi -Pre)安装了Autofac MVC4和Autofac WebApi的预发行版本.

我调整了我的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控制器?

解决方法

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

所以下面来电:

builder.RegisterApiControllers(Assembly.GetExecutingAssembly());

从当前程序集(project)注册ApiController.

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

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

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

猜你在找的asp.Net相关文章