2012-11-16 12 views
14

Pracowałem z Autofac w MVC3 i uwielbiam go. Teraz próbuję go zaimplementować z MVC4.Autofac z MVC4: kontroler nie ma domyślnego konstruktora

zainstalowaniu wersji pre-release Autofac MVC4 i Autofac WebAPI przez menedżera pakietów Console (Install-Package Autofac.Mvc4 -Pre i Install-Package Autofac.WebApi -Pre)

ja poprawiłem kontenera IoC w następujący sposób:

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); 

    } 

Kiedy uruchomić aplikację (poprzez dostęp do kontrolera API) otrzymuję wyjątek: „Controllers.UserController” nie ma domyślnego konstruktora

Kontroler wygląda następująco:

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) 
     { 
      '... 
     } 
    } 
} 

Am I czegoś brakuje? Czy nie skonfigurowałem tego poprawnie? Każda pomoc będzie bardzo ceniona!

Aktualizacja

Mój kontroler API są w osobnym projekcie w tym samym roztworze. Jeśli umieściłem kontroler API w moim głównym projekcie MVC, to działa. Czy ktoś mógłby mnie oświecić, jak zmusić Autofac do zarejestrowania kontrolerów API w moim projekcie API?

+0

czy mógłbyś pokazać swoją klasę kontrolera użytkownika? –

+0

Skąd nazwa metody 'SetAutofacContainer'? – nemesv

+0

In Application_Start() w Global.asax – Vocte

Odpowiedz

23

Dzięki metodzie RegisterApiControllers Ci powiedzieć Autofac gdzie (w którym zespół) powinno to wyglądać dla ApiControllers

zatem następujące połączenia:

builder.RegisterApiControllers(Assembly.GetExecutingAssembly()); 

Zapisanie ApiControllers z obecnego zespołu (projektu).

Jeśli masz ApiController s również w innym projekcie trzeba używać go tak:

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

Czyli: zarejestruj wszystko formularz ApiController zespół (projekt), gdzie UserController życie. Tak więc potrzebujesz tylko jednego RegisterApiControllers na zestaw, nawet jeśli masz wiele ApiController w zespole (projekcie).

+0

Dziękuję. To wystarczy! – Vocte

+0

Masz na myśli 'RegisterControllers'? Wydaje się, że nie ma metody "RegisterApiControllers". – drozzy

+3

@drozzy Istnieją dwie metody "RegisterControllers" dla kontrolerów MVC i "RegisterApiController" dla kontrolerów web.api. 'RegisterApiController' jest dostępny tylko w przypadku korzystania z rozszerzenia Autofac.WebAPi. – nemesv

Powiązane problemy