diff --git a/example/biz/sale/application/event_handler/order_created.go b/example/biz/sale/application/event_handler/order_created.go
index 22a6b169f503675e8c38f7fed7bf4506e61d509c..eaef126b3b873615750aa08cd129590f0bd700ec 100644
--- a/example/biz/sale/application/event_handler/order_created.go
+++ b/example/biz/sale/application/event_handler/order_created.go
@@ -16,16 +16,24 @@
 package event_handler
 
 import (
+	"context"
+
 	ddd "github.com/bytedance/dddfirework"
 	"github.com/bytedance/dddfirework/example/common/domain_event/sale"
 )
 
+// OnOrderCreatedHandler 实现了 ICommandMain 的接口
 type OnOrderCreatedHandler struct {
-	ddd.Command
-
 	event *sale.OrderCreatedEvent
 }
 
+func (h *OnOrderCreatedHandler) Main(ctx context.Context, repo *ddd.Repository) (err error) {
+	// handle order created event here
+	logger.Info("order created")
+
+	return nil
+}
+
 func NewOnOrderCreatedHandler(evt *sale.OrderCreatedEvent) *OnOrderCreatedHandler {
 	return &OnOrderCreatedHandler{
 		event: evt,
diff --git a/example/biz/sale/application/event_handler/sale_item_added.go b/example/biz/sale/application/event_handler/sale_item_added.go
index 29bb2032b6df2e14624bbd077c93cf7bc769b99a..625a449f2967fd3604fa4d05fbf5790fb0b23516 100644
--- a/example/biz/sale/application/event_handler/sale_item_added.go
+++ b/example/biz/sale/application/event_handler/sale_item_added.go
@@ -16,18 +16,23 @@
 package event_handler
 
 import (
+	"context"
+
 	ddd "github.com/bytedance/dddfirework"
 	"github.com/bytedance/dddfirework/example/common/domain_event/sale"
+	"github.com/bytedance/dddfirework/logger/stdr"
 )
 
-type OnSaleItemAddedHandler struct {
-	ddd.Command
+var logger = stdr.NewStdr("handler")
+
+// OnSaleItemAddedHandler 是 MainFunc 类型
+func OnSaleItemAddedHandler(ctx context.Context, repo *ddd.Repository) (err error) {
+	// handle sale item added event here
+	logger.Info("sale item added")
 
-	event *sale.OrderSaleItemAddedEvent
+	return nil
 }
 
-func NewOnSaleItemAddedHandler(evt *sale.OrderSaleItemAddedEvent) *OnSaleItemAddedHandler {
-	return &OnSaleItemAddedHandler{
-		event: evt,
-	}
+func NewOnSaleItemAddedHandler(evt *sale.OrderSaleItemAddedEvent) ddd.MainFunc {
+	return OnSaleItemAddedHandler
 }
diff --git a/example/biz/sale/domain/order.go b/example/biz/sale/domain/order.go
index d92512a340241881769facd01a8ce59e4cfd130d..5d812781bac3a07bbb80811f25dcec1c81978e76 100644
--- a/example/biz/sale/domain/order.go
+++ b/example/biz/sale/domain/order.go
@@ -28,7 +28,15 @@ type RuleEngine interface {
 	Validate(order *Order, rule string) error
 }
 
-var ruler RuleEngine
+var ruler OrderRuleEngine
+
+type OrderRuleEngine struct {
+}
+
+func (o *OrderRuleEngine) Validate(order *Order, rule string) error {
+	// validate here
+	return nil
+}
 
 type UpdateOrderOpt struct {
 	Remark *string
@@ -147,6 +155,8 @@ func (o *Order) AddCoupon(couponID, rule string, discount int64) error {
 		CouponID: couponID,
 		Rule:     rule,
 		Discount: discount,
+
+		order: o,
 	})
 	if invalid := o.fixCoupons(); len(invalid) > 0 {
 		return fmt.Errorf("coupon invalid")
diff --git a/example/main.go b/example/main.go
index adc491bac30067d04f706a027f9f7df2ec40ffaa..f8b8a3e60f48faaf1d2d275c841f55b762d674a3 100644
--- a/example/main.go
+++ b/example/main.go
@@ -36,6 +36,11 @@ import (
 )
 
 func initPO(db *gorm.DB) {
+	// 可选,如果使用 mysql 实现 eventbus,需要提前建表。
+	if err := db.AutoMigrate(&db_eventbus.EventPO{}, &db_eventbus.Transaction{}, &db_eventbus.ServicePO{}); err != nil {
+		panic(err)
+	}
+
 	if err := db.AutoMigrate(&po.OrderPO{}, &po.CouponPO{}, &po.SaleItemPO{}); err != nil {
 		panic(err)
 	}