Refactored command/query interface

This commit is contained in:
Torkel Ödegaard
2014-12-01 08:56:03 -08:00
parent 246f41b88a
commit ff6a2d014a
2 changed files with 23 additions and 17 deletions

View File

@ -9,19 +9,26 @@ import (
type QueryHandler interface{} type QueryHandler interface{}
type Query interface{} type Query interface{}
var ( type Bus interface {
handlerIndex map[string]QueryHandler SendQuery(query Query) error
) AddQueryHandler(handler QueryHandler)
func InitBus() {
handlerIndex = make(map[string]QueryHandler)
} }
func SendQuery(query interface{}) error { type InProcBus struct {
handlerIndex map[string]QueryHandler
}
func New() Bus {
bus := &InProcBus{}
bus.handlerIndex = make(map[string]QueryHandler)
return bus
}
func (b *InProcBus) SendQuery(query Query) error {
var queryName = reflect.TypeOf(query).Elem().Name() var queryName = reflect.TypeOf(query).Elem().Name()
fmt.Printf("sending query for type: %v\n", queryName) fmt.Printf("sending query for type: %v\n", queryName)
var handler = handlerIndex[queryName] var handler = b.handlerIndex[queryName]
if handler == nil { if handler == nil {
return errors.New("handler not found") return errors.New("handler not found")
@ -38,10 +45,9 @@ func SendQuery(query interface{}) error {
} }
} }
func AddQueryHandler(handler QueryHandler) { func (b *InProcBus) AddQueryHandler(handler QueryHandler) {
handlerType := reflect.TypeOf(handler) handlerType := reflect.TypeOf(handler)
queryTypeName := handlerType.In(0).Elem().Name() queryTypeName := handlerType.In(0).Elem().Name()
fmt.Printf("QueryType %v\n", queryTypeName) fmt.Printf("QueryType %v\n", queryTypeName)
handlerIndex[queryTypeName] = handler b.handlerIndex[queryTypeName] = handler
//fmt.Printf("Adding handler for type: %v\n", queryTypeName)
} }

View File

@ -11,13 +11,13 @@ type TestQuery struct {
} }
func TestHandlerReturnsError(t *testing.T) { func TestHandlerReturnsError(t *testing.T) {
InitBus() bus := New()
AddQueryHandler(func(query *TestQuery) error { bus.AddQueryHandler(func(query *TestQuery) error {
return errors.New("handler error") return errors.New("handler error")
}) })
err := SendQuery(&TestQuery{}) err := bus.SendQuery(&TestQuery{})
if err == nil { if err == nil {
t.Fatal("Send query failed %v", err) t.Fatal("Send query failed %v", err)
@ -27,15 +27,15 @@ func TestHandlerReturnsError(t *testing.T) {
} }
func TestHandlerReturn(t *testing.T) { func TestHandlerReturn(t *testing.T) {
InitBus() bus := New()
AddQueryHandler(func(q *TestQuery) error { bus.AddQueryHandler(func(q *TestQuery) error {
q.Resp = "hello from handler" q.Resp = "hello from handler"
return nil return nil
}) })
query := &TestQuery{} query := &TestQuery{}
err := SendQuery(query) err := bus.SendQuery(query)
if err != nil { if err != nil {
t.Fatal("Send query failed %v", err) t.Fatal("Send query failed %v", err)