我可以在mvc structur (beego,revel)中放置初始化文件,如语言,连接数据库等?
我试着在控制器中使用,但它并不好。
创建基本控制器并将所有初始连接、语言等放在这里是一个好的解决方案吗?还是有其他方法(更好)?
发布于 2016-09-11 13:05:05
您可以使用全局变量,但我不建议这样做。在数据库逻辑分散在多个包中的更复杂的应用程序中会发生什么?最好使用依赖注入:
文件: main.go
package main
import (
"bookstore/models"
"database/sql"
"fmt"
"log"
"net/http"
)
type Env struct {
db *sql.DB
}
func main() {
db, err := models.NewDB("postgres://user:pass@localhost/bookstore")
if err != nil {
log.Panic(err)
}
env := &Env{db: db}
http.HandleFunc("/books", env.booksIndex)
http.ListenAndServe(":3000", nil)
}
func (env *Env) booksIndex(w http.ResponseWriter, r *http.Request) {
if r.Method != "GET" {
http.Error(w, http.StatusText(405), 405)
return
}
bks, err := models.AllBooks(env.db)
if err != nil {
http.Error(w, http.StatusText(500), 500)
return
}
for _, bk := range bks {
fmt.Fprintf(w, "%s, %s, %s, £%.2f\n", bk.Isbn, bk.Title, bk.Author, bk.Price)
}
}文件: models/db.go
package models
import (
"database/sql"
_ "github.com/lib/pq"
)
func NewDB(dataSourceName string) (*sql.DB, error) {
db, err := sql.Open("postgres", dataSourceName)
if err != nil {
return nil, err
}
if err = db.Ping(); err != nil {
return nil, err
}
return db, nil
}发布于 2016-09-11 04:40:47
我总是做一些packega来保存我的环境变量。
例如main.go
package main
import (
"net/http"
env "github.com/vardius/example/enviroment"
)
func main() {
//some extra code here, http srever or something
defer env.DB.Close()
}在enviroment目录env.go内结束
package env
import (
"database/sql"
_ "github.com/go-sql-driver/mysql"
)
var (
DB *sql.DB
)
func connectToDB(dbURL string) *sql.DB {
conn, err := sql.Open("mysql", dbURL)
//check for err
return conn
}
func init() {
DB = connectToDB("root:password@tcp(127.0.0.1:3306)/test")
}这样,您只需初始化一次DB,就可以通过注入env在应用程序的所有部分中使用它
当然,这个解决方案也有一些缺点。首先,代码更难理解,因为组件的依赖关系不明确。其次,测试这些组件变得更加困难,并行运行测试几乎是不可能的。使用全局连接时,命中后端服务中相同数据的测试不能并行运行。
有一篇关于Dependency Injection with Go的很棒的文章
我希望这篇文章对你有帮助
https://stackoverflow.com/questions/39427299
复制相似问题