2012-11-16 124 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

相關問題