跨项目注入EF Core Data Context时DbContext服务无法解析问题求助
你遇到的报错本质是AddDbContext<MyDataContext>()默认只会向DI容器注册MyDataContext这个具体类型的服务,不会自动注册它的父类DbContext。你的UnitOfWork构造函数依赖DbContext,DI容器找不到对应服务所以抛出解析失败异常。
以下是两种常用解决方案:
方案1:服务转发(改动最小,无需修改通用类库A)
直接在项目B的服务注册逻辑里,新增一行DbContext的服务注册,把对DbContext的请求转发到已经注册的MyDataContext实例即可,完整注册代码如下:
services.AddDbContext<MyDataContext>(options => { options.UseSqlServer("...<the connection string> ..."); }); // 新增这行做服务转发 services.AddScoped<DbContext>(sp => sp.GetRequiredService<MyDataContext>()); services.AddScoped<IUnitOfWork, UnitOfWork>();
这个方案适合单DbContext的项目,完全不需要修改项目A的现有代码,改动成本最低。
方案2:通用类库改为泛型实现(支持多DbContext场景,通用性更强)
如果你的通用类库A需要兼容同一个项目里有多个不同DbContext的场景,可以修改项目A中的UnitOfWork为泛型实现:
// 项目A中修改UnitOfWork定义 public class UnitOfWork<TContext> : IUnitOfWork where TContext : DbContext { private readonly TContext dc; private readonly IServiceProvider serviceProvider; public UnitOfWork(TContext dc, IServiceProvider serviceProvider) { this.dc = dc; this.serviceProvider = serviceProvider; } // 其余原有方法保持不变 }
然后在项目B中注册时指定具体的DbContext类型:
services.AddDbContext<MyDataContext>(options => { options.UseSqlServer("...<the connection string> ..."); }); services.AddScoped<IUnitOfWork, UnitOfWork<MyDataContext>>();
这个方案的优势是如果项目里有多个不同的DbContext,可以分别注册不同的UnitOfWork实例,灵活性更高。
内容的提问来源于stack exchange,提问作者Sudhashbahu
相关产品推荐
相关产品推荐

