2012-02-26 22 views
9

Używam autofac z MVC 3 przez pewien czas i kocham to. Niedawno uaktualniłem projekt do MVC 4 i wszystko wydaje się działać, z wyjątkiem ApiControllers. Otrzymuję następujący wyjątek.Autofac i ASP.NET Web API ApiController

An error occurred when trying to create a controller of type 'MyNamespace.Foo.CustomApiController'. Make sure that the controller has a parameterless public constructor. 

To wydaje mi się problemem z DI za pośrednictwem autofac. Czy czegoś brakuje lub czy coś jest w tym dziele. Wiem, że MVC4 właśnie wyszła i jest wersją beta, więc nie oczekuję wiele, ale pomyślałem, że może mi czegoś brakować.

Odpowiedz

10

Wydałem pakiety integracyjne Autofac na NuGet dla wersji Beta MVC 4 i Web API. Integracje utworzą zakres życia Autofac na żądanie kontrolera (kontroler MVC lub kontroler API w zależności od integracji). Oznacza to, że kontroler i jego zależności będą automatycznie usuwane na końcu każdego połączenia. Oba pakiety mogą być instalowane obok siebie w tym samym projekcie.

MVC 4

https://nuget.org/packages/Autofac.Mvc4

http://alexmg.com/post/2012/03/09/Autofac-ASPNET-MVC-4-(Beta)-Integration.aspx

Web API

https://nuget.org/packages/Autofac.WebApi/

http://alexmg.com/post/2012/03/09/Autofac-ASPNET-Web-API-(Beta)-Integration.aspx

Linki są teraz poprawione.

+1

Niestety, po wpisaniu tego komentarza okazało się, że używanie Autofac do MVC 4 RC i Web API RC w tym samym czasie nie działa. Dostaję ostrzeżenia kompilatora o typach, które nie występują w zestawach frameworków Web API. Musiałem skorzystać z odpowiedzi podanej przez @tugberk i ponownie zaimplementować narzędzie do rozwiązywania zależności, aby ominąć to zagadnienie. – NathanAldenSr

4

Właśnie skonfigurowałem to w jednej z moich aplikacji. Istnieją różne sposoby na to robi, ale lubię takie podejście:

Autofac and ASP.NET Web API System.Web.Http.Services.IDependencyResolver Integration

Najpierw stworzyłem klasę, która implementuje System.Web.Http.Services.IDependencyResolver interfejs.

internal class AutofacWebAPIDependencyResolver : System.Web.Http.Services.IDependencyResolver { 

    private readonly IContainer _container; 

    public AutofacWebAPIDependencyResolver(IContainer container) { 

     _container = container; 
    } 

    public object GetService(Type serviceType) { 

     return _container.IsRegistered(serviceType) ? _container.Resolve(serviceType) : null; 
    } 

    public IEnumerable<object> GetServices(Type serviceType) { 

     Type enumerableServiceType = typeof(IEnumerable<>).MakeGenericType(serviceType); 
     object instance = _container.Resolve(enumerableServiceType); 
     return ((IEnumerable)instance).Cast<object>(); 
    } 
} 

I mam innej klasy, która posiada swoje rejestracje:

internal class AutofacWebAPI { 

    public static void Initialize() { 
     var builder = new ContainerBuilder(); 
     GlobalConfiguration.Configuration.ServiceResolver.SetResolver(
      new AutofacWebAPIDependencyResolver(RegisterServices(builder)) 
     ); 
    } 

    private static IContainer RegisterServices(ContainerBuilder builder) { 

     builder.RegisterAssemblyTypes(typeof(MvcApplication).Assembly).PropertiesAutowired(); 

     builder.RegisterType<WordRepository>().As<IWordRepository>(); 
     builder.RegisterType<MeaningRepository>().As<IMeaningRepository>(); 

     return 
      builder.Build(); 
    } 
} 

Następnie zainicjowania go na Application_Start:

protected void Application_Start() { 

    //... 

    AutofacWebAPI.Initialize(); 

    //... 
} 

Mam nadzieję, że to pomaga.

Powiązane problemy