синглтоны golang в beego

Я пробую и Golang, и Beego. Я родом из Java/Spring, и мне немного сложно реализовать шаблон singleton для веб-приложения, которое я разрабатываю. У меня есть контроллер (который я хочу сделать одноэлементным), и у меня есть служба внутри моего контроллера (который я также хочу сделать одноэлементным). Я думал, что если я сделаю свою службу указателем, то всегда буду использовать один и тот же адрес (одиночный). Это не соответствует действительности.

Мой маршрут выглядит так

beego.Router("/", &controllers.SessionController{}, "get:Login")

Мой SessionController выглядит так

type SessionController struct {
    baseController
    userService *services.UserService
}

func (this *SessionController) Prepare() {
    this.baseController.Prepare()

    if this.userService == nil {
        beego.Info("user service was nil")
        this.userService = factories.NewUserService()
    }
}

Мои журналы всегда показывают, что пользовательский сервис равен нулю при каждом запросе. Как я могу получить один экземпляр моего контроллера с одним (инициализированным только один раз) экземпляром моей пользовательской службы?


person mvhatch    schedule 01.06.2014    source источник


Ответы (3)


Сделайте пользовательский сервис синглтоном:

var globalUserService = factories.NewUserService()

type SessionController struct {
    baseController
    userService *services.UserService
}

func (this *SessionController) Prepare() {
    this.baseController.Prepare()

    if this.userService == nil {
        beego.Info("user service was nil")            
        this.userService = globalUserService
    }
}
person fabrizioM    schedule 01.06.2014
comment
Я сомневаюсь, почему бы нам не использовать globalUserService напрямую в любом маршрутизаторе. Была ли это связь или какая-то другая причина? Спасибо. - person b.ben; 29.06.2016

Один из создателей фреймворка Beego упомянул мне, что фреймворк создает новый экземпляр контроллера для каждого запроса, поэтому создать синглтон на самом деле невозможно :(

person mvhatch    schedule 02.06.2014

Вот все, что вам нужно знать о создании синглтона в Golang.

шаблон Singleton в Go

var instance *singleton

func GetInstance() *singleton {
    if instance == nil {
        instance = &singleton{}   // <--- NOT THREAD SAFE
    }
    return instance
}

Но это не THREAD SAFE, вам нужно будет использовать синхронизацию один раз. Пример: -

import (
    "sync"
) 

type singleton struct {
}

var instance *singleton
var once sync.Once

func GetInstance() *singleton {
    once.Do(func() {
        instance = &singleton{}
    })
    return instance
}
person Shady Keshk    schedule 16.10.2017