Dependency injection 带IoC/DI的RavenDB-IDocumentStore还是I(异步)DocumentSession?

Dependency injection 带IoC/DI的RavenDB-IDocumentStore还是I(异步)DocumentSession?,dependency-injection,ravendb,Dependency Injection,Ravendb,在发布这篇文章之前,我在谷歌上搜索了一下这个论坛,因为我认为它是被打死的——但因为我没有看到任何明显的结果,我想我应该试试看。以前很可能有人回答过这个问题,但我没有找到一个明确的答案 当使用依赖注入时,哪一种被认为是更好的实践?注入整个IDocumentStore,然后根据需要从中生成会话,或者注入适当的IDocumentSession或IAsyncDocumentSession 过去,我在任何地方都注入了IAsyncDocumentSession,但后来发现我实际上需要在一些地方使用非asyn

在发布这篇文章之前,我在谷歌上搜索了一下这个论坛,因为我认为它是被打死的——但因为我没有看到任何明显的结果,我想我应该试试看。以前很可能有人回答过这个问题,但我没有找到一个明确的答案

当使用依赖注入时,哪一种被认为是更好的实践?注入整个
IDocumentStore
,然后根据需要从中生成会话,或者注入适当的
IDocumentSession
IAsyncDocumentSession

过去,我在任何地方都注入了
IAsyncDocumentSession
,但后来发现我实际上需要在一些地方使用非
async
会话。这让我想到,如果我只是接近乌鸦完全错了

因此,使用
IDocumentStore
可能类似于

public AsHandler(IDocumentStore store) { RavenStore = store; }

private IDocumentStore RavenStore { get; set; }

public async Task Handle() {
   using(var session = RavenStore.OpenAsyncSession()) {
      ... // do stuff with an async session
   }
}
但是更具体的会话用例会出现,比如

public AsHandler(IAsyncDocumentSession session) { RavenSession = session; }

private IAsyncDocumentSession RavenSession { get; set; }

public async Task Handle() {
   // do stuff with an async session
}
或者分别

public AsHandler(IDocumentSession session) { RavenSession = session; }

private IDocumentSession RavenSession { get; set; }

public async Task Handle() {
   // do stuff with a non-async session
}
除了偏好之外还有什么区别吗?我最初的想法是,使用
IDocumentSession
IAsyncDocumentSession
进行生命周期管理更好,但我可能错了


我正在使用.NET Core 2.0.3StructureMap以及Raven DB 4.0
40023
),具体来说,但我认为这可以应用于任何配置和任何版本。

不确定这在4.0中是否有所改变,但到目前为止,DocumentStore的创建被认为是一项相当昂贵/繁重的操作,因此建议的方法是每个应用程序只创建一次(singleton;有关更多详细信息,请参阅)

另一方面,会话的创建成本很低,因此可以根据需要创建会话

您仍然可以使用DI注入这两个对象(存储和会话),只使用不同的生命周期(单例和瞬态)


当然,您也可以根据需要设置DI以提供会话的同步版本或asnyc版本。

我们在工作中一直使用这种方法,但我们注意到多次点击刷新按钮,即使使用IoC将会话设置为瞬态(我们使用Castle Windsor和ASP.Net Framework 4.7.2)当另一个异步命令在同一会话中运行时,我们得到
无法执行异步命令QueryCommand的异常。因此,现在我们认为最好在需要时从应用商店手动打开一个新会话。