我在谷歌搜索了一下,然后搜索了这个论坛,然后发布了这个,因为我认为它被打死了 - 但是因为我没有看到任何结果似乎清楚地问这个,我想我会试一试。以前很有可能会得到回答,但我没有偶然发现一个关于它的清晰页面。
使用依赖注入时,这被认为是更好的做法?注入整个IDocumentStore
,然后根据需要从中生成会话,或者注入相应的IDocumentSession
或IAsyncDocumentSession
?
在过去,我已经在所有地方注入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
}
除了偏好之外是否还有其他差异?我最初的想法是使用IDocumentSession
和IAsyncDocumentSession
是更好的生命周期管理,但我可能是错的。
我正在使用 .NET Core 2.0.3 与 StructureMap 与 Raven DB 4.0 (40023
),但我我认为这适用于任何配置和任何版本。
答案 0 :(得分:3)
不确定这已经改变了4.0但是到目前为止,DocumentStore的创建被认为是一个相当昂贵/繁重的操作,因此建议的方法是每个应用程序只创建一次(单身;有关详细信息,请参阅{{3 }})。
另一方面,会话创建起来相当便宜,因此可以根据需要创建。
您仍然可以使用DI注入两个对象(存储和会话),并使用不同的生命周期(单例与瞬态)。
当然,您也可以根据需要设置DI以提供会话的同步或asnyc版本。