MVC 5注入Repository报No parameterless constructor构造函数错误如何解决
错误原因
ASP.NET MVC 5(基于.NET Framework)默认没有内置依赖注入容器,控制器实例化时默认会查找无参构造函数,你仅声明了带ISenderRepository参数的构造函数,系统无法找到匹配的构造方法就会抛出 No parameterless constructor defined for this object 异常。
解决步骤(以常用的Unity.Mvc5 DI容器为例)
第一步:安装NuGet包
在NuGet包管理器中搜索安装Unity.Mvc5,该包已经适配了MVC5的依赖解析规则。第二步:在全局启动类中注册服务
打开Global.asax.cs,在Application_Start方法中添加DI配置代码:
protected void Application_Start() { // 原有MVC配置代码保留,比如AreaRegistration、FilterConfig、RouteConfig、BundleConfig的注册 AreaRegistration.RegisterAllAreas(); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); // 新增DI配置 var container = new UnityContainer(); // 注册接口与实现类的映射 container.RegisterType<ISenderRepository, SenderRepository>(); // 注册EF Core DbContext,使用请求级生命周期避免并发问题 container.RegisterType<你的DbContext类名>(new PerRequestLifetimeManager()); // 替换MVC默认的依赖解析器 DependencyResolver.SetResolver(new UnityDependencyResolver(container)); }
注意将代码中的你的DbContext类名替换为你实际的DbContext类名称,SenderRepository替换为你实现ISenderRepository接口的具体类名称。
如果你习惯使用其他DI容器(如Autofac、Ninject),也可以安装对应适配MVC5的集成包,整体配置逻辑一致:完成服务与接口的映射注册,替换MVC默认的依赖解析器即可。
- 第三步:校验依赖链注册完整性
确保你所有依赖链上的服务都完成了注册,比如SenderRepository构造函数如果注入了DbContext,那么DbContext必须在容器中完成注册,否则容器解析服务时会继续抛出异常。
注意事项
- 不要手动给控制器添加无参构造函数,该操作虽然可以规避当前报错,但会导致
ISenderRepository无法被正确注入,后续调用时会出现空引用异常。 - EF Core 3.0在.NET Framework 4.7.2环境中运行时,DbContext建议使用请求级生命周期,不要使用单例生命周期,避免多请求并发访问时出现数据读写异常。
内容的提问来源于stack exchange,提问作者Sigit Budi
相关产品推荐
相关产品推荐

