我发了些搜索并在发布此论坛之前搜索了这个论坛,因为我以为它已被打死了-但是由于我没有看到任何似乎清楚地问到这个问题的结果,所以我想给它一个机会。以前已经有很高的机会得到答案了,但是我没有偶然发现关于它的清晰页面。

使用依赖注入时,哪种方法更好?注入整个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与带有Raven DB 4.0(40023)的StructureMap一起使用,但是我认为这可以应用于任何配置和任何版本。

最佳答案

不确定4.0是否会更改,但是到目前为止,DocumentStore的创建被认为是相当昂贵的操作,因此建议的方法是每个应用程序仅创建一次(单个;有关更多详细信息,请参见RavenDb Documentation)。

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

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

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

10-06 11:04