簡介
命令處理功能通常直接放置在集合上(如此處更詳細描述)。但是,在某些情況下,既不可能也不希望將命令直接路由到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並在其上執行所需的方法:
- GiftCard集合的存儲庫,用於檢索和存儲集合。如果將@CommandHandler方法直接放置在Aggregate上,則Axon將自動知道要調用存儲庫來加載給定實例。
因此,不是必須直接訪問存儲庫,而是一種設計選擇。 - 要加載預期的GiftCard Aggregate實例,請使用Repository#load(String)方法。
提供的參數應該是集合標識符。 - 加載該聚合後,應調用Aggregate#execute(Consumer)函數以對該聚合執行操作。
使用執行功能可確保正確啓動聚合生命週期。