Clever way to pick and use correct service


(.) #1

Hi,

This is more like a question in OOP strategy pattern so you pass a flag to parent service then it cleverly picks and uses the relevant sub service to do the job so you only call the parent service.

In example below, I am currently initialising two clients with different parameters and pass them both to another package to use the correct one based on a flag/var. However, as you can see, it is not nice and not scalable. If I had 10 environments I would end up passing 10 clients. The problem is, I only know about the client parameters at boot time hence reason I initialise clients at application build only once.

What would be the way to pass just one client instead?

Thanks

main.go

package main

import (
	"fmt"
	"pkg/client"
	"pkg/consumer"
)

func main() {
	fmt.Println("main")

	live := client.New("http://prod", "prod", "000")
	stag := client.New("http://stag", "stag", "111")

	consumer.Consume(live, stag)
}

pkg/client/client.go

package client

type Client struct {
	url    string
	key    string
	secret string
}

func New(url, key, secret string) Client {
	return Client{
		url:    url,
		key:    key,
		secret: secret,
	}
}

func (c Client) Connect() {
	// Use c.url, c.key and c.secret to connect to some external service.
}

pkg/consumer/consumer.go

package consumer

import (
	"fmt"
	"pkg/client"
)

func Consume(live client.Client, stag client.Client) {
	// Assume that this is a user input.
	// I am just hard-coding it for demonstration purposes.
	env := "prod"

	if env == "prod" {
		live.Connect()
		fmt.Println("consumed prod")
	} else {
		stag.Connect()
		fmt.Println("consumed stag")
	}
}