.NET Core 2.0激活控制器时无法解析泛型服务依赖
问题分析与解决方案
你遇到的这个InvalidOperationException是因为依赖注入容器无法找到泛型接口IDataRepository<Token, long>的实现注册,而你尝试的注册方式没有正确指定泛型参数,导致类型转换错误。
错误原因
你的IDataRepository<TEntity, U>是一个泛型接口,TokenManager实现的是该接口的具体版本IDataRepository<Token, long>。但你在ConfigureServices中写的注册代码:
services.AddScoped<IDataRepository, TokenManager>();
这里的IDataRepository没有指定泛型参数,编译器无法将它与TokenManager实现的具体泛型接口匹配,因此会出现转换错误。
正确的注册方式
你需要在注册时明确指定泛型接口的具体类型参数,告诉DI容器要将IDataRepository<Token, long>映射到TokenManager:
services.AddScoped<IDataRepository<Token, long>, TokenManager>();
额外注意事项
另外,我注意到你的TokenManager类并没有完全实现IDataRepository<TEntity, U>接口的所有方法(缺少Update和Delete),虽然这不是当前DI错误的原因,但后续运行时会因为接口未被完整实现而抛出异常。你需要补充这两个方法的实现,比如:
public long Update(long id, Token token) { var existingToken = ctx.Token.FirstOrDefault(b => b.TokenId == id); if (existingToken == null) return 0; // 或者抛出NotFoundException // 根据实际需求更新Token的属性 existingToken.TokenClientType = token.TokenClientType; // 其他需要更新的属性... ctx.SaveChanges(); return id; } public long Delete(long id) { var token = ctx.Token.FirstOrDefault(b => b.TokenId == id); if (token == null) return 0; ctx.Token.Remove(token); ctx.SaveChanges(); return id; }
这样修改后,DI容器就能正确解析TokenController依赖的IDataRepository<Token, long>,API调用时的错误就会消失。
内容的提问来源于stack exchange,提问作者Jason
相关产品推荐
相关产品推荐

