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

使用DDD开发待办列表,脚手架生成CRUD页面遇服务解析错误

问题:使用DDD开发待办程序时,脚手架生成CRUD页面出现服务解析错误

我正在用领域驱动设计(DDD)开发一个待办列表程序,尝试用Visual Studio脚手架为待办事项生成CRUD页面时,遇到了错误:「Visual Studio unable to resolve service for type foo while attempting to activate bar」。

相关代码及信息

Program.cs 片段

builder.Services.AddServerSideBlazor();
builder.Services.AddInfrastructure();
builder.Services.AddScoped<ITDRepository, ITDRepository>();

Infrastructure项目的扩展方法 AddInfrastructure

public static IServiceCollection AddInfrastructure(this IServiceCollection services)
{
    services.AddDbContext<TDContext>(options => 
        options.UseSqlServer("Some long-ass SQL name", b => b.MigrationsAssembly("FirstDDD")));

    services.AddScoped<ITDRepository, TDRepository>();
    return services;
}

Domain项目的 ToDo 实体

public class ToDo
{
    public string Name { get; set; } = string.Empty;
    public string Description { get; set; }
    public int Id { get; set; }
}

Infrastructure项目的 TDContext

public class TDContext : DbContext
{
    public TDContext(DbContextOptions<TDContext> options):base(options)
    {
        
    }
    public DbSet<ToDo> ToDos { get; set; }
}

补充细节

  • 曾参考其他问题添加builder.Services.AddScoped<ITDRepository, ITDRepository>(),但问题未解决;
  • 解决方案包含4个项目:FirstDDD(启动项目)、Application、Domain、Infrastructure;TDContext定义在Infrastructure,在Program.cs中激活;
  • 迁移代码程序集设置为FirstDDD,而上下文在Infrastructure,是否会引发问题?

问题分析与解决

1. 修复错误的服务注册

你在Program.cs中重复注册ITDRepository的代码完全错误:AddScoped<ITDRepository, ITDRepository>()是将接口映射到自身,接口无法被实例化,这会直接导致服务解析失败。直接删除这行代码即可——因为Infrastructure项目的AddInfrastructure()方法已经正确注册了ITDRepository的实现类TDRepository,重复注册反而会干扰服务容器。

2. 确保脚手架能访问到DbContext

Visual Studio脚手架生成CRUD页面时,需要正确识别你的TDContext:

  • 确认启动项目FirstDDD已正确引用Infrastructure项目;
  • 生成脚手架时,在向导中选择TDContext作为数据上下文,确保向导能读取到它的构造函数依赖(DbContextOptions<TDContext>)。

3. 迁移程序集设置的影响

将迁移程序集指定为FirstDDD是EF Core的常规操作,不会导致服务解析错误,只要你已经成功生成迁移并配置了正确的连接字符串,这部分无需调整。

4. 额外排查点

  • 检查ITDRepository和TDRepository的命名空间是否在启动项目中可访问,避免引用缺失;
  • 确认TDRepository的构造函数正确注入了TDContext(如果它依赖上下文的话);
  • 清理解决方案并重新编译所有项目,排除因编译错误导致的服务注册失败。

内容的提问来源于stack exchange,提问作者GooseyLoosey

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 15:40:32