我正在努力将我的应用程序连接到MySql。代码是按照以下方式构造的,但在我看来有点奇怪。这是正确的模式吗?
我将与Db相关的内容保存在一个单独的文件中,该文件如下所示:
var DatabaseObject MySqlDatabase
type IMySqlDatabase interface {
ConnectToDb() MySqlDatabase
GetDb() MySqlDatabase
}
type MySqlDatabase struct{
Db *sql.DB
}
func (MySqlDatabase) ConnectToDb(connectionString string){
db, _ := sql.Open("mysql", connectionString)
_ = db.Ping()
DatabaseObject = MySqlDatabase{Db: db}
}
func (MySqlDatabase) GetDb() *sql.DB{
return DatabaseObject.Db
}因此,我可以通过以下方式连接数据库:
infrastructureMySql.DatabaseObject.ConnectToDb(connectionString)我觉得很奇怪。有什么意义,有一个接口在第一?如果没有它,我可以简单地使用*sql.DB作为全局变量。感谢您的反馈。
发布于 2020-04-23 13:53:33
在创建db:See 3. Wrap types for application-specific context 时,我通常喜欢遵循Ben Johnson的指导。
本文提到,通过与接口交互,我们可以在这里提供一个抽象层,因此您不需要在应用层中泄漏这些细节。您已经提到,您希望执行查询和其他命令,以便就这些命令绘制一个接口,如下所示:
type Mysql struct {
db *sql.DB
}
// Wrap a new connection into the MySql struct
func NewMysql() (*Mysql, error) {
db, err := sql.Open(...)
return &Mysql{ db }, err
}
func (m *Mysql) GetUsers(...) ([]User, error) {}
func (m *Mysql) CreateUsers(...) (User, error) {}
type UserStore interface {
GetUsers func(...) []User, error)
CreateUsers func(...) (User, error)
}发布于 2020-04-22 15:27:30
这绝对是不正确的:
MySqlDatabase没有实现IMySqlDatabase,所以如果您实际尝试使用interface,它就无法工作。
并有风格问题:
IThing,这就是C#https://stackoverflow.com/questions/61368797
复制相似问题