C# 无法从启动配置中委托的DI访问服务?
我正在尝试使用GenerateSiteMaps的委托方法向食人鱼网站地图添加一些项目 在这个方法中,我调用一个服务,该服务从实体框架上下文获取数据,然后缓存它。每当我尝试在委托方法中使用此服务时,就会出现一个错误,即dbContext已经被释放 System.AggregateException:'发生了一个或多个错误。(不能 访问已释放的上下文实例。此错误的常见原因是 正在处理从依赖项解析的上下文实例 然后尝试使用相同的上下文实例 在应用程序的其他位置。如果您正在呼叫 在上下文实例上“Dispose”,或使用 如果您使用的是依赖项注入,那么应该让 依赖注入容器负责处理上下文 实例 我尝试过使服务同步而不是异步,我尝试过等待结果并运行任务同步,但都不起作用 关于如何在启动时配置中在此委托中使用我的服务,有什么想法吗C# 无法从启动配置中委托的DI访问服务?,c#,asp.net-core,.net-core,dependency-injection,piranha-cms,C#,Asp.net Core,.net Core,Dependency Injection,Piranha Cms,我正在尝试使用GenerateSiteMaps的委托方法向食人鱼网站地图添加一些项目 在这个方法中,我调用一个服务,该服务从实体框架上下文获取数据,然后缓存它。每当我尝试在委托方法中使用此服务时,就会出现一个错误,即dbContext已经被释放 System.AggregateException:'发生了一个或多个错误。(不能 访问已释放的上下文实例。此错误的常见原因是 正在处理从依赖项解析的上下文实例 然后尝试使用相同的上下文实例 在应用程序的其他位置。如果您正在呼叫 在上下文实例上“Disp
services.AddScoped<ICachedSitemapService, CachedSitemapService>();
调用的服务为DbContext以获取项目:
private async Task<IEnumerable<SitemapItem>> GetSitemapClinics()
{
var spec = new ClinicSitemapSpecification();
//This throws error
var allClinics = await _clinicRepo.ListAsync(spec);
//code shortened for brevity, but returns a list.
}
我们(食人鱼团队)计划在版本10中重新设计钩子系统(必须是一个主要版本,因为它会破坏向后兼容性),以便在所有钩子中提供DI功能。不过,在此期间,以下内容应该可以解决您的问题
using (var scope = app.ApplicationServices.CreateScope())
{
var service = scope.ServiceProvider.GetService< ICachedSitemapService>();
}
使用(var scope=app.ApplicationServices.CreateScope())
{
var service=scope.ServiceProvider.GetService();
}
由于您的服务已注册为作用域,因此无法直接从根提供程序解析(如错误状态)。从控制器解析服务时,您处于请求作用域中,因此这里的解决方案是只创建一个允许您解析的作用域
致以最诚挚的问候如果您通过
var cachedSitemapService=app.ApplicationServices.GetService()手动解析实例会怎么样
那么您看到类似的错误了吗?实际上,这引发了另一个错误:System.InvalidOperationException:“无法从根提供程序解析作用域服务'xx.Interfaces.ICachedSitemapService'。”ICachedSitemapService
的解析在代码中的任何地方都有效吗o找出您的评论中提到的错误是由于没有为CachedItemaService
的依赖服务正确设置DI造成的?是的,它可以在例如控制器中正常工作,只需将其注入构造函数中即可。对于解释,它可以按需工作!
var items = await cachedSitemapService.GetCachedClinics().GetAwaiter().GetResult();
sitemap.AddRange(items);
using (var scope = app.ApplicationServices.CreateScope())
{
var service = scope.ServiceProvider.GetService< ICachedSitemapService>();
}