在Event Sourcing模式中,您是否有两个不同的类来读取和写入事件?

时间:2015-09-18 12:51:14

标签: c++ domain-driven-design event-sourcing

事件流中存储事件是否应与事件流中事件的读取分开实现?

例如,以下抽象基类提供了一种持久化事件的方法,以便以后可以重放它们。

class event_store_t {
public:
    virtual void store(const event_t& event) = 0;
    virtual ~event_store_t() {}
};

用于测试的具体派生类的接口如下:

class ostream_event_store_t : public event_store_t {
public:
    virtual void store(const event_t& event);
};

现在,在稍后重播事件时,是否应该有一个单独的类来读取事件。例如,抽象基类显示为:

class event_stream_t {
public:
    virtual boost::shared_ptr<event_t> read() = 0;
};

具体派生类出现为:

class istream_event_stream_t : public event_stream_t {
public:
    istream_event_stream_t(std::istream& input) : input_(input) {}
    virtual boost::shared_ptr<event_t> read() {
        // Read the event.
    }
};

1 个答案:

答案 0 :(得分:1)

  

事件流中事件的存储是否应与事件流中事件的读取分开实现?

可能不是吗?

将加载实现与商店实现分开的主要动机是,您可以单独交换实现。

如果您已经没有发生过这种情况,那么您在前面将成本加载到您的设计中,假设现在将成本分开比以后更有效,请记住在这个假设中“以后”你将比现在更了解变革的要求。

这似乎不是一个好赌注。

也就是说,您可能已经注意到需要读取功能的消费者并不总是需要写入功能,反之亦然。因此,有一个与write接口分开的read 接口可能是有意义的,只有一个模块可以实现这两个接口。