最近在改一个使用.net frameWork4.6 的MVC5框架下开发的API项目时,想添加AutoFac进行Ioc注入管理时发生一个小坑。
根据网上查到的大多数资料后,编写的简单代码进行测试报错如下

请确保控制器具有无参数的公共构造函数 An error occurred when trying to create a controller of type 'xxxController'. Make sure that the controller has a parameterless public constructor."

在网上查许多资料,大多都是注册MVC控制器失败,注册失败是怎么解决网上太多现成解决方法我就不在这表述了.
根据资料提示改过许多方式也没有解决。最后在Nuget中机缘巧合看到有一个AotuFac.WebApi2才醒悟过来并解决问题。
虽然现在使用.net mvc5的人可能很少,大多都转到net core,但是遇到这问题还是分享一下,希望有不小心踩这坑的朋友能解决问题

测试代码如下:

先在Nuget中添加AutoFac.MVC5之后编写以下代码

User Model类
namespace MVCAPIAutoFac.Model
{  
  public class User
  {
     public int Id{set;get;}
     public string username{set;get;}
     public string password{set;get;}
  }
}
IUser接口
namespace MVCAPIAutoFac.DAO
{  
  public interface IUser
  {
     void add(Model.User user);
  }
}
IUser 实现
namespace MVCAPIAutoFac.DAO
{  
  public class User:IUser
  {
      public void add(Model.User user)
      {
        console.writleLine("add a user!!");
      }
  }
}
IUser 实现
namespace MVCAPIAutoFac.Controllers
{  
  public class UserController
  {
      DAO.IUser user;
      public UserController(DAO.IUser user)
      {
        this.user = user;
      }

      [HttpPost]
      public string add(Model.User user)
      {
        user.add(user);
        return "user controller add user!!";
      }
  }
}

在App_Start中添加AutoFacManager类

AutoFacManager
namespace MVCAPIAutoFac.App_Start
{
   public class AutoFacManager
   {
     public static void Register()
     {
              
              var builder = new ContainerBuilder();    
              //注册MVC控制器        
              builder.RegisterApiControllers(Assembly.GetExecutingAssembly());

              //注册Ioc注入关系
              builder.RegisterType<DAO.User>().As<DAO.IUser>();   

              var container = builder.Build();
              var webApiResolver = new AutofacWebApiDependencyResolver(container);
              DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

      }
  } 
}

最后在Global.asax中修改代码

Global.asax
 public class WebApiApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            GlobalConfiguration.Configure(WebApiConfig.Register);
            AutoFacManager.Register();

        }


       
    }

出错的原因在于Autofac为API项目提供AotuFac.WebApi2包,删除AutoFac.MVC5,添加上WebApi2包,修改AutoFacManager.Register()的代码如下即可。

 public static void Register()
        {

            var builder = new ContainerBuilder();
            //注册MVC控制器        
            builder.RegisterApiControllers(Assembly.GetExecutingAssembly());

            //注册Ioc注入关系
            builder.RegisterType<DAO.User>().As<DAO.IUser>();   
          

            var container = builder.Build();
            //****把以下改为使用AutofacWebApiDependencyResolver 解决问题 ****
            var webApiResolver = new AutofacWebApiDependencyResolver(container);
            GlobalConfiguration.Configuration.DependencyResolver = webApiResolver;

        }