You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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。

额外检查点

  1. 确认仓储类定义:确保UserRepository明确实现IRepository<User>(即使基类已实现,显式声明可避免Scrutor识别遗漏):
public class UserRepository : BaseRepository<User>, IRepository<User>
{
    public UserRepository(YourDbContext context) : base(context)
    {
        // 自定义业务逻辑
    }
}
  1. 控制器注入正确性:检查控制器构造函数是否正确引用了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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 12:15:35