2016-05-31 6 views
9

Я знаю, что его спрашивали и отвечали раньше - причина, о которой я прошу, заключается в том, что (я думаю) я пробовал все предлагаемые решения этой проблемы, но до сих пор не могу решить Это.Autofac - Убедитесь, что контроллер имеет безкоммертный публичный конструктор

У меня есть проект ASP.NET Web API 2.0. У меня установлены Autofac, Autofac.Mvc5 и Autofac.WebApi2. Когда я пытаюсь вызвать контроллер API, я получаю следующее сообщение об ошибке:

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

В моем Global.asax у меня есть вызов IocConfig.Config() который я помещенный внутрь 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); 
    } 
} 

И это конструктор MyController:

public MyController(IMyLogger logger) 

Когда я пытаюсь вызвать его, я получаю указанную ошибку о конструкторе. Что мне не хватает?

+0

Было ли это решить? У меня такая же проблема. Я использую Asp.Net Web api2.0 – Kanchana

ответ

-1

Я думаю, вам не хватает регистрации автозапуска при стартовом коде приложения.

Используйте это:

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

Для получения более подробной информации см этот блог http://www.codeproject.com/Articles/808894/IoC-in-ASP-NET-MVC-using-Autofac

+0

Как я писал в оригинальном вопросе «В моем Global.asax у меня есть вызов IocConfig.Config(), который я разместил внутри» - он даже разбивается в самой конфигурации, поэтому он определенно работает. – developer82

+0

его следует вызывать внутри Application_Start, потому что он будет вызываться один раз для жизни домена приложения. –

+0

Он называется один раз. Это как указано в «Application_Start». Кроме того, перемещение кода вне его собственного метода непосредственно в «Application_Start» по-прежнему не работает. – developer82

3

Assembly.GetCallingAssembly() возвращает узел вызова, а не сборку, где определяется ваши типы.

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

Для того, чтобы сделать это работает, вы должны использовать typeof(IocConfig).Assembly или Assembly.GetExecutingAssembly

+0

Я уже пробовал 'Assembly.GetExecutingAssembly' также попытался предложить вам попробовать' typeof (IocConfig) .Assembly' - по-прежнему такая же ошибка – developer82

6

я встретил эту ошибку, а также и основная причина в том, что одна из зависимостей Контролера не был правильно зарегистрирован в Autofac.

У InnerException есть детали (в моем случае это было исключение Autofac.Core.DependencyResolutionException), а ExceptionMessage включил деталь этой зависимости. Вдоль линий:

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

3

Проверить this answer.
Это помогает мне настроить правильные ContainerBuilder() для контроллеров WebApi.

Если вы ищете здесь решение для такой ошибки, вы должны сначала проверить свою конфигурацию DependencyResolver.

Я столкнулся с той же проблемой, и проблема заключалась в том, что я использовал образцы кода Autofac для объекта ContainerBuilder() для контроллеров MVC, а не API.

Мой код для регистра как тип контроллеров (MVC и Апи):

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 

 Смежные вопросы

  • Нет связанных вопросов^_^