.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
阿新 • • 發佈:2022-04-21
最近在改一個使用.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;
}