小编mbn*_*bnx的帖子

CQRS:更新没有事件采购的读取模型

我们使用域侧的关系数据库和读取端的NoSQL DB构建了基于CQRS的系统.域侧遵循经典的关系方法,而读取侧是非规范化的.使用命令处理程序发出的事件完成数据复制和转换.

我有两个关于读取端同步的问题:

  • 使用域侧的关系数据完全重建读取模型的最佳方法是什么?

    我们假设读模型不同步.但即使它始终保持同步,也可能需要导入测试数据库或进行一些批量操作.因此,人们可能希望从现有的写模型运行系统,而不需要相应的同步读模型.由于我们不使用Event Sourcing,因此无法重播所有事件.

    我目前考虑ReadModelBuilder在每个表上基本上执行SELECT*FROM并将每个实体转换为读取端表示.但这引入了冗余.ReadModelBuilder需要知道转换是如何完成的.事件处理程序也是如此,它通常在命令处理程序执行某些写操作后执行读取端同步.

    我考虑丢弃事件处理程序,并在每个类级别上用同步机制替换它们.例如,它将调用重写完整 实例的代替FooRenamedEventHandler重命名.但我认为这有弊端.FooRenamedEventHandler可以更好地处理读取模型中的冗余使用.foo.nameFooReadModelBuilderFoofoo.name

    更新: 另一种方法可以是ReadModelBuilder通过将域实例分段为事件来创建读取模型实体,这将在顺序执行时构建完整的读取端实体.例如:

    Article域实体有a Name和a Price.要构建读取端模型,ReadModelBuilder可以检查域实体并发出ArticleCreatedEvent,ArticleRenamedEventArticlePriceChangedEvent.这样,转换逻辑将保留在事件处理程序中,但仍可从某种批量复制机制中调用.

    例如,ReadModelBuilders可能如下所示:

_

interface IReadModelBuilder<TEntity>
{
    //// Returns a sequence of events which replicate the read-model 
    //// when executed by the event handlers.
    Event[] GetReplicationSequence(TEntity instance);
}
Run Code Online (Sandbox Code Playgroud)

更新结束

_

  • 你如何检测一个不同步的读模型?是否有一般的最佳做法?

先感谢您.

c# database-design nosql cqrs

5
推荐指数
1
解决办法
851
查看次数

标签 统计

c# ×1

cqrs ×1

database-design ×1

nosql ×1