我发了些搜索并在发布此论坛之前搜索了这个论坛,因为我以为它已被打死了-但是由于我没有看到任何似乎清楚地问到这个问题的结果,所以我想给它一个机会。以前已经有很高的机会得到答案了,但是我没有偶然发现关于它的清晰页面。
使用依赖注入时,哪种方法更好?注入整个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与带有Raven DB 4.0(
40023
)的StructureMap一起使用,但是我认为这可以应用于任何配置和任何版本。 最佳答案
不确定4.0是否会更改,但是到目前为止,DocumentStore的创建被认为是相当昂贵的操作,因此建议的方法是每个应用程序仅创建一次(单个;有关更多详细信息,请参见RavenDb Documentation)。
另一方面,创建会话很便宜,因此可以根据需要创建会话。
您仍然可以使用DI注入两个对象(存储和会话),并且仅使用不同的生命周期(单例与瞬态)。
当然,您也可以设置DI以根据需要提供会话的同步版本或asnyc版本。