带有 IoC/DI 的 RavenDB - IDocumentStore 或 I(Async)DocumentSession?
RavenDB with IoC/DI - IDocumentStore or I(Async)DocumentSession?
我在 google 上搜索了一下并在发布之前搜索了这个论坛,因为我认为它已经被殴打致死 - 但由于我没有看到任何似乎明确询问这个问题的结果,我想我会给它一个射击。很有可能之前有人回答过它,但我没有偶然发现关于它的清晰页面。
使用依赖注入时,哪种做法被认为是更好的做法?注入整个 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
是更好的 lifecycle 管理,但我可能错了。
我正在使用 .NET Core 2.0.3 和 StructureMap 以及 Raven DB 4.0 (40023
) 具体来说,但我认为这可以适用于任何配置和任何版本。
不确定这在 4.0 中是否有所改变,但到目前为止,DocumentStore 的创建被认为是相当 expensive/heavy 的操作,因此建议的方法是每个应用程序只创建一次(单例;有关详细信息,请参见 RavenDb Documentation)。
另一方面,创建会话的成本相当低,因此可以根据需要创建。
您仍然可以使用 DI 注入两个对象(存储和会话)并且只使用不同的生命周期(单例与瞬态)。
当然,您也可以设置 DI 以根据需要提供会话的同步版本或异步版本。
我在 google 上搜索了一下并在发布之前搜索了这个论坛,因为我认为它已经被殴打致死 - 但由于我没有看到任何似乎明确询问这个问题的结果,我想我会给它一个射击。很有可能之前有人回答过它,但我没有偶然发现关于它的清晰页面。
使用依赖注入时,哪种做法被认为是更好的做法?注入整个 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
是更好的 lifecycle 管理,但我可能错了。
我正在使用 .NET Core 2.0.3 和 StructureMap 以及 Raven DB 4.0 (40023
) 具体来说,但我认为这可以适用于任何配置和任何版本。
不确定这在 4.0 中是否有所改变,但到目前为止,DocumentStore 的创建被认为是相当 expensive/heavy 的操作,因此建议的方法是每个应用程序只创建一次(单例;有关详细信息,请参见 RavenDb Documentation)。
另一方面,创建会话的成本相当低,因此可以根据需要创建。
您仍然可以使用 DI 注入两个对象(存储和会话)并且只使用不同的生命周期(单例与瞬态)。
当然,您也可以设置 DI 以根据需要提供会话的同步版本或异步版本。