带有 IoC/DI 的 RavenDB - IDocumentStore 或 I(Async)DocumentSession?

RavenDB with IoC/DI - IDocumentStore or I(Async)DocumentSession?

我在 google 上搜索了一下并在发布之前搜索了这个论坛,因为我认为它已经被殴打致死 - 但由于我没有看到任何似乎明确询问这个问题的结果,我想我会给它一个射击。很有可能之前有人回答过它,但我没有偶然发现关于它的清晰页面。

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

过去,我在所有地方都注入了 IAsyncDocumentSession - 但后来发现我实际上需要在一些地方使用非 async 会话。这让我开始思考我是不是完全错误地注射了 Raven。

所以,使用 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
}

除了偏好之外还有什么区别吗?我最初的想法是使用 IDocumentSessionIAsyncDocumentSession 是更好的 lifecycle 管理,但我可能错了。

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

不确定这在 4.0 中是否有所改变,但到目前为止,DocumentStore 的创建被认为是相当 expensive/heavy 的操作,因此建议的方法是每个应用程序只创建一次(单例;有关详细信息,请参见 RavenDb Documentation)。

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

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

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