从 IDocumentStoreListener 获取作用域组件

Getting a scoped component from a IDocumentStoreListener

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

为此,我创建了一个通过 ServiceFilterAttribute 实例化的 ActionFilterAttribute,它注册为 Scoped,它在另一个 [=27] 上设置了一个标志=]Scoped 组件,我们称它为 ChangesetAccessor,它包含更改列表。

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

如何从听众那里获得 "current request" 的 ChangesetAccessor

您实际上可以从 HttpContext 访问 RequestServices 以获取作用域实例。这有点倒退,确实需要 Microsoft.AspNet 来完成,但它会适合您的情况;有趣的是,IHttpContextAccessor 也是一个单例,尽管它给你一个作用域值。

// injected:
IHttpContextAccessor httpContextAccessor;

// in your method:
httpContextAccessor.HttpContext.RequestServices.GetService<ChangesetAccessor>()