2012-06-08 32 views
4

我們正在使用事件採購並從事件流構建聚合。 我有2聚合 - A1和A2。 A1用作模板以創建A2。 A1的大小可能相當大。 事件採購的基本思想是確保每個應用程序狀態的更改都捕獲在事件對象中。 所以要保存A2我們必須在第一個事件中存儲大量信息。可以在事件採購中創建大型活動嗎?

這種情況常見或從模板創建不是好主意? 有沒有更好的方法來解決它?

回答

3

如果您發佈更多具體的聚合和事件示例,它將會有所幫助。一般來說,如果您的情況有意義,您可以創建更多細化的事件。然後,而不是命令和事件之間的1-1關係,你將有1-N關係,這是完全符合CQRS理論。

所以給你一個例子:

CreateInvoice : Command 
- InvoiceId 
- Customer (10 fields) 
- Address (5 more fields) 
- InvoceLine[] (where each InvoiceLine also have 10 fields or so) 
- Rest of 100 or so fields 

InvoiceCreated : Event 
- InvoiceId 
- Customer (10 fields) 
- Address (5 more fields) 
- InvoceLine[] (where each InvoiceLine also have 10 fields or so) 
- Total 
- Rest of 100 or so fields 

而且在命令處理程序:

void Handle(CreateInvoce cmd) 
{ 
    var invoice = new Invoice(cmd.InvoiceId, cmd.Customer, cmd.Address, cmd.Lines ....) 
    uow.Register(invoice); 
} 

只有一個InvoceCreated事件將得到提升。在命令處理程序

InvoiceCreated : Event 
- InvoiceId 
- Customer 
- Address 

InvoiceLineAdded 
- InvoiceId 
- Item 
- Vat 
- Subtotal 
- Etc 

然後:

相反,你可以有更精細的事件

void Handle(CreateInvoce cmd) 
{ 
    var invoice = new Invoice(cmd.InvoiceId, cmd.Customer, cmd.Address); 

    foreach (var line in cmd.Lines) 
    { 
     invoice.AddLine(line.Item, line.Quantity, line.Price, ...); 
    } 

    uow.Register(invoice); 
} 

這裏男星將提高InvoiceCreated事件和AddLine方法將引發InvoiceLineAdded事件。 然後,您可以擁有InvoiceLineChanged/InvoiceLineRemoved等事件,您可以使用這些事件進行更新。

這將允許您有更多的粒度事件,同時仍然允許發佈更多粗粒度的命令。

當它們表示來自用戶/系統PoV的原子動作時,大的命令是可以的。

P.S.關於使用聚合作爲模板,我不會爲此而煩惱,而是會創建數據結構來充當收集器來收集中間狀態。它可以被簡單地序列化/反序列化。如果在填寫模板後沒有行爲 - 那麼你根本不需要聚合。這只是一組數據,稍後將用於創建聚合和運行業務規則。你可能使用這個「模板」對象來存儲多個請求之間的用戶輸入狀態,如會話狀態,權利;)?

希望有所幫助。

+1

一個小小的評論,你可以內部化(在聚合內)創建多個事件(作爲替代)。 –

0

我也有類似的問題在這裏:How granular should a domain event be?

通常是一個巨大的類表明您必須檢查其責任和高達根據SRP分裂成更小的類。通過聚合,域名事件等......你可以遵循相同的方法。太多的類可以考慮多個有界的上下文,等等......

問題的另一部分,即命令和事件粒度是業務決策。如果您的域名模型對您的大事件有意義,請使用它。否則,您(或領域專家)應該問問自己,用戶的意圖是什麼,當前事件是否表達了它?只是一個非常簡單的例子,你甚至可以有非常小的域名事件:PhoneNumberChanged甚至更​​小:PhoneNumberCorrected,PhoneNumberMigrated(它們都包含只有一個屬性,新的電話號碼)。據此,您也可以舉辦大型活動。 OFC。保持這些更困難,一段時間後,您可能會開始對其進行版本化,或將整個事件存儲遷移到另一個域結構下。

如果不瞭解問題,很難提供幫助。您可能應該告訴我們關於過去幾年發生的與您的大型域名事件有關的事情,之後您是否有問題?

相關問題