使用Scrutor实现泛型仓储依赖注入时出现服务解析失败问题
解决Scrutor泛型仓储依赖注入解析失败问题
直接给出可解决问题的DI配置代码,将其添加到API项目的Program.cs中:
builder.Services.Scan(scan => scan // 定位到Data项目的程序集,用Data项目内任意类型即可,这里用BaseRepository<User>做锚点 .FromAssemblyOf<BaseRepository<User>>() // 筛选所有实现了泛型接口IRepository<>的仓储类 .AddClasses(classes => classes.AssignableTo(typeof(IRepository<>))) // 将筛选出的类以它们实现的接口注册到DI容器 .AsImplementedInterfaces() // 设置生命周期,Web API中推荐用Scoped,和DbContext生命周期保持一致 .WithScopedLifetime());
关键配置说明
- 定位目标程序集:
FromAssemblyOf<BaseRepository<User>>是最可靠的扫描方式,能确保Scrutor精准找到存放仓储类的Data项目程序集,避免硬编码程序集名称引发的路径错误。 - 匹配泛型实现:
AssignableTo(typeof(IRepository<>))会自动匹配所有实现了IRepository<T>泛型接口的具体类(比如你的UserRepository),而非单个固定的IRepository<User>。 - 关联接口与实现:
AsImplementedInterfaces()会让每个具体仓储类自动绑定它实现的所有接口,这样DI容器就能正确将IRepository<User>映射到UserRepository。
额外检查点
- 确认仓储类定义:确保
UserRepository明确实现IRepository<User>(即使基类已实现,显式声明可避免Scrutor识别遗漏):
public class UserRepository : BaseRepository<User>, IRepository<User> { public UserRepository(YourDbContext context) : base(context) { // 自定义业务逻辑 } }
- 控制器注入正确性:检查控制器构造函数是否正确引用了Core项目的
User类型:
public class GetUsersController : ControllerBase { private readonly IRepository<User> _userRepository; public GetUsersController(IRepository<User> userRepository) { _userRepository = userRepository; } // 控制器动作逻辑 }
常见错误排查
- 若仍报错,先确认
FromAssemblyOf的锚点类型确实属于Data项目,避免扫描到错误程序集。 - 若存在多个类实现
IRepository<User>,可通过AddClasses的筛选条件缩小范围,例如classes.Where(type => type.Name.EndsWith("Repository"))。
内容的提问来源于stack exchange,提问作者CodeSmith
相关产品推荐
相关产品推荐

