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