Я заметил, что во время написания некоторых конечных точек RESTful в Lambda у меня было три модели и обработчики, все они были идентичны.Они принимают запрос, получают некоторые данные из хранилища и возвращают данные в качестве ответа.Единственное, что отличалось в каждой функции-обработчике, это экземпляр модели.Поэтому я думал о способах передачи типа и повторного использования той же функциональности для маршалинга ответа в JSON и т. Д.
Если у меня есть такой шаблон:
type Handler struct {
model interface{}
repository
}
func (h *Handler) Fetch(request events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {
model := h.model
if err := h.repository.Fetch(id, &model); err != nil {
return ErrResponse(err, http.StatusInternalServerError)
}
return Response(map[string]interface{}{
"resource": model,
}, http.StatusOK)
}
Затем вызываю это:
repository := NewRepository(tableName, connection)
handler := &helpers.Handler{repository, new(models.Client)}
Я переназначаю model := h.model
, чтобы сама структура не становилась «сохраняющей состояние», в противном случае мне пришлось бы беспокоиться о блокировке, чтобы обеспечить ее потокобезопасность.Поэтому я решил, что могу просто переопределить его в области действия обработчика, чтобы избежать этого.
Кажется, что эта схема работает нормально, но мне было интересно, есть ли потенциальные недостатки или подводные камни?