Исходя из фона Java, у меня есть некоторые вопросы о том, как обычно делаются в Голанге. Я специально говорю об услугах и дао/репозиториях.Golang service/daos реализация
В java я бы использовал инъекцию зависимостей (возможно, как singleton/application-scoped), и у меня была служба, введенная в мою конечную точку/ресурс отдыха.
Чтобы дать немного больше контекста. Представьте себе следующую Golang код:
func main() {
http.ListenAndServe("localhost:8080", nil)
}
func init() {
r := httptreemux.New()
api := r.NewGroup("/api/v1")
api.GET("/blogs", GetAllBlogs)
http.Handle("/", r)
}
скопировал это прямо из моего кода, основной и инициализации расколоты, потому что Google App Engine.
Так что на данный момент у меня есть один обработчик. В этом обработчике я ожидаю взаимодействия с BlogService.
Вопрос в том, где и в какой области следует создавать экземпляр структуры BlogService и дамо, например, структуры данных?
Должен ли я делать это каждый раз, когда обработчик запускается или делает его постоянным/глобальным?
Для полноты, вот обработчик и blogService:
// GetAllBlogs Retrieves all blogs from GCloud datastore
func GetAllBlogs(w http.ResponseWriter, req *http.Request, params map[string]string) {
c := appengine.NewContext(req)
// need a reference to Blog Service at this point, where to instantiate?
}
type blogService struct{}
// Blog contains the content and meta data for a blog post.
type Blog struct {...}
// newBlogService constructs a new service to operate on Blogs.
func newBlogService() *blogService {
return &blogService{}
}
func (s *blogService) ListBlogs(ctx context.Context) ([]*Blog, error) {
// Do some dao-ey/repository things, where to instantiate BlogDao?
}
Большое спасибо за Ваш ответ. С циклом запроса/ответа вы подразумеваете создание экземпляра службы для каждого отдельного запроса? Если да, почему бы просто не создать экземпляр в обработчике, а затем передать его? Это было не совсем понятно для меня. Извините за мое замешательство. –
Что делать, если вы хотите накапливать посредников и обмениваться информацией между ними? – mpm
Хорошая точка. Чтобы я правильно понял; сделать ненулевой пустой контекст, используя функцию фона контекстного пакета, инициализировать и загрузить службы в структуре контейнера, поместить эту структуру контейнера в контекст и использовать это в обработчиках? –