Axon參考指南 - 5.命令處理 - External Command Handlers(外部命令處理程序)

簡介

命令處理功能通常直接放置在集合上(如此處更詳細描述)。但是,在某些情況下,既不可能也不希望將命令直接路由到Aggregate實例。消息處理功能(例如命令處理程序)可以放在任何對象上。因此可以實例化“命令處理對象”。

命令處理對象是一個簡單的(常規)對象,具有帶@​​CommandHandler註釋的方法。與聚合不同,命令處理對象只有一個實例,它處理在其方法中聲明的所有類型的命令:

import org.axonframework.commandhandling.CommandHandler;
import org.axonframework.modelling.command.Repository;

public class GiftCardCommandHandler {

    // 1.
    private final Repository<GiftCard> giftCardRepository;

    @CommandHandler
    public void handle(RedeemCardCommand cmd) {
        giftCardRepository.load(cmd.getCardId()) // 2.
                          .execute(giftCard -> giftCard.handle(cmd)); // 3.
    }

    // omitted constructor
}

在上面的代碼段中,我們決定不再應在GiftCard上直接處理RedeemCardCommand。相反,我們手動加載GiftCard並在其上執行所需的方法:

  1. GiftCard集合的存儲庫,用於檢索和存儲集合。如果將@CommandHandler方法直接放置在Aggregate上,則Axon將自動知道要調用存儲庫來加載給定實例。
    因此,不是必須直接訪問存儲庫,而是一種設計選擇。
  2. 要加載預期的GiftCard Aggregate實例,請使用Repository#load(String)方法。
    提供的參數應該是集合標識符。
  3. 加載該聚合後,應調用Aggregate#execute(Consumer)函數以對該聚合執行操作。
    使用執行功能可確保正確啓動聚合生命週期。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章