2016-05-31 14 views
9

Tôi biết nó đã được hỏi và trả lời trước đó - lý do tôi hỏi là vì (tôi nghĩ) tôi đã thử tất cả các giải pháp được đề xuất cho vấn đề này nhưng vẫn không thể giải quyết nó.Autofac - Đảm bảo rằng bộ điều khiển có một hàm tạo công khai tham số

Tôi có dự án ASP.NET Web API 2.0. Tôi đã cài đặt các phụ thuộc Autofac, Autofac.Mvc5 và Autofac.WebApi2. Khi tôi cố gắng gọi một bộ điều khiển API tôi nhận được lỗi sau:

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

Trong Global.asax của tôi, tôi có một cuộc gọi đến IocConfig.Config() mà tôi đã đặt bên App_Start:

public static class IocConfig 
{ 
    public static void Config() 
    { 
     var builder = new ContainerBuilder(); 

     builder.RegisterType<MyLogger>().As<IMyLogger>(); 

     builder.RegisterApiControllers(Assembly.GetCallingAssembly()); 
     builder.RegisterWebApiFilterProvider(GlobalConfiguration.Configuration); 

     WebApiApplication.Container = builder.Build(); 

     DependencyResolver.SetResolver(
      new AutofacDependencyResolver(WebApiApplication.Container)); 
     GlobalConfiguration.Configuration.DependencyResolver = 
      new AutofacWebApiDependencyResolver(WebApiApplication.Container); 
    } 
} 

Và đây là các nhà xây dựng cho MyController:

public MyController(IMyLogger logger) 

Khi tôi cố gọi nó, tôi nhận được lỗi được chỉ định về hàm tạo. Tôi đang thiếu gì?

+0

Đã được này giải quyết? Tôi gặp vấn đề tương tự. Tôi đang sử dụng Asp.Net Web api2.0 – Kanchana

Trả lời

-1

Tôi nghĩ bạn đang thiếu đăng ký autofac tại mã khởi động ứng dụng.

Sử dụng này:

protected void Application_Start() 
{ 
    IocConfig.Config(); 
    AreaRegistration.RegisterAllAreas(); 
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
    RouteConfig.RegisterRoutes(RouteTable.Routes); 
    BundleConfig.RegisterBundles(BundleTable.Bundles); 
} 

Để biết thêm thông tin chi tiết, tham khảo blog này http://www.codeproject.com/Articles/808894/IoC-in-ASP-NET-MVC-using-Autofac

+0

Như tôi đã viết trong câu hỏi ban đầu "Trong Global.asax của tôi tôi có một cuộc gọi đến IocConfig.Config() mà tôi đã đặt bên trong" - Nó thậm chí phá vỡ trong cấu hình chính nó - vì vậy nó chắc chắn chạy. – developer82

+0

nó sẽ được gọi bên trong Application_Start bởi vì điều này sẽ được gọi một lần trong suốt thời gian tồn tại của miền ứng dụng. –

+0

Nó được gọi một lần. Nó được đề cập trong 'Application_Start'. Ngoài ra, di chuyển mã bên ngoài phương thức riêng của nó trực tiếp đến 'Application_Start' vẫn không hoạt động. – developer82

3

Assembly.GetCallingAssembly() sẽ trở lại lắp ráp gọi, không phải là lắp ráp, nơi các loại của bạn được xác định.

Assembly.GetCallingAssembly Method
Returns the Assembly of the method that invoked the currently executing method.

Để làm cho nó hoạt động, bạn nên sử dụng typeof(IocConfig).Assembly hoặc Assembly.GetExecutingAssembly

+0

Tôi đã thử 'Assembly.GetExecutingAssembly' cũng đã thử bạn đề xuất thử' typeof (IocConfig) .Assembly' - vẫn là lỗi tương tự – developer82

6

tôi gặp phải lỗi này là tốt và nguyên nhân gốc rễ là một trong những phụ thuộc của bộ điều khiển không được đăng ký đúng trong Autofac.

InnerException có chi tiết (trong trường hợp của tôi đó là một Autofac.Core.DependencyResolutionException) và ExceptionMessage bao gồm các chi tiết của sự phụ thuộc này. Dọc theo các dòng:

"An error occurred during the activation of a particular registration... Cannot resolve parameter 'XXXX'

3

Kiểm tra this answer.
Nó giúp tôi cấu hình đúng ContainerBuilder() cho bộ điều khiển WebApi.

Nếu bạn đang tìm kiếm giải pháp cho lỗi như vậy, bạn nên kiểm tra Cấu hình DependencyResolver trước tiên.

Tôi gặp phải vấn đề tương tự và vấn đề là tôi đang sử dụng mẫu mã Autofac cho đối tượng ContainerBuilder() cho bộ điều khiển MVC chứ không phải API.

Mã của tôi cho đăng ký cả hai loại điều khiển (MVC và Api):

var builder = new ContainerBuilder(); 
builder.RegisterControllers(Assembly.GetExecutingAssembly()); //Register MVC Controllers 
builder.RegisterApiControllers(Assembly.GetExecutingAssembly()); //Register WebApi Controllers 
builder.RegisterType<Type>().As<IType>(); 

var container = builder.Build(); 

DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); //Set the MVC DependencyResolver 
GlobalConfiguration.Configuration.DependencyResolver = new AutofacWebApiDependencyResolver((IContainer)container); //Set the WebApi DependencyResolver 
Các vấn đề liên quan