Scala的event-sourced和CQRS案例程式碼
eligosource/eventsourced-example · GitHub
案例原理圖:
在其Service中事件消費者部分程式碼:
案例原理圖:
個人目前觀點:其領域模型的領域事件程式碼好像比較複雜,幾乎是IF-ELSE這種條件判斷模板,作者不能重構得好看一些嗎?:
case class Invoice( id: String, items: List[InvoiceItem] = Nil, discount: Option[BigDecimal] = None, sentTo: Option[InvoiceAddress] = None) extends EventSourced[InvoiceEvent, Invoice] { def addItem(item: InvoiceItem): Update[InvoiceEvent, Invoice] = ... def setDiscount(discount: BigDecimal): Update[InvoiceEvent, Invoice] = ... def sendTo(address: InvoiceAddress): Update[InvoiceEvent, Invoice] = ... def handle(event: InvoiceEvent): Invoice = event match { case InvoiceItemAdded(_, item) => copy(items = item :: items) case InvoiceDiscountSet(_, discount) => copy(discount = Some(discount)) case InvoiceSent(_, to) => copy(sentTo = Some(to)) } } sealed trait InvoiceEvent extends Event { def invoiceId: String } case class InvoiceItemAdded(invoiceId: String, item: InvoiceItem) extends InvoiceEvent case class InvoiceDiscountSet(invoiceId: String, discount: BigDecimal) extends InvoiceEvent case class InvoiceSent(invoiceId: String, to: InvoiceAddress) extends InvoiceEvent <p class="indent"> |
在其Service中事件消費者部分程式碼:
def receive = { case CreateInvoice(invoiceId) => process(createInvoice(invoiceId)) { invoice => emitter("listeners") sendEvent InvoiceCreated(invoiceId) } case AddInvoiceItem(invoiceId, expectedVersion, invoiceItem) => process(addInvoiceItem(invoiceId, expectedVersion, invoiceItem)) { invoice => emitter("listeners") sendEvent InvoiceItemAdded(invoiceId, invoiceItem) } case SetInvoiceDiscount(invoiceId, expectedVersion, discount) => process(setInvoiceDiscount(invoiceId, expectedVersion, discount)) { invoice => emitter("listeners") sendEvent InvoiceDiscountSet(invoiceId, discount) } case SendInvoiceTo(invoiceId, expectedVersion, to) => process(sendInvoiceTo(invoiceId, expectedVersion, to)) { invoice => emitter("listeners") sendEvent InvoiceSent(invoiceId, invoice, to) } case InvoicePaymentReceived(invoiceId, amount) => process(payInvoice(invoiceId, None, amount)) { invoice => emitter("listeners") sendEvent InvoicePaid(invoiceId) } } <p class="indent"> |
[該貼被banq於2012-10-29 10:30修改過]
相關文章
- GitHub - soooban/AxonDemo: 使用Axon/Spring Cloud實現事件溯源和CQRS案例GithubSpringCloud事件
- Scala程式碼練習(複習用)
- Cheeper:《CQRS By Example》一書的參考程式碼開源實現
- .NET遵循CQRS-ES架構的EventFlow的DDD + CQRS + Event-sourcing原始碼架構原始碼
- Lambda和清潔程式碼的一個重構案例 - frankel
- Scala 簡介 [摘自 Scala程式設計 ]程式設計
- Flink - 安裝包scala 2.12和scala 2.11的區別
- scala入門之編寫scala指令碼指令碼
- Java的CQRS和事件溯源ES入門:如何從CRUD切換到CQRS/ES - BaeldungJava事件
- maven 混合編譯 java/scala 程式碼報錯(qbit)Maven編譯Java
- 使用AsyncAPI規範簡潔實現CQRS事件溯源案例API事件
- Scala 類和物件物件
- 使用TypeScript和nextjs實現基於CQRS的微服務的銀行API原始碼TypeScriptNextJS微服務API原始碼
- Scala的物件導向程式設計物件程式設計
- spark 三種建立 資料集的方法,及測試(Scala程式碼)Spark
- 在IntelliJ IDEA中建立和執行java/scala/spark程式IntelliJIdeaJavaSpark
- 聊聊JavaScript和Scala的表示式 ExpressionJavaScriptExpress
- booking-microservices:基於.Net Core的CQRS、DDD、垂直切片架構、事件溯源案例ROS架構事件
- kakafka - 為CQRS而生fka - 為CQRS而生Kafka
- .NET 5 原始碼生成器——MediatR——CQRS原始碼
- Intellij IDEA開發Scala程式IntelliJIdea
- Spring Boot和Netflix DGS的GraphQL原始碼案例Spring Boot原始碼
- 使用Spring Boot和Kafka Streams實現CQRSSpring BootKafka
- 無伺服器事件源和CQRS指南伺服器事件
- 微服務、CQRS和eventsourcing開源資源微服務
- ABAP mesh表示式, JavaScript和Scala的 expressionJavaScriptExpress
- Akka系列(五):Java和Scala中的FutureJava
- 業務程式碼程式設計陷阱案例 - jaxenter程式設計
- 低程式碼和無程式碼的區別
- 二維陣列程式碼案例分析陣列
- ECMASCRIPT 2021新功能程式碼演示案例
- CQRS+ES專案解析01-Diary.CQRS
- DDD 中的那些模式 — CQRS模式
- CQRS架構和Axon框架入門實踐架構框架
- 低程式碼和無程式碼的注意事項
- Spring IO 2019大會上Axon+Spring的事件驅動微服務和CQRS原始碼專案Spring事件微服務原始碼
- 領域驅動設計:CQRS 和事件源的強大功能事件
- 使用領域驅動設計DDD和CQRS實現身份驗證的微服務原始碼專案微服務原始碼
- 安裝idea,跑scala程式,下載Idea