我打算在 Go 中创建一个项目,但我想分开我的层。我的目标是创建一个包含类似于 DAO 模式的代码的包,即我希望我的调用者只与服务的接口(interface)(可能是另一个项目)而不是与实现进行通信。这是为了避免将来数据库发生更改的情况,调用者不应更改,并且应对此更改透明。
我正在考虑创建一个项目数据库,其中包含一个名为 persistence 的文件以及一个包 persistence
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
}
关于如何进行这种概念分离,或者应该如何从另一个项目调用以前的代码,有什么建议吗?
最佳答案
您走在正确的轨道上,但不同的持久化机制将使用不同的键类型(例如,oracle 中的整数和 mongo 中的类似字符串的标识符)。
将数据序列化为 []byte
应该由抽象层处理,因为不同的底层持久化引擎将使用不同的数据表示形式。例如,考虑一个整数及其字节顺序。
因此,我会将您的界面签名更改为以下内容:
type Recorder interface {
SelectByKey(interface{}) error
DeleteByKey(interface{}) error
Insert(interface{}, interface{}) error
Update(interface{}, interface{}) error
}
这样你也可以在里面panic
,如果给定的键不是特定实现的正确类型,比如SelectKey
。如果您事先序列化您的 key 并且会导致麻烦,这是不可能的。
关于go - Go中数据的分层抽象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22999131/