RavenDB与IoC/DI - IDocumentStore或我(异步)DocumentSession?
我发布了这个论坛之前搜索了一下这个论坛,因为我推测它已经被打死了 - 但是因为我没有看到任何看起来很清楚的结果,所以我想我会给它一个镜头。以前有回答的可能性很高,但我没有偶然发现一个明确的网页。RavenDB与IoC/DI - IDocumentStore或我(异步)DocumentSession?
当使用依赖注入,这被认为是更好的做法?注入整个IDocumentStore
,然后根据需要产生一个会话,或者注入适当的IDocumentSession
或IAsyncDocumentSession
?
过去,我在任何地方都注入了IAsyncDocumentSession
- 但是现在我发现在几个地方我实际上需要使用非async
会话。这让我想到如果我刚刚接近完全错误地注入乌鸦。
因此,使用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
}
}
但随后的更具体的会议usecases会出现如...
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核心2.0.3与StructureMap与乌鸦DB 4.0(40023
)明确,但我断定,这可以适用于任何配置和任何版本。
不确定这是否改变了4.0,但到目前为止DocumentStore的创建被认为是一个相当昂贵/繁重的操作,因此建议的方法是每个应用程序只创建一次(singleton;更详细的信息请参阅RavenDb Documentation) 。
另一方面,会话创建相当便宜,因此可以根据需要创建。
您仍然可以将两个对象(存储和会话)注入DI,并使用不同的生命周期(单例对瞬态)。
当然,您也可以根据需要设置DI以提供会话的同步或asnyc版本。