【发布时间】:2020-05-29 14:58:17
【问题描述】:
使用 MediatR 在 CQRS 中工作,在启动时我注册了 DomainEventDispatcher、存储库、查询和事件处理程序以及服务。 存储库与 DbContext 一起使用,我的服务也是如此。一切 CRUD 工作,直到我将我的服务注入控制器, 我收到以下错误: 尝试激活“服务”时无法解析“IDbContext”类型的服务。
我觉得很奇怪
services.AddDbContext<DbContext>(options =>
{
options.UseLazyLoadingProxies().UseSqlServer(cs);
options.EnableSensitiveDataLogging(true);
});
在注册以下内容之前:
services
.AddScoped<IDomainEventsDispatcher, DomainEventsDispatcher>()
.AddScoped<IRepo<ToDoItem>, EfCRepo<ToDoItem>>()
.AddMediatR(cfg => cfg.AsScoped(), typeof(ToDoItemsQueryHandler).GetTypeInfo().Assembly)
.AddScoped<INotificationHandler<Event>, EventHandler>()
.AddMediatR(cfg => cfg.AsScoped(), typeof(EventHandler).GetTypeInfo().Assembly);
.AddScoped<IService, Service>()
当我尝试使用
对 IDbContext 进行 AddScopedAddScoped<IDbContext, DbContext>()
我的上下文为空,无法再从 Db 获取实体。
我觉得奇怪的是,我需要为服务添加范围 IDbContext, 看到 Repos 也可以与 DbContext 一起使用,而无需解析 IDbContext 类型的服务。
我查看了 MediatR 官方文档,找不到任何关于如何注册服务的信息, 和谷歌搜索“注册服务 MediatR 启动”主要重定向到其他问题, 因此,非常欢迎你们提供任何帮助/见解!
我提出了一个新问题,因为我可以依赖注入,但对于服务来说似乎有所不同。大多数关于在启动时注册的 S/O 问题对我来说都比较笼统。
提前致谢!
【问题讨论】:
-
对象图中的依赖项之一显式依赖于
IDbContext。而且由于容器不知道该类型,它不知道如何解决其注入实现。 -
改为
services.AddDbContext<IDbContext, DbContext>。 -
感谢您的指点和 sanityCheck @Nkosi
标签: c# dependency-injection service cqrs mediatr