Dependency injection 带IoC/DI的RavenDB-IDocumentStore还是I(异步)DocumentSession?
在发布这篇文章之前,我在谷歌上搜索了一下这个论坛,因为我认为它是被打死的——但因为我没有看到任何明显的结果,我想我应该试试看。以前很可能有人回答过这个问题,但我没有找到一个明确的答案 当使用依赖注入时,哪一种被认为是更好的实践?注入整个Dependency injection 带IoC/DI的RavenDB-IDocumentStore还是I(异步)DocumentSession?,dependency-injection,ravendb,Dependency Injection,Ravendb,在发布这篇文章之前,我在谷歌上搜索了一下这个论坛,因为我认为它是被打死的——但因为我没有看到任何明显的结果,我想我应该试试看。以前很可能有人回答过这个问题,但我没有找到一个明确的答案 当使用依赖注入时,哪一种被认为是更好的实践?注入整个IDocumentStore,然后根据需要从中生成会话,或者注入适当的IDocumentSession或IAsyncDocumentSession 过去,我在任何地方都注入了IAsyncDocumentSession,但后来发现我实际上需要在一些地方使用非asyn
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
}
}
但是更具体的会话用例会出现,比如
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
),具体来说,但我认为这可以应用于任何配置和任何版本。不确定这在4.0中是否有所改变,但到目前为止,DocumentStore的创建被认为是一项相当昂贵/繁重的操作,因此建议的方法是每个应用程序只创建一次(singleton;有关更多详细信息,请参阅)
另一方面,会话的创建成本很低,因此可以根据需要创建会话
您仍然可以使用DI注入这两个对象(存储和会话),只使用不同的生命周期(单例和瞬态)
当然,您也可以根据需要设置DI以提供会话的同步版本或asnyc版本。我们在工作中一直使用这种方法,但我们注意到多次点击刷新按钮,即使使用IoC将会话设置为瞬态(我们使用Castle Windsor和ASP.Net Framework 4.7.2)当另一个异步命令在同一会话中运行时,我们得到
无法执行异步命令QueryCommand的异常。因此,现在我们认为最好在需要时从应用商店手动打开一个新会话。