【问题标题】:RavenDB with IoC/DI - IDocumentStore or I(Async)DocumentSession?RavenDB 与 IoC/DI - IDocumentStore 或 I(Async)DocumentSession?
【发布时间】:2017-11-18 17:59:07
【问题描述】:

我在发布之前用谷歌搜索了一下这个论坛,因为我认为它已经被打死了 - 但由于我没有看到任何似乎清楚地询问这个问题的结果,我想我会试一试。以前很有可能已经回答过了,但我没有偶然发现关于它的清晰页面。

当使用依赖注入时,哪个被认为是更好的做法?注入整个IDocumentStore,然后根据需要从中生成会话,还是注入适当的IDocumentSessionIAsyncDocumentSession

过去,我在各处都注入了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
}

除了偏好之外还有什么不同吗?我最初的想法是使用IDocumentSessionIAsyncDocumentSession 更好地管理生命周期,但我可能错了。

我正在使用 .NET Core 2.0.3StructureMapRaven DB 4.0 (40023),但我会假设这可以适用于任何配置和任何版本。

【问题讨论】:

    标签: dependency-injection ravendb


    【解决方案1】:

    不确定这在 4.0 中是否有所改变,但到目前为止,DocumentStore 的创建被认为是一项相当昂贵/繁重的操作,因此建议的方法是每个应用程序仅创建一次(单例;有关更多详细信息,请参阅RavenDb Documentation )。

    另一方面,会话的创建成本相当低,因此可以根据需要创建。

    您仍然可以使用 DI 注入两个对象(存储和会话),并且只使用不同的生命周期(单例与瞬态)。

    当然,您也可以设置 DI 以根据需要提供会话的同步或异步版本。

    【讨论】:

    • 我们在工作中一直使用这种方法,但我们注意到多次点击刷新按钮,即使使用 IoC 将会话设置为瞬态(我们正在使用 Castle Windsor 和 ASP.Net Framework 4.7 .2) 我们得到Cannot execute async command QueryCommand while another async command is running in the same session 异常。所以现在我们认为最好在需要时从商店手动打开一个新会话。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-31
    • 2019-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多