Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法从启动配置中委托的DI访问服务?_C#_Asp.net Core_.net Core_Dependency Injection_Piranha Cms - Fatal编程技术网

C# 无法从启动配置中委托的DI访问服务?

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

我正在尝试使用GenerateSiteMaps的委托方法向食人鱼网站地图添加一些项目

在这个方法中,我调用一个服务,该服务从实体框架上下文获取数据,然后缓存它。每当我尝试在委托方法中使用此服务时,就会出现一个错误,即dbContext已经被释放

System.AggregateException:'发生了一个或多个错误。(不能 访问已释放的上下文实例。此错误的常见原因是 正在处理从依赖项解析的上下文实例 然后尝试使用相同的上下文实例 在应用程序的其他位置。如果您正在呼叫 在上下文实例上“Dispose”,或使用 如果您使用的是依赖项注入,那么应该让 依赖注入容器负责处理上下文 实例

我尝试过使服务同步而不是异步,我尝试过等待结果并运行任务同步,但都不起作用

关于如何在启动时配置中在此委托中使用我的服务,有什么想法吗

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>();
}