20

我知道它以前被问过并回答过 - 我问的原因是因为(我认为)我尝试了所有建议的解决方案,但仍然无法解决这个问题。

我有一个 ASP.NET Web API 2.0 项目。我安装了Autofac,Autofac.Mvc5Autofac.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)

当我尝试调用它时,我得到了关于构造函数的指定错误。我错过了什么?

4

6 回答 6

24

我也遇到了这个错误,根本原因是控制器的依赖项之一没有在 Autofac 中正确注册。

InnerException 具有详细信息(在我的情况下,它是 Autofac.Core.DependencyResolutionException),而 ExceptionMessage 包含此依赖关系的详细信息。沿着:

“在激活特定注册期间发生错误......无法解析参数'XXXX'

于 2016-09-21T05:46:56.163 回答
15

检查这个答案
它可以帮助我正确配置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
于 2017-09-03T23:40:00.050 回答
3

Assembly.GetCallingAssembly()将返回调用程序集,而不是定义类型的程序集。

Assembly.GetCallingAssembly方法
返回调用当前执行方法的方法的程序集。

为了使其正常工作,您应该使用typeof(IocConfig).AssemblyAssembly.GetExecutingAssembly

于 2016-05-31T10:14:53.950 回答
1

您可能缺少 WebApiConfig.cs 文件中的调用配置:

IocConfigurator.ConfigureDependencyInjection(config);

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

        }
于 2019-11-06T14:22:37.623 回答
0

我认为您缺少在应用程序启动代码中注册 autofac。

用这个:

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

于 2016-05-31T09:54:03.013 回答
-1

打开你的 ServiceModule 文件

注册控制器中提到的接口和服务名称。

示例如下:-

builder.RegisterType().As();

于 2018-06-01T14:02:14.010 回答