2017-04-04 92 views
0

我有一個非常複雜的工作流程,它不是100%清楚在哪裏處理什麼。 我不想有代碼,它只是誰負責什麼的問題。複雜的就業聚合

給出如下:

  1. 有一個根目錄 「C:\服務器」
  2. 裏面有兩個目錄 「FTP」 和 「備份」

想象一下以下的過程:

  1. 外部客戶將文件發送到ftp目錄。
  2. 導入器應用程序獲取文件,現在樂趣開始。
  3. 必須爲此文件創建作業聚合。
  4. 命令「CreateJob(string file)」被觸發。 ?該文件必須從ftp移動到備份。 CommandHandler內部或Aggregate內部或JobCreated事件?
  5. StartJob(Guid jobId)get的調用。必須創建第三個文件夾「正在進行」,文件必須從備份複製到正在進行中。誰做的?

因此,如果沒有正確的文件系統,Aggregate無法正常工作,我不清楚Filesystem的東西在哪裏。 因爲我的第一個方法是在一個基礎結構層/ lib中執行這個操作,它監聽來自作業層的事件。但它似乎不是100%正確的?!

而最重要的是,什麼是重放? 您無法重播被感動,事情/文件,你必須以某種方式模擬一個客戶發送文件到FTP文件夾...

感謝答案

+0

爲什麼文件移動在'backup'文件夾,然後在'在-progress'文件夾中再次移動? –

回答

1

該文件必須從ftp移動到備份。 CommandHandler內部或Aggregate內部或JobCreated事件?

在這樣的情況下,我謹在Application服務,發送命令到Aggregate文件到目標文件夾(或呼籲Aggregate命令般的方法,這是相同的)前命令發送到Aggregate。這樣,如果文件系統出現問題(沒有足夠的權限或空間不可用等),則不會發送該命令。這些問題不應該達到我們的Aggregate。我們最保護它免受基礎設施的侵害。實際上,我們應該保持Aggregate與其他任何東西隔離;它只能包含只有純業務邏輯用於決定生成哪些事件。

因爲我的第一種方法是在一個基礎結構層/ lib中執行這個操作,它監聽來自作業層的事件。但它似乎不是100%正確的?!

事實上,這似乎對我來說過於工程化了。你必須吻。

StartJob(Guid jobId)get的調用。必須創建第三個文件夾「正在進行」,文件必須從備份複製到正在進行中。誰做的?

誰調用了StartJob可以做運動時,StartJob之前調用。再次,保持純粹的Aggregate。在這種情況下,它取決於你的框架/域的細節。

而最重要的是,什麼是重放?你不能重放移動的東西/文件,你必須以某種方式模擬客戶將文件發送到FTP文件夾...

事件從事件存儲中加載並在兩種情況下重播:

  1. 之前的每一個命令被髮送到Aggregate,該Aggregate Repository加載所有從事件存儲的事件則適用他們每個人的Aggregate,大概呼籲總結一些applyThisEvent(TheEvent)方法。所以,這種方法應該沒有副作用(純粹的),否則你在每個命令執行時一次次地改變外界,你不想這樣做。

  2. 向用戶呈現數據的read-modelsprojectionsquery-models)偵聽這些事件並更新保存用戶看到的數據的數據庫表。事件在生成後以及每次讀取模型重新創建後都會發送到這些讀取模型。當你發明一個新的read-model,你必須通過它以前生成的所有事件aggregates爲了建立他們正確/完整的狀態。如果您的閱讀模型的事件監聽器有副作用,那麼當您發生重播那些過去的事件時,您會發生什麼?外部世界被一次又一次地修改,你不需要!閱讀模型只解釋事件,不會產生其他事件,也不會改變外部世界。

還有一個特殊的第三種情況,當事件達到另一種類型的模型,Saga。 A Saga必須只接收一次活動!這是你認爲在Because my first approach was to do that inside an Infrastructure layer/lib which listen to the events from the job layer中使用的情況。你可能做你的情況,但不是吻。

+0

非常感謝您的回答。重播我的意思是第二種情況。所以重放總是隻用於讀取模型,我不確定這一點。我想也許應該有可能重新創建一個完整的系統狀態與重播(文件夾等)。 – SharpNoiZy

+0

你可以這樣做,如果你有這樣一個閱讀模型,但考慮文件內容。您必須將這些內容保留在事件中才能擁有完整的數據來填充文件夾中的文件。有各種讀取模型,它不需要是數據庫。但請記住,讀取模型不會被「Aggregates」查詢。讀取模型不用於驗證'Aggregate's'不變量。 –

+0

再次感謝。也許你可以更多地回答我一個小問題。我爲每個域圖層(CustomerService,JobManagement,UserManagement)提供了一個CommandStack庫和一個QueryStack庫。問題是,CommandStack觸發的事件在CommandStack內部。這意味着,QueryStack(Denormalizers和查詢)必須引用CommandStack,正因爲如此。你建議第三個庫只是爲了避免這些事件嗎? – SharpNoiZy

1

我有一個非常複雜的工作過程,我不清楚在哪裏處理什麼。我不想擁有代碼,它只是誰負責什麼的問題。

通常的答案是,領域模型 - 又名「聚合」決策,並保存它們。觀察這些決定,一些事件處理程序引起副作用。

而最重要的是,什麼是重放?你不能重放移動的東西/文件,你必須以某種方式模擬客戶將文件發送到FTP文件夾...

您將事件重播到聚合,以便它恢復到它作出最後決定的狀態。這與重播副作用有關,這是處理別處副作用動機的一部分。

在可能的情況下,您當然希望副作用是冪等的,這樣重複的消息不會產生問題。但請注意,從模型的角度來看,副作用是否成功並不重要。

+0

非常感謝您的回答 – SharpNoiZy