node.js的 Domain framework JSDM

brighthas發表於2013-02-20
大家好,我是利奧brighthas,下面介紹一下 node.js 的 CQRS框架[ JSDM ]

參看專案

https://github.com/brighthas/jsdm

以前我開發過cqrsnode是純粹CQRS的框架,後來工作室本身需要開發相對複雜的系統,而且要瀏覽器也要有很好的抗“複雜性”,所以我改版成 JSDM。

JSDM不是完全傳統的CQRS DDD框架,以下說明一下。

// 這是虛擬碼,不是完整的,只是說明一下基本用法

var  domain =  require("jsdm")();

domain
   .bindAgg(...)
   .bindCommandHandle(...)
   .bindService(...)
   .listen(...)
   .bindAgg(...)
   .bindDB(db)
....
   .seal();  // 封印

// 封印後,只剩下如下三個方法有效。
//  on /  once 是 監聽器,從domain外部監聽內部,但資料都是隻讀的,改變 domain內部狀態只能透過exec方式執行 command來操作 domain內部。

domain.on(...);       
domain.once(...);
domain.exec(...);    // 執行 command  ,對應著 command handle.

<p class="indent">


這裡需要說明的是 domain.bindDB(db) 這裡的db只有一個 get(id,callback) 方法,開發者可以自己實現一個get方法即可, jsdm不是傳統的 CQRS ,去除了傳統的 event store 的回溯的功能。目的是提供中小型專案也能快速開發的目的,並享受CQRS的精華機制。

那麼, db.get 只有這個方法, update 、 remove 、 save呢?

在domain的內部,當 new XXXAggre() 一個根的例項時,會觸發一個 create event, 相應的還有 update / remove 的事件產生,而domain new一個Aggre時,會先存放在 cache 中。只有從Repository 得到 Aggre例項時,會先從cache找,如果沒有會呼叫 db.get 方法並放入 cache然後回撥出來。


remove 、 update 、 save 實現很簡單。

domain
.listen("create",function(event){
    // 當然實現非常簡單,可以使用記憶體、file 、mysql,一切都可以。
    testdb.save(event.aggreType,event.data);
})
.listen("update",function(event){
     testdb.save(event.aggreType,event.data);
})
.listen("remove",function(event){
    testdb.remove(event.aggreType,event.data);
})

<p class="indent">


另外如果想實現事件的store,直接 domain.listen(" * " ... ) 監聽 * 號,表示監聽全部事件。

domain.listen("*",function(event){
    //  save event object.
})
<p class="indent">



如果專案很複雜,可以使用多個 domain

var domain1,domain2 ..... , domain n 
<p class="indent">



[該貼被brighthas於2013-02-20 10:52修改過]

相關文章