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 Query interface{}
var (
handlerIndex map[string]QueryHandler
)
func InitBus() {
handlerIndex = make(map[string]QueryHandler)
type Bus interface {
SendQuery(query Query) error
AddQueryHandler(handler 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()
fmt.Printf("sending query for type: %v\n", queryName)
var handler = handlerIndex[queryName]
var handler = b.handlerIndex[queryName]
if handler == nil {
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)
queryTypeName := handlerType.In(0).Elem().Name()
fmt.Printf("QueryType %v\n", queryTypeName)
handlerIndex[queryTypeName] = handler
//fmt.Printf("Adding handler for type: %v\n", queryTypeName)
b.handlerIndex[queryTypeName] = handler
}

View File

@ -11,13 +11,13 @@ type TestQuery struct {
}
func TestHandlerReturnsError(t *testing.T) {
InitBus()
bus := New()
AddQueryHandler(func(query *TestQuery) error {
bus.AddQueryHandler(func(query *TestQuery) error {
return errors.New("handler error")
})
err := SendQuery(&TestQuery{})
err := bus.SendQuery(&TestQuery{})
if err == nil {
t.Fatal("Send query failed %v", err)
@ -27,15 +27,15 @@ func TestHandlerReturnsError(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"
return nil
})
query := &TestQuery{}
err := SendQuery(query)
err := bus.SendQuery(query)
if err != nil {
t.Fatal("Send query failed %v", err)