我打算在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
}
关于如何分离概念,或者如何从另一个项目调用以前的代码的任何建议?
答案 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事务处理 数据验证完整的测试覆盖率