Autofac - 确保控制器具有无参数的公共构造函数

时间:2016-05-31 09:36:58

标签: c# asp.net autofac autofac-configuration

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

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

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

6 个答案:

答案 0 :(得分:15)

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

InnerException有详细信息(在我的例子中是一个Autofac.Core.DependencyResolutionException),ExceptionMessage包含了这个依赖项的细节。沿着:

  

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

答案 1 :(得分:8)

检查this answer
它帮助我为WebApi控制器配置正确的ContainerBuilder()

如果您在此处查找解决方案,请首先检查您的DependencyResolver配置。

我遇到了同样的问题,问题是我为MVC控制器而不是API使用了ContainerBuilder()对象的Autofac代码示例。

我的代码用于注册两种类型的控制器(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

答案 2 :(得分:3)

System.IO.Path.Combine将返回调用程序集,而不是定义类型的程序集。

  

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

为了使其有效,您应该使用using System.IO; ... if (!string.IsNullOrEmpty(_location.FolderName)) { name = Path.Combine(_location.FolderName, name); } ObjectsList

答案 3 :(得分: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

答案 4 :(得分:0)

您可能缺少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);

        }

答案 5 :(得分:-1)

打开ServiceModule文件

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

示例如下: -

builder.RegisterType()为();

相关问题