2012-02-26 34 views
9

Tôi đã sử dụng autofac với MVC 3 trong một thời gian và thích nó. Gần đây tôi đã nâng cấp một dự án lên MVC 4 và mọi thứ dường như đang hoạt động ngoại trừ ApiControllers Web Api. Tôi nhận được ngoại lệ sau đây.Autofac và 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. 

Điều này dường như là vấn đề với DI qua autofac. Tôi đang thiếu một cái gì đó hoặc là có một cái gì đó trong các công trình. Tôi biết, MVC4 vừa mới ra mắt và là một phiên bản beta nên tôi không mong đợi nhiều lắm nhưng tôi nghĩ rằng tôi có thể thiếu một thứ gì đó.

Trả lời

10

Tôi đã phát hành các gói tích hợp Autofac trên NuGet cho các phiên bản Beta của MVC 4 và API Web. Các tích hợp sẽ tạo ra một phạm vi tuổi thọ Autofac cho mỗi yêu cầu điều khiển (điều khiển MVC hoặc bộ điều khiển API tùy thuộc vào sự tích hợp). Điều này có nghĩa là bộ điều khiển và các phụ thuộc của nó sẽ được tự động xử lý vào cuối mỗi cuộc gọi. Cả hai gói có thể được cài đặt song song trong cùng một dự án.

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

Liên kết hiện đã được sửa.

+1

Thật không may, khi đánh máy nhận xét này, có vẻ như sử dụng Autofac cho MVC 4 RC và Web API RC cùng một lúc không hoạt động. Tôi nhận được cảnh báo trình biên dịch về các loại không được tìm thấy trong các hội đồng khung API Web. Tôi đã phải sử dụng câu trả lời được cung cấp bởi @tugberk và triển khai lại trình phân giải phụ thuộc để giải quyết nó. – NathanAldenSr

4

Tôi vừa định cấu hình này trên một trong các ứng dụng của mình. Có nhiều cách khác nhau để làm việc đó nhưng tôi thích cách tiếp cận này:

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

Trước tiên tôi tạo ra một lớp mà thực hiện giao diện System.Web.Http.Services.IDependencyResolver.

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

Và tôi có một lớp học mà giữ đăng ký của tôi:

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

Sau đó, khởi tạo nó ở Application_Start:

protected void Application_Start() { 

    //... 

    AutofacWebAPI.Initialize(); 

    //... 
} 

Tôi hy vọng điều này sẽ giúp.

Các vấn đề liên quan