Dependency injection 从IDocumentStoreListener获取作用域组件
我有一个使用RavenDB的ASP.NET 5应用程序,我正在尝试创建一个属性,该属性将创建一个“变更集”文档,其中包含操作存储的所有文档的键 为此,我创建了一个通过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实现)是手
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我使用的是(可能不正确)用于实例化SingletonIDocumentStore
的服务提供程序。我怎样才能为它提供IHttpContextAccessor
(它本身就是作用域,IIRC)?IHttpContextAccessor
实际上没有作用域,只是它提供的值。真神奇!()@MattDeKrey你说得对-它使用CallContext
。你能把这变成一个答案让我接受吗?