Правильный способ создания MySql интерфейса в Go - PullRequest
0 голосов
/ 22 апреля 2020

Я работаю над подключением моего приложения к MySql. Код структурирован следующим образом, который работает, но выглядит немного странно для меня. Это правильный шаблон для подражания?

Я сохранил вещи, связанные с БД, в отдельном файле, который выглядит следующим образом:

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 в качестве глобальной переменной. Спасибо за ваш отзыв.

Ответы [ 2 ]

1 голос
/ 23 апреля 2020

Я обычно хотел бы следовать этому руководству Бена Джонсона при создании db: См. 3. Типы переноса для специфики приложения c context

В этой статье упоминается, что мы можем предоставить абстрактный слой здесь, взаимодействуя с интерфейсом, поэтому вам не нужно пропускать эти детали на прикладном уровне. Вы упомянули, что хотели бы выполнять запросы и другие команды, чтобы вы могли составить интерфейс для этих команд, например:

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)
}
0 голосов
/ 22 апреля 2020

Это определенно неверно:

  • MySqlDatabase не реализует IMySqlDatabase, поэтому оно не будет работать, если вы действительно попытаетесь использовать интерфейс
  • Вы не фактически использует интерфейс

и имеет проблемы со стилем:

  • Интерфейс возвращает конкретные типы, что не соответствует назначению
  • Интерфейс выглядит как фабрика само по себе? Или что-то? Непонятно, каким интерфейсом или конкретным типом на самом деле должен быть / do
  • Интерфейсы в Go не должны называться IThing, это C#
  • У вас, кажется, есть тип методы, которые изменяют глобальные переменные, что будет крайне неожиданно для всех, кто их использует
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...