注册依赖后仍触发InvalidOperationException,问题原因是什么?
问题原因与解决办法
你注册依赖时用的是builder.Services.AddSingleton<IFoo, Foo>(),这表示你向DI容器注册的是接口IFoo,对应的实现类是Foo,但DI容器并不会自动注册具体类Foo本身。当你在路由处理方法里用[FromServices] Foo f请求Foo类型的服务时,容器找不到这个类型的注册项,就会抛出InvalidOperationException。
两种解决方式:
方式一:修改路由方法,依赖接口IFoo
把参数类型改成IFoo,DI容器就能匹配到已注册的服务:
app.MapGet("/", ([FromServices] IFoo f) => { f.Print(); return "Hello World!"; });
方式二:额外注册Foo类型的服务
如果确实需要直接注入Foo,可以在注册时添加对Foo的单独注册:
builder.Services.AddSingleton<IFoo, Foo>(); builder.Services.AddSingleton<Foo>(); // 新增该行注册具体类
更推荐方式一,因为依赖注入的核心思想是面向接口编程,依赖接口而非具体实现能降低代码耦合度,也更便于后续扩展和测试。
内容的提问来源于stack exchange,提问作者D G
相关产品推荐
相关产品推荐

