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修改過]
相關文章
- Event-Sourcing+CQRS的Spring原始碼案例Spring原始碼
- scala指令碼程式設計指令碼程式設計
- Scala的HelloWorld程式
- 用CQRS的方式程式設計程式設計
- Scala程式碼練習(複習用)
- Lambda和清潔程式碼的一個重構案例 - frankel
- GitHub - soooban/AxonDemo: 使用Axon/Spring Cloud實現事件溯源和CQRS案例GithubSpringCloud事件
- Cheeper:《CQRS By Example》一書的參考程式碼開源實現
- .NET遵循CQRS-ES架構的EventFlow的DDD + CQRS + Event-sourcing原始碼架構原始碼
- 使用Akka實現CQRS/ES的原始碼原始碼
- Scala 簡介 [摘自 Scala程式設計 ]程式設計
- STL案例程式碼
- scala入門之編寫scala指令碼指令碼
- 一個濫用程式碼的案例
- 使用AsyncAPI規範簡潔實現CQRS事件溯源案例API事件
- Java的CQRS和事件溯源ES入門:如何從CRUD切換到CQRS/ES - BaeldungJava事件
- Scala 類和物件物件
- scala類和物件物件
- scala class和object的區別Object
- maven 混合編譯 java/scala 程式碼報錯(qbit)Maven編譯Java
- scala 函式和方法函式
- Scala 深入淺出實戰經典 第45講: scala中context bounds程式碼例項Context
- Scala的物件導向程式設計物件程式設計
- 業務程式碼程式設計陷阱案例 - jaxenter程式設計
- spark 三種建立 資料集的方法,及測試(Scala程式碼)Spark
- 聊聊JavaScript和Scala的表示式 ExpressionJavaScriptExpress
- Flink - 安裝包scala 2.12和scala 2.11的區別
- 機器學習去除馬賽克案例(程式碼)機器學習
- .NET 5 原始碼生成器——MediatR——CQRS原始碼
- 當邏輯程式設計遭遇CQRS時程式設計
- 無伺服器事件源和CQRS指南伺服器事件
- 【Scala篇】--Scala中的函式函式
- kakafka - 為CQRS而生fka - 為CQRS而生Kafka
- Scala併發程式設計程式設計
- scala 函式程式設計函式程式設計
- ABAP mesh表示式, JavaScript和Scala的 expressionJavaScriptExpress
- Akka系列(五):Java和Scala中的FutureJava
- Akka 系列(五):Java 和 Scala 中的 FutureJava