Dependency injection 从IDocumentStoreListener获取作用域组件

Dependency injection 从IDocumentStoreListener获取作用域组件,dependency-injection,ravendb,asp.net-core,Dependency Injection,Ravendb,Asp.net Core,我有一个使用RavenDB的ASP.NET 5应用程序,我正在尝试创建一个属性,该属性将创建一个“变更集”文档,其中包含操作存储的所有文档的键 为此,我创建了一个通过ServiceFilterAttribute实例化的actionfilteratribute,该属性注册为作用域,它在另一个作用域组件上设置了一个标志,我们称之为ChangesetAccessor,它保存更改列表 IDocumentStore显然是一个Singleton,侦听器(IDocumentStoreListener实现)是手

我有一个使用RavenDB的ASP.NET 5应用程序,我正在尝试创建一个属性,该属性将创建一个“变更集”文档,其中包含操作存储的所有文档的键

为此,我创建了一个通过
ServiceFilterAttribute
实例化的
actionfilteratribute
,该属性注册为作用域,它在另一个作用域组件上设置了一个标志,我们称之为
ChangesetAccessor
,它保存更改列表

IDocumentStore
显然是一个Singleton,侦听器(
IDocumentStoreListener
实现)是手动实例化的。它需要访问当前的
ChangesetAccessor
,所以我想给它一个
IServiceProvider
的引用,这样它就可以根据需要调用
GetService
,但它正在接收一个不同的实例


如何从我的侦听器中获取“当前请求”的
ChangesetAccessor

您实际上可以从
HttpContext
中访问
RequestServices
,以获取作用域实例。这是一种倒退,实际上需要依靠
Microsoft.AspNet
来实现,但它会适合您的情况;有趣的是,它也是一个单例,尽管它提供了一个作用域值

// injected:
IHttpContextAccessor httpContextAccessor;

// in your method:
httpContextAccessor.HttpContext.RequestServices.GetService<ChangesetAccessor>() 
//注入:
IHttpContextAccessor httpContextAccessor;
//在您的方法中:
httpContextAccessor.HttpContext.RequestServices.GetService()

您要让it访问哪个服务提供商?它应该是IHttpContextAccessor.HttpContext.RequestServices,iirc,以获取请求特定的服务提供程序。@MattDeKrey我使用的是(可能不正确)用于实例化Singleton
IDocumentStore
的服务提供程序。我怎样才能为它提供
IHttpContextAccessor
(它本身就是作用域,IIRC)?
IHttpContextAccessor
实际上没有作用域,只是它提供的值。真神奇!()@MattDeKrey你说得对-它使用
CallContext
。你能把这变成一个答案让我接受吗?