使用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
相关产品推荐
相关产品推荐

