如何在依赖注入(DI)容器中注册委托及EF数据库查询实现
解决方法
首先得把NameCheckService本身注册到依赖注入容器中,因为它依赖MyContext,需要容器管理它的生命周期与依赖注入:
services.AddScoped<NameCheckService>();
接着注册你的委托,通过容器获取NameCheckService实例,再把它的IsNameAvailable方法绑定为委托:
services.AddScoped<Services.INameAvailable>(sp => sp.GetRequiredService<NameCheckService>().IsNameAvailable);
为什么原写法不生效?
你之前尝试的NameCheckService.IsNameAvailable是实例方法而非静态方法,直接引用必须依赖NameCheckService的实例才能生成委托。而DI容器需要负责初始化这个实例(因为它依赖MyContext),所以必须通过IServiceProvider(即代码中的sp参数)获取已初始化的NameCheckService实例,再将其方法赋值给委托。
补充说明
- 这里用
AddScoped是因为MyContext通常也是Scoped生命周期,保持一致可避免生命周期不匹配的问题; - 若委托需要和
NameCheckService同生命周期,Scoped是合适选择;若要Singleton,需确保NameCheckService和MyContext的生命周期支持(不过DbContext一般不建议设为Singleton)。
内容的提问来源于stack exchange,提问作者LockTar
相关产品推荐
相关产品推荐

