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

ASP.NET Core MVC中Lazy类型依赖注入报错的解决方法咨询

解决ASP.NET Core MVC中Lazy依赖注入的无参构造函数错误

问题根源

你遇到的System.MissingMemberException由两个核心问题导致:

  1. 控制器类型不匹配:SampleController的字段是Lazy<LazyTypeA>,但构造函数参数却是LazyTypeA,既会引发编译错误,也让DI容器无法注入预期的延迟加载实例。
  2. 默认DI不支持自动解析Lazy:ASP.NET Core自带DI容器不会自动处理Lazy<T>这类泛型包装类型,默认会尝试调用Lazy<T>的无参构造创建实例,而该构造要求泛型类型(此处为LazyTypeA)必须有公共无参构造,与你的LazyTypeA仅存在带依赖构造的情况冲突。

解决方案

步骤1:修正控制器的构造函数与调用逻辑

确保构造函数参数和字段类型一致,同时调用Lazy<T>实例时需通过Value属性获取实际对象:

public class SampleController
{
    private readonly Lazy<LazyTypeA> _lazyTypeA;
    
    // 修正参数类型为Lazy<LazyTypeA>
    public SampleController(Lazy<LazyTypeA> lazyTypeA)
    {
        _lazyTypeA = lazyTypeA;
    }
    
    public IActionResult TestAction()
    {
        // 通过Value属性获取延迟加载的实例并调用方法
        _lazyTypeA.Value.SomeMethod();
        return Ok();
    }
}

步骤2:配置正确的DI注册逻辑

在Startup.cs中,通过工厂方法让DI容器解析LazyTypeA的依赖后,再包装为Lazy<LazyTypeA>实例:

public void ConfigureServices(IServiceCollection services)
{
    // 注册基础依赖类
    services.AddTransient<DependentClass>();
    // 注册LazyTypeA,让DI自动注入它的依赖
    services.AddTransient<LazyTypeA>();
    // 注册Lazy<LazyTypeA>的工厂,利用服务提供者延迟创建实例
    services.AddTransient<Lazy<LazyTypeA>>(sp => 
        new Lazy<LazyTypeA>(() => sp.GetRequiredService<LazyTypeA>())
    );
    
    // 其他MVC相关配置
    services.AddControllersWithViews();
}

原理说明

Lazy<T>提供了接受Func<T>的构造函数,我们通过DI的服务提供者(IServiceProvider)获取已注入依赖的LazyTypeA实例,将该获取逻辑包装为Func<T>传递给Lazy<T>。这样Lazy<T>会在第一次访问Value属性时,通过DI容器创建带有正确依赖的LazyTypeA实例,避免了调用无参构造的逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 22:04:51