Go中数据的层次抽象

时间:2014-04-10 21:13:36

标签: go

我打算在Go中创建一个项目,但我想分开我的层。我的目标是创建一个包含类似DAO模式的代码的包,即我希望我的调用者只能与服务的接口(可能是另一个项目)进行通信,而不是与实现进行通信。这是为了避免将来更改数据库的情况,调用者不应该更改,并且应该对此更改透明。

我正在考虑创建一个项目数据库,其中包含一个名为持久性的文件以及包持久性

http://play.golang.org/p/O9b93F4LJp

package persistence

// Interface that have the CRUD which I need to use from service(another project)
type Recorder interface {
    Selectkey([]byte) (err error)
    Insert([]byte, []byte) (err error)
    Update([]byte, []byte) (err error)
    Delete([]byte) (err error)
}

// Struct for Oracle
type ManageDataOracle struct {
}
// Struct for binaryTree
type ManageDataBInaryTree struct {
}
// Struct for MongoDB
type ManageDataMongoDb struct {
}

// Implemtations for Oracle
func (memory *ManageDataOracle) SelectKey(pKey []byte) error {
    // Logic for Oracle Here
    return nil
}
func (memory *ManageDataOracle) Insert(pKey []byte, pValue []byte) error {
        // Logic for Oracle Here
    return nil
}
func (memory *ManageDataOracle) Update(pKey []byte, pValue []byte) error {
    // Logic for Oracle Here
    return nil
}

func (memory *ManageDataOracle) Delete(pKey []byte) error {
    // Logic for Oracle Here
    return nil
}

// Implemtations for Binary Tree
func (memory *ManageDataBInaryTree) SelectKey(pKey []byte) error {
    // Logic for Binary tree Here
    return nil
}
func (memory *ManageDataBInaryTree) Insert(pKey []byte, pValue []byte) error {
        // Logic for Binary tree Here
    return nil
}
func (memory *ManageDataBInaryTree) Update(pKey []byte, pValue []byte) error {
    // Logic for Binary tree Here
    return nil
}    

func (memory *ManageDataBInaryTree) Delete(pKey []byte) error {
    // Logic for Binary tree Here
    return nil
}

// Implemtations for Mongo DB
func (memory *ManageDataMongoDb) SelectKey(pKey []byte) error {
    // Logic for MongoDB Here
    return nil
}
func (memory *ManageDataMongoDb) Insert(pKey []byte, pValue []byte) error {
        // Logic for MongoDB Here
    return nil
}
func (memory *ManageDataMongoDb) Update(pKey []byte, pValue []byte) error {
    // Logic for MongoDB Here
    return nil
}

func (memory *ManageDataMongoDb) Delete(pKey []byte) error {
    // Logic for MongoDB Here
    return nil
}

关于如何分离概念,或者如何从另一个项目调用以前的代码的任何建议?

2 个答案:

答案 0 :(得分:0)

您处于正确的轨道,但不同的持久性机制将使用不同的密钥类型(例如oracle中的整数和mongo中的字符串式标识符)。

将数据序列化为[]byte应该由抽象层处理,因为不同的底层持久性引擎将使用不同的数据表示形式。例如,考虑一个整数和它的字节序。

因此,我会将您的界面的签名更改为以下内容:

type Recorder interface {
    SelectByKey(interface{}) error
    DeleteByKey(interface{}) error
    Insert(interface{}, interface{}) error
    Update(interface{}, interface{}) error
}

这样你也可以panic在内部,如果给定的密钥不是特定实现的正确类型,请说SelectKey。如果你预先序列化你的密钥并且会导致麻烦,那就不可能了。

答案 1 :(得分:0)

我认为你需要这样的东西:

https://github.com/qiangxue/golang-restful-starter-kit

  

此入门套件旨在帮助您启动并运行项目   最适合在Go中开发RESTful服务的结构。套件   促进遵循SOLID原则和最佳实践   鼓励写清楚和惯用的Go代码。

     

该套件提供开箱即用的以下功能

     

广泛接受的格式标准CRUD中的RESTful端点   数据库表的操作基于JWT的认证应用程序   通过环境变量和配置文件进行配置   结构化日志记录与上下文信息恐慌处理和   正确的错误响应生成自动DB事务处理   数据验证完整的测试覆盖率