1. 程式人生 > 其它 >.NET MVC5 API AutoFac 出錯 An error occurred when trying to create a controller of type 'xxxController'. Make sure that the controller has a parameterless public constructor

.NET MVC5 API AutoFac 出錯 An error occurred when trying to create a controller of type 'xxxController'. Make sure that the controller has a parameterless public constructor

最近在改一個使用.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;

        }