Eventstore和Sqlite在内存中

时间:2011-10-21 19:39:21

标签: cqrs event-store

我正在尝试使用JSON序列化和在内存模式下运行的Sqlite来单元测试EventStore持久性。在EventStore初始化期间,我收到“No such table:Commits”异常。我假设这是因为EventStore以某种方式关闭连接并打开一个新连接,导致它看到一个新的内存中的Sqlite实例(没有Commits表)。有没有办法让这项工作?

1 个答案:

答案 0 :(得分:2)

SQLite实现很有趣,特别是当您使用“:memory:”连接字符串时。围绕实施的验收测试取决于数据库不会在操作之间“消失”。

EventStore的基本设计将每个离散动作分离为一个单独的操作:

  1. 根据配置,在环境TransactionScope(如果有)中登记
  2. 打开连接
  3. 构建IDbCommand
  4. 执行IDbCommand
  5. 评估结果
  6. 处置连接(将其释放回池中)
  7. 完成TransactionScope(当没有抛出异常时)
  8. 处置TransactionScope
  9. 您遇到的问题是每次针对EventStore的调用都会打开并关闭连接。

    现在,有一种解决方法,因为我想支持显式使用相同的IDbConnection而不将其释放回池中。 EventStore v3.0(处于候选发布阶段)有一个方法调用,该方法调用使用相同的连接,避免每次操作后连接拆除:

    ConfigurationConnectionFactory.OpenScope("SQLite"); // SQLite = app.config connection key
    

    只需将此添加到“using_the_persistence_engine”验收测试课程中即可完成设置:

    private static IDisposable scope;
    

    将此作为“建立上下文”的第一行添加:

    scope = ConfigurationConnectionFactory.OpenScope("SQLite");
    

    最后,“清理一切”的最后一行应该是:

    scope.Dispose();