Go 从DDD的角度来看,如何处理特定于DB的类型?
我正试图在我的项目中实现DDD,并将Firestore用作我的持久性基础设施。Go中的Firestore有一些特定类型,如Go 从DDD的角度来看,如何处理特定于DB的类型?,go,design-patterns,google-cloud-firestore,domain-driven-design,Go,Design Patterns,Google Cloud Firestore,Domain Driven Design,我正试图在我的项目中实现DDD,并将Firestore用作我的持久性基础设施。Go中的Firestore有一些特定类型,如*Firestore.DocumentRef 我认为我应该把它放在我的实体结构中,因为它应该代表我的模型,但我的实体也应该是db不可知的(我认为) 那么,我应该如何从DDD的角度处理这个实体/结构: type Holder结构{ SocialReason字符串`firestore:“social_reason”json:“social_reason”` 联系人值。联系人`fi
*Firestore.DocumentRef
我认为我应该把它放在我的实体结构中,因为它应该代表我的模型,但我的实体也应该是db不可知的(我认为)
那么,我应该如何从DDD的角度处理这个实体/结构:
type Holder结构{
SocialReason字符串`firestore:“social_reason”json:“social_reason”`
联系人值。联系人`firestore:“联系人”json:“联系人”`
位置值。位置`firestore:“位置”json:“位置”`
SubmissionDatetime.time`firestore:“submission\u datetime”json:-“`
UpdateDatetime.time`firestore:“update_datetime”json:-“`
状态字符串`firestore:“状态”json:“状态”`
LastModifier*firestore.DocumentRef`firestore:“最后一个修饰符”json:-“`
CEP字符串`firestore:“CEP,省略空”json:“CEP,省略空”`
国家字符串`firestore:“国家”json:“国家”`
区域字符串`firestore:“区域,省略空”json:“区域,省略空”`
城市字符串`firestore:“城市,省略空”json:“城市,省略空”`
}
您应该避免在您的领域中出现任何特定于实现的技术选择,除非-可能,但不可能-它们确实是所述领域普遍存在的语言的一部分(在您的示例中似乎并非如此)
有一个关于使用Golang实现DDD的很棒的博客系列,随着该系列引入更多与DDD相关的概念,附带的代码库也在不断发展。检查示例
您可以直接从这段代码中学习,因为他们还在其体系结构中使用Firebase作为存储实现之一。它们还具有SQL和InMemory(用于测试)存储实现
那么,它们如何表示存储库impl之外的firestore.DocumentRef
?嗯,作为一个简单的字符串
。例如见
/内部/users/firestore.go
类型db struct{
firestoreClient*firestore.Client
}
func(d db)GetUser(ctx context.context,userID字符串)(UserModel,错误){
doc,err:=d.UserDocumentRef(userID).Get(ctx)
//获取用户模型的更多内容。
}
重要的是要注意,对于用户管理,他们不使用DDD,而是使用基本CRUD(使用简单的用户管理用例,他们选择放弃DDD带来的额外复杂性)
完整的DDD设计示例在培训师和培训领域。这里有一点更复杂(例如,在处理事务时),所以我引用了这篇文章来解释这些概念
但您可以清楚地看到域概念(存储库接口)和实现(存储库适配器)之间是如何划分的。例如,在培训领域,实施Hour
:
- /内部/培训师/域/小时/存储库.go-->
- /内部/培训师/适配器/小时\u firestore\u repository.go-->