Autofac - убедитесь, что у контроллера есть открытый конструктор без параметров
Я знаю, что об этом спрашивали и отвечали раньше - причина, по которой я спрашиваю, состоит в том, что (я думаю) я попробовал все предложенные решения этой проблемы, но все еще не могу решить ее.
У меня есть проект ASP.NET Web API 2.0. У меня установлены зависимости Autofac, Autofac.Mvc5 и Autofac.WebApi2. Когда я пытаюсь вызвать контроллер API, я получаю следующую ошибку:
Произошла ошибка при попытке создать контроллер типа "MyController". Убедитесь, что у контроллера есть открытый конструктор без параметров.
В моем 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)
Когда я пытаюсь вызвать его, я получаю указанную ошибку о конструкторе. Что мне не хватает?
5 ответов
Я также столкнулся с этой ошибкой, и основной причиной было то, что одна из зависимостей контроллера не была правильно зарегистрирована в Autofac.
InnerException содержит детали (в моем случае это было Autofac.Core.DependencyResolutionException), а в ExceptionMessage была включена деталь этой зависимости. По линии:
"Произошла ошибка во время активации определенной регистрации... Не удалось разрешить параметр" XXXX "
Проверьте этот ответ.
Это помогает мне правильно настроить ContainerBuilder()
для контроллеров WebApi.
Если вы ищете здесь решение для такой ошибки, вы должны сначала проверить конфигурацию DependencyResolver.
Я столкнулся с той же проблемой, и проблема заключалась в том, что я использовал образцы кода Autofac для ContainerBuilder()
объект для контроллеров MVC, а не API.
Мой код для регистрации обоих типов контроллеров (MVC и 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
Assembly.GetCallingAssembly()
вернет вызывающую сборку, а не сборку, в которой определены ваши типы.
Assembly.GetCallingAssembly
метод
Возвращает сборку метода, который вызвал текущий выполняемый метод.
Для того, чтобы это работало, вы должны использовать typeof(IocConfig).Assembly
или же Assembly.GetExecutingAssembly
Возможно, вам не хватает конфигурации вызова из файла WebApiConfig.cs:
IocConfigurator.ConfigureDependencyInjection(конфигурация);
ConfigureDependencyInjection может быть таким:
public static void ConfigureDependencyInjection(HttpConfiguration config)
{
var builder = new ContainerBuilder();
// Register your Web API controllers.
builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
// OPTIONAL: Register the Autofac filter provider.
builder.RegisterWebApiFilterProvider(config);
// OPTIONAL: Register the Autofac model binder provider.
builder.RegisterWebApiModelBinderProvider();
// Set the dependency resolver to be Autofac.
var container = builder.Build();
config.DependencyResolver = new AutofacWebApiDependencyResolver(container);
}
Я думаю, что вам не хватает регистрации автозапуска в коде запуска приложения.
Использовать этот:
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
Откройте файл ServiceModule
Зарегистрируйте интерфейс и имя сервиса, указанные в контроллере.
Пример приведен ниже:
. Builder.RegisterType() Как ();