2012-11-16 72 views
14

我一直在使用MVC3中的Autofac并喜欢它。现在我试图用MVC4来实现它。Autofac与MVC4:控制器没有默认的构造函数

我通过软件包管理器控制台(安装,包装Autofac.Mvc4 - 售前和安装,包Autofac.WebApi - 预)

我调整好自己的IoC容器安装Autofac MVC4和Autofac的WebAPI的预发布版本如下:

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控制器吗?

+0

你能显示你的usercontroller类吗? –

+0

从哪里调用'SetAutofacContainer'方法? – nemesv

+0

在Global.asax的Application_Start()中 – Vocte

回答

23

随着RegisterApiControllers方法,你告诉Autofac在那里(其中组装),应该找你ApiControllers

所以下面的调用:

builder.RegisterApiControllers(Assembly.GetExecutingAssembly()); 

寄存器的ApiControllers从目前的组件(项目)。

如果你有ApiController S还以不同的项目,你需要使用它是这样的:

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

这意味着:注册所有ApiController形式的组件(项目)的UserController生活在那里。因此,即使您在装配(项目)中有多个ApiController,每个装配件也只需要一个RegisterApiControllers

+0

谢谢。这就是诀窍! – Vocte

+0

你的意思是'RegisterControllers'?似乎没有'RegisterApiControllers'方法。 – drozzy

+3

@drozzy对于MVC控制器有两种方法'RegisterControllers',web.api控制器有'RegisterApiController'。只有使用Autofac.WebAPi扩展名才能使用RegisterApiController。 – nemesv

相关问题