ASP.NET Core MVC中Lazy类型依赖注入报错的解决方法咨询
解决ASP.NET Core MVC中Lazy依赖注入的无参构造函数错误
问题根源
你遇到的System.MissingMemberException由两个核心问题导致:
- 控制器类型不匹配:
SampleController的字段是Lazy<LazyTypeA>,但构造函数参数却是LazyTypeA,既会引发编译错误,也让DI容器无法注入预期的延迟加载实例。 - 默认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
相关产品推荐
相关产品推荐

