使用IoC / DI的RavenDB - IDocumentStore还是I(Async)DocumentSession?

时间:2017-11-18 01:44:47

标签: dependency-injection ravendb

我在谷歌搜索了一下,然后搜索了这个论坛,然后发布了这个,因为我认为它被打死了 - 但是因为我没有看到任何结果似乎清楚地问这个,我想我会试一试。以前很有可能会得到回答,但我没有偶然发现一个关于它的清晰页面。

使用依赖注入时,这被认为是更好的做法?注入整个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是更好的生命周期管理,但我可能是错的。

我正在使用 .NET Core 2.0.3 StructureMap Raven DB 4.0 40023),但我我认为这适用于任何配置和任何版本。

1 个答案:

答案 0 :(得分:3)

不确定这已经改变了4.0但是到目前为止,DocumentStore的创建被认为是一个相当昂贵/繁重的操作,因此建议的方法是每个应用程序只创建一次(单身;有关详细信息,请参阅{{3 }})。

另一方面,会话创建起来相当便宜,因此可以根据需要创建。

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

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