You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让MVC框架调用StoreController的带参数构造函数?

解决MVC控制器依赖注入不触发带参构造的问题

问题核心

你的StoreController同时存在带参构造(注入IProductRepository)和无参构造,MVC框架默认会优先调用无参构造,导致productRepository未初始化,进而引发空引用错误。且IProductRepository本身依赖其他服务,无法直接实例化,必须通过依赖注入容器来完成解析。

解决方案

  1. 移除无参构造函数
    只保留带参构造,避免框架优先选择无参版本:

    private readonly IProductRepository productRepository;
    
    public StoreController(IProductRepository productRepository)
    {
        this.productRepository = productRepository;
    }
    
  2. 配置依赖注入容器
    以Unity容器为例,在Global.asax.cs的Application_Start方法中完成依赖注册:

    protected void Application_Start()
    {
        // 初始化容器
        var container = new UnityContainer();
        // 注册接口与具体实现的映射(替换为你的ProductRepository实际类名)
        container.RegisterType<IProductRepository, ProductRepository>();
        // 让MVC使用容器解析控制器
        DependencyResolver.SetResolver(new UnityDependencyResolver(container));
    
        // 保留原有MVC初始化代码
        AreaRegistration.RegisterAllAreas();
        RouteConfig.RegisterRoutes(RouteTable.Routes);
    }
    

    若使用Autofac、Ninject等其他容器,逻辑一致:先注册接口与实现的映射,再替换MVC默认的依赖解析器。

  3. 验证完整依赖链
    确保ProductRepository自身的依赖(即它的带参构造所需的服务)也已在容器中注册,否则容器无法完整解析整个依赖链,仍会导致构造失败。

额外注意

你的Index方法中用到了headphonesService和mouseService,如果这两个服务也是依赖注入的,同样需要在容器中注册对应的接口与实现,避免出现新的空引用问题。

内容的提问来源于stack exchange,提问作者Chaitanya Bathia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 00:15:30